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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 04:03   #21
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Вот программка , исходник и структура файла http://rghost.ru/41249382
Можешь ещё если не трудно написать код на открытие 2-ой страницы что бы я посмотрел.

Последний раз редактировалось nefakt; 31.10.2012 в 04:05.
nefakt вне форума Ответить с цитированием
Старый 31.10.2012, 04:23   #22
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

к примеру в конфиге в тех трех страницах что кинули, смещения
4,0,0 соответственно.

примерно идут листы так:
Код:
TElList1Element=record
 id:integer;
 name: array [0..31] of WideChar;
 int1:integer;
 int2:integer;
 int3:integer;
 int4:integer;
end;

TElList1=record
 offsetdata:array[0..3] of byte;
 data:array of TElList1Element;
end;

TElList2Element=record
 id:integer;
 name: array [0..31] of WideChar;
end;

TElList2=record
 data:array of TElList2Element;
end;
читаем.
//глобальные переменные
Код:
var version,sign:word;
  List1:TElList1;
  List2:TElList2;
//локальные переменные процедуры чтение
var count,i:integer;
begin
 //открыли файл и начинаем читать
 FS.Read(version,sizeof(version));//FS это поток наш
 if(version<>69) then //версия не та что мы ожидаем
 FS.Read(sign,sizeof(sign));//просто запомнить надо.
 //начинаем первый лист
 FS.Read(List1.offsetdata[0],Length(List1.offsetdata));
 FS.Read(count,sizeof(count));
 SetLength(List1.data,count);
 for i:=0 to count-1 do
  FS.Read(List1.data[i],sizeof(TElList1Element));
 //все, первый лист прочитан в память.
 //читаем второй лист(смещения нет).
 FS.Read(count,sizeof(count));
 SetLength(List2.data,count);
 for i:=0 to count-1 do
  FS.Read(List2.data[i],sizeof(TElList2Element));
