Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Сохранение массива.   Найти похожие ветки 

 
Andy BitOff ©   (2004-07-07 17:45) [0]

Здравствуйте, уважаемые.
Возникли проблемы при реализации алгоритма сохранения массива  в файл. Никак не могу дойти КАК?

type
 TDirection = (Up, Down);

type
 TActionForPrint = (OpenFilePR, AllPrint, CurrentPrint, RangePrint);

type
 TRangeSeting = Record
   CurrentPage : integer;
   RangeStart : integer;
   RangeEnd : integer;
   Direction : TDirection;
 end;

type
 TPrintHistory = Record
   DataT : TDateTime;
   PrinterIndex : integer;
   OpenedFile : string;
   Action : TActionForPrint;
   RangeSeting : TRangeSeting;
 end;

var
 HistoryAr: array of TPrintHistory;


Хочу сохранить HistoryAr в файл в виде; размер поля, значение. Сначала хочу все переписать в массив ms : array of Byte; Должно получиться так; DataT сохраняется как 8, дальше 8 байт Double (соответственно дата), затем PrinterIndex – 4, 0,0,0,1 (если соответственно PrinterIndex:=1) и т.д. по всем полям. Но чего-то туплю. Все чего достиг:

 CurSize:=0;
 for i:=0 to Length(HistoryAr)-1 do begin
   SizeItem:=SizeOf(HistoryAr[i].OpenedFile); // тут уже не верно
   SetLength(ms,SizeItem);
   // дальше думаю надо копировать по байту в массив ms, но туплю :(
 end;


 
Smithson ©   (2004-07-07 17:51) [1]

Зачем так сложно.
Сохраняй в нетипизированный файл (Rewrite(F, 1).
Для типов с известной длиной длину можно и не хранить. А вот для строк - обязательно, увеличишь потом скорость чтения, не придется читать побайтно и искать #0.

Чтение аналогично - порядок следования данных знаешь, читай их себе...


 
Тимохов ©   (2004-07-07 17:52) [2]

sizeof(string) = 4


 
Тимохов ©   (2004-07-07 17:52) [3]

т.к. строка (ansistring) есть указатель


 
Andy BitOff ©   (2004-07-07 17:55) [4]


>Тимохов ©   (07.07.04 17:52) [3]


:) Так я это понимаю. Поэтому и пишу, что не верно.


 
Digitman ©   (2004-07-07 17:55) [5]


>    SizeItem:=SizeOf(HistoryAr[i].OpenedFile); // тут уже
> не верно


потому что тип String - динамический, и данные этого типа представляют собой 4-байтовый указатель

для сохранения данных типа String следует сначала сохранить Integer-значение strsize = Length(HistoryAr[i].OpenedFile), а следом - данные из буфера, адрес которого равен PChar(HistoryAr[i].OpenedFile), а длина буфера равна strsize


 
Andy BitOff ©   (2004-07-07 18:00) [6]


>Smithson ©   (07.07.04 17:51) [1]
Зачем так сложно.


Так сложно потому, что это потом надо в реестр сохранить.


 
Digitman ©   (2004-07-07 18:11) [7]


> Andy BitOff ©   (07.07.04 18:00) [6]


именно в реестр ? и именно в бинарном виде ?
в реестр вообще-то не есть корошо записывать всякий хлам, на то есть файлы, в т.ч. - INI

но если уж приспичило и при этом необязательно хранение данных массива именно в бин.виде, то во всех эти премудростях попросту отпадает необходимость, если воспользоваться классом TRegIniFile - там есть методы для записи любых данных простых типов, и строки там записываются методом WriteString()



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
14-1088320968
georg
2004-06-27 11:22
2004.07.18
Delphi 8


1-1088841499
clampo
2004-07-03 11:58
2004.07.18
Проблема с лабелом


1-1089026900
MyName
2004-07-05 15:28
2004.07.18
SAVEKEY


1-1088926647
MyName
2004-07-04 11:37
2004.07.18
Реестр, SaveKey


1-1089114563
Артем К.
2004-07-06 15:49
2004.07.18
Можно ли отменить всплывающее меню у Edita?