Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 08:23   #1
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию Обработка данных

Всем привет. Нужна помощь.
Пишу редактор для игры
после парсинга нужно обработать данные и вывести в ComboBox
как это можно сделать? В интернете искал там только по обработке баз данных и Excel
Вот собственно код. (Изучаю дельфи не так давно)
Код:
unit Unit9;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit1;

type
TEle1 = record
wordArray : Array[Word] of Integer;
end;

type
TForm9 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
TEle1 : TEle;
{ Private declarations }
public
{ Public declarations }
end;

var
Form9: TForm9;

implementation

{$R *.dfm}

procedure TForm9.Button1Click(Sender: TObject);
var
wordArray : Array[Word] of Integer;
begin
if OpenDialog1.Execute then
begin
if not FileExists(opendialog1.FileName) then exit;
begin
//Создаем поток
TEle1:=Tele.Create(True);
//освободить память по завершению
TEle1.FreeOnTerminate:=True;
//Запускаем поток
Tele1.Resume;
end;
end;

end;

end.
Открытие файла-> создается поток-> записывается байты в массив -> происходит парсинг ->

закрываем поток -> обрабатываем данные(Заносим в ComboBox) вот последовательность действий создания



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.10.2012 в 08:31.
nefakt вне форума Ответить с цитированием
Старый 29.10.2012, 08:37   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вообще кошмар и тихий ужас, начиная от описания типа записи TEle1 , который нигде не используется, продолжая переменной, которая имеет имя такое же, как неиспользуемый тип, дальше использование таинственного класса TEle (предполагаю, что этот класс описан в Unti1)
и заканчивая огромным жутким статическим массивом wordArray : Array[Word] of Integer;

ЗАЧЕМ всё это?!!

да и что значит "обработка" ?! мне нужно обработать файл - это что с ним нужно сделать?! При чём здесь ComboBox ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2012, 08:45   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Код:
type
TEle1 = record
wordArray : Array[Word] of Integer;
end;
Код:
private
TEle1 : TEle;
Код:
//Создаем поток
TEle1:=Tele.Create(True);
Ничего странного Вам не показалось ?

Напишите про _задачу_, а не XYZ