то есть читаете подряд, не скача.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2012, 04:28   #23
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Ясно спасибо сейчас попробую если что отпишу.
Только как я понял так делать если листы открываются в ComboBox`е как в sELider но как я говорил выще я все листы хочу открывать отдельно. Если открыть ту прогу которую я кинул там видно что к каждому листу открывается свое окно.

Последний раз редактировалось nefakt; 31.10.2012 в 04:31.
nefakt вне форума Ответить с цитированием
Старый 31.10.2012, 04:37   #24
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

расшарить данные меж модулями и обращаться к ним из других.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2012, 04:45   #25
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Вот посмотрите я написал код открываю elements.data проходит пару секунд не чего не показывается потом вылетает ошибка.
Вот код уже с тем что вы написали.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ImgList, ComCtrls, sPageControl, acProgressBar,
  sButton, sListBox, sDialogs;
 type
 TElList1Element = record
 id:integer;
 name: array [0..31] of WideChar;
 int1:integer;
 int2:integer;
 int3:integer;
 int4:integer;
end;

TElList1=record
 offsetdata:array[0..3] of byte;
 data:array of TElList1Element;
end;

TElList2Element=record
 id:integer;
 name: array [0..31] of WideChar;
end;

TElList2=record
 data:array of TElList2Element;
end;

type
  TForm1 = class(TForm)
    sOpenDialog1: TsOpenDialog;
    sListBox1: TsListBox;
    sButton1: TsButton;
    sPageControl1: TsPageControl;
    sProgressBar1: TsProgressBar;
    sTabSheet1: TsTabSheet;
    sTabSheet2: TsTabSheet;
    sTabSheet3: TsTabSheet;
    sTabSheet4: TsTabSheet;
    sTabSheet5: TsTabSheet;
    ImageList1: TImageList;
    Image1: TImage;
    Image2: TImage;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    procedure sListBox1Click(Sender: TObject);
    procedure sButton1Click(Sender: TObject);
  private
  ListPos: array [1..4] of Integer;  // сюда сохраняем смещения листa
  ListLen: array [1..4] of Integer;  // сюда сохраняем количество элементов
  ffile: tStream;
  procedure OpenList1(lb: TListBox); // это у нас собс-но открытие первого листа
  procedure FillListPos; // это будет заполнение листа
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  ElList1Element: array of TElList1Element;
  version,sign:word;
  List1:TElList1;
  List2:TElList2;


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

procedure TForm1.sButton1Click(Sender: TObject);
var
  count, i, p: Integer;
  ws: WideString;
  version,sign:word;
begin
  if sOpenDialog1.Execute then  begin
    if not FileExists(sopendialog1.FileName) then exit;

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

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

    // Читаем лист 1
    p:=0;
   for i:=0 to 151 do     {организовываем цикл повторений равный 151}
      begin
        p:=p+1;  {при каждом выполнении переменная p будет увеличиваться на 1}
      end;
p:=151;
for i := 1 to p do  sProgressBar1.Position:=Round(100*i/p);
     ShowMessage(inttostr(i));  {elements.data загружена}
     Form1.Caption:='elements.data загружена'
  end;
//открыли файл и начинаем читать
 fFile.Read(version,sizeof(version));//FS это поток наш
 if(version<>69) then //версия не та что мы ожидаем
 fFile.Read(sign,sizeof(sign));//просто запомнить надо.
 //начинаем первый лист
 fFile.Read(List1.offsetdata[0],Length(List1.offsetdata));
 fFile.Read(count,sizeof(count));
 SetLength(List1.data,count);
 for i:=0 to count-1 do
  fFile.Read(List1.data[i],sizeof(TElList1Element));
 //все, первый лист прочитан в память.
 //читаем второй лист(смещения нет).
 fFile.Read(count,sizeof(count));
 SetLength(List2.data,count);
 for i:=0 to count-1 do
  fFile.Read(List2.data[i],sizeof(TElList2Element));
    begin
      Move(ElList1Element[i].name, Pointer(ws)^, 64);
      sListBox1.Items.Add(IntToStr(ElList1Element[i].id) + ' - ' + ws);
    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(TElList1Element) + 4; // получаем смещение второго листа
   end;
end;

procedure TForm1.sListBox1Click(Sender: TObject);
begin
  openlist1(slistbox1);
end;

end.
nefakt вне форума Ответить с цитированием
Старый 31.10.2012, 05:23   #26
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

    // Читаем лист 1
    p:=0;
   for i:=0 to 151 do     {организовываем цикл повторений равный 151}
      begin
        p:=p+1;  {при каждом выполнении переменная p будет увеличиваться на 1}
      end;
p:=151;
for i := 1 to p do  sProgressBar1.Position:=Round(100*i/p);
     ShowMessage(inttostr(i));  {elements.data загружена}
     Form1.Caption:='elements.data загружена'
  end;
это то выкините.

и для WideString сначала надо задать длину.
Код:
    begin
      Move(ElList1Element[i].name, Pointer(ws)^, 64);
      sListBox1.Items.Add(IntToStr(ElList1Element[i].id) + ' - ' + ws);
    end;
это выполняется лишь один раз ибо вне цикла
и надо бы так:
Код:
 SetLength(ws,lstrlenW(@ElList1Element[i].name[0]));
 Move(ElList1Element[i].name[0],ws[1],Length(ws)*2);
 sListBox1.Items.Add(IntToStr(ElList1Element[i].id) + ' - ' + ws);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2012, 06:02   #27
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Сделал как написали в итоге уже другая ошибка
"Project Projekt8.exe raised exeption class ERangeError with message 'Range check error'."
nefakt вне форума Ответить с цитированием
Старый 31.10.2012, 06:08   #28
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на какой строчке?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.10.2012, 06:19   #29
nefakt
Форумчанин
 
Регистрация: 25.10.2012
Сообщений: 161
По умолчанию

Не знаю у меня не чего не выделяется. Я нажимаю Break и ничего не происходит. А если нажму Continue потом в самой программе крестик то появляется вот это потом нажимаю ок и появляется это
nefakt вне форума Ответить с цитированием
Старый 31.10.2012, 06:21   #30
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

протрассируйте же...(через циклы проходят бряком, на первый оператор после цикла)
трассировка это построчное выполнение кода
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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