Судя по написанной последовательности в конце поста, Вам надо читать файл каким-либо образом (Вы, по идее задействовали поток, только он почему-то у Вас с записью-Record смешан) и потом данные из него обрабатывать, я, собственно, не вижу ни того , ни того.
phomm вне форума Ответить с цитированием
Старый 29.10.2012, 09:20   #4
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Я так и думал то что намудрил. Мне нужно открыть файл формата .data в нем содержится около 150 листов которые должны храниться в combobox`е при выборе одного из листа в ListBox должны выводиться N количество строк при нажатии на строку в другой ListBox открываются значения данной строки. Вот сам файл
Порядок создания узнавал на форуме самой игры, порядок описал выше из-за этого мне и нужно что бы после всех действий листы выводились в ComboBox .
Если вам не сложно примерный код можете написать для открытия именно листов. Есть структура самого файла.
nefakt вне форума Ответить с цитированием
Старый 29.10.2012, 09:50   #5
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Есть ещё другой исходной код но он открывает только 1 лист и сам код неахти.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

  type
  TList1 = record
    id:integer;
    name: array [0..63] of byte;
    int1:integer;
    int2:integer;
    int3:integer;
    int4:integer;
 end;

type
  TForm1 = class(TForm)
     Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    ListBox1: TListBox;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure ListBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
  ListPos: array [1..4] of Integer;  // сюда сохраняем смещения листa
  ListLen: array [1..4] of Integer;  // сюда сохраняем количество элементов
  ffile: tStream;
  procedure OpenList1(lb: TListBox); // это у нас собс-но открытие первого листа
  procedure FillListPos; // это будет заполнение листа
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  List1: array of TList1;


procedure TForm1.OpenList1(lb: TListBox);
var
  num: integer;
  w: widestring;
begin
  num := lb.ItemIndex;
  Edit1.Text:=IntToStr(List1[num].id);
  SetLength(w, 32);
  Move(List1[num].name[0], w[1], 64);
  Edit2.Text:=w;
  Edit3.Text:=IntToStr(List1[num].int1);
  Edit4.Text:=IntToStr(List1[num].int2);
  Edit5.Text:=IntToStr(List1[num].int3);
  Edit6.Text:=IntToStr(List1[num].int4);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  ws: WideString;
begin
  if OpenDialog1.Execute then  begin
    if not FileExists(opendialog1.FileName) then exit;

    if Assigned(fFile) then
    begin
      FreeAndNil(fFile);
    end;
    // Создаем поток
    fFile := TFileStream.Create(OpenDialog1.FileName, (fmOpenReadWrite{or fmShareExclusive}));

    // Заполняем массив с позициями
    FillListPos;

    // Читаем лист 1
    SetLength(ws, 32);
    fFile.Position := ListPos[1]+4;
    SetLength(List1, ListLen[1]);
    fFile.Read(List1[0], ListLen[1]*SizeOf(TList1));
    for i := 0 to ListLen[1] - 1 do
    begin
      Move(List1[i].name, Pointer(ws)^, 64);
      ListBox1.Items.Add(IntToStr(List1[i].id) + ' - ' + ws);
    end;
  end;
end;

procedure TForm1.FillListPos;
var
  fListLen: Integer;
begin
(*
== подсчет смещений каждого последующего листа ==
8 это смещение первого листа.
8 + 4 + размер первого листа = смещение второго листа.
смещение второго листа + 4 + размер второго листа = смещение третьего, и т.д.
*)
  ListPos[1] := 8;
  if Assigned(fFile) then begin
    fFile.Position := ListPos[1]; // устанавливавем маркер в позицию начала Листа1
     fFile.Read(fListLen, SizeOf(fListLen)); // Считываем количество элементов
     ListLen[1] := fListLen;
    ListPos[2] := ListPos[1] + ListLen[1]*SizeOf(TList1) + 4; // получаем смещение второго листа
   end;
end;


// -------------------------------------------------------- //






procedure TForm1.ListBox1Click(Sender: TObject);
begin
  openlist1(listbox1);
end;

end.



___________
ВНИМАНИЕ!!!
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.10.2012 в 10:47.
nefakt вне форума Ответить с цитированием
Старый 29.10.2012, 13:01   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Код:
SetLength(ws, 32);
    fFile.Position := ListPos[1]+4;
    SetLength(List1, ListLen[1]);
    fFile.Read(List1[0], ListLen[1]*SizeOf(TList1));
    for i := 0 to ListLen[1] - 1 do
    begin
      Move(List1[i].name, Pointer(ws)^, 64);
Вот этот код надо переделать для чтения всех листов. Прописать циклы, высчитать размеры читаемых буферов и т.п. Сами данные в памяти программы тоже создать в виде массивов. Либо использовать подход который сейчас - хранить смещения и размеры данных в файле и каждый раз из читать.
Самое главное - читать отдельно, записывать в визуальные компоненты отдельно! иначе Вы замучаетесь в такой Базе Данных хоть как-то управляться... 35 мб конфигов это очень немало.

У Вас должно быть Всё очень строго по формату файла. Общая схема работы: Прочитали заголовки, создали динамические хранилища, начали читать порции из файла в эти хранилища. Как прочитали всё, начали заполнять визуальные компоненты - комбобоксы и листбоксы (там для уменьшения тормозов можно использовать Lines.BeginUpdate и Lines.EndUpdate) - сделать это отдельной функцией. При изменении текущей записи в комбобоксе Вам ведь надо будет перезаполнить листбоксы - вот эта функция и будет это делать.

Ну, а вообще, задача, наверное, не для Вас, если у Вас с готовым описанием формата сложности, то лучше бы Вам сперва поучить мануалы/учебники по операциям с файлами и данными, тем более с TStream, а уж только потом приступать к реальной и сложной задаче (этой).

Последний раз редактировалось phomm; 29.10.2012 в 13:04.
phomm вне форума Ответить с цитированием
Старый 30.10.2012, 09:36   #7
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Все спасибо разобрался есть ещё вопрос как данный код сделать что бы он не в edit показывался по отдельности как тут а сразу все в ListBox`е?
Код:
  num := lb.ItemIndex;
  Edit1.Text:=IntToStr(List1[num].id);
  SetLength(w, 32);
  Move(List1[num].name[0], w[1], 64);
  Edit2.Text:=w;
  Edit3.Text:=IntToStr(List1[num].int1);
  Edit4.Text:=IntToStr(List1[num].int2);
  Edit5.Text:=IntToStr(List1[num].int3);
  Edit6.Text:=IntToStr(List1[num].int4);
что бы показывалась не как тут по edit`ам

А как тут в ListBox`е



Заранее спасибо

А вот ещё кусок из записи
Код:
  type
  TList1 = record
    id:integer;
    name: array [0..63] of byte;
    int1:integer;
    int2:integer;
    int3:integer;
    int4:integer;
 end;

Последний раз редактировалось nefakt; 30.10.2012 в 09:39.
nefakt вне форума Ответить с цитированием
Старый 30.10.2012, 10:13   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Это не листбокс, это что-то типа DBGrid , что может говорить о том, это как раз и есть база данных, и лучше с ней общаться не на файловом уровне, а на компонентах соответствующих.
Ну а если надо, то берите и записывайте в Tstringgrid (листбокс редактировать не позволит, а у грида есть Options-goEditing) - также почти как в эдиты в коде, а на форме будет выглядеть табличкой.
Код:
stringgrid1.Cells[0, 2]:=IntToStr(List1[num].int1);
Погуглил эту Вашу прогу, мда.. как всегда ммо.. не надоедает этим заниматься ? лучше бы программирование улучшали.. имхо, конечно.

Последний раз редактировалось phomm; 30.10.2012 в 10:16.
phomm вне форума Ответить с цитированием
Старый 30.10.2012, 11:09   #9
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Спасибо попробую. Ну я Администратор сервера был. Сейчас хочу новый сервер открыть но нужен редактор с большим функционалом чем шаровые а есть платные конечно, ну хочется сделать самому + программированию учусь считай две пользы сразу.
nefakt вне форума Ответить с цитированием
Старый 30.10.2012, 12:51   #10
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

У меня ещё один последний вопрос как мне сделать
подсчет смещений каждого последующего листа ==
8 это смещение первого листа.
8 + 4 + размер первого листа = смещение второго листа.
смещение второго листа + 4 + размер второго листа = смещение третьего, и т.д.
Код:
*)
  ListPos[1] := 8;
  if Assigned(fFile) then begin
    fFile.Position := ListPos[1]; // устанавливавем маркер в позицию начала Листа1
     fFile.Read(fListLen, SizeOf(fListLen)); // Считываем количество элементов
     ListLen[1] := fListLen;
    ListPos[2] := ListPos[1] + ListLen[1]*SizeOf(TList1) + 4; // получаем смещение второго листа
   end;
И как мне узнать размеры 2-ого листа и смещение 2-ого листа?
Заранее спасибо
nefakt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка данных chipesca Microsoft Office Excel 0 25.05.2012 01:14
Обработка данных grichanuk Microsoft Office Excel 2 20.06.2011 12:36
Обработка данных Мигель Microsoft Office Excel 11 16.04.2011 16:47
Обработка данных из БД andozag C/C++ Базы данных 1 24.03.2011 23:38
Обработка данных beztrud БД в Delphi 1 11.03.2011 21:49