![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение массива. [D6, WinXP]
Andy BitOff © (2004-07-07 17:45:00)Здравствуйте, уважаемые.
Возникли проблемы при реализации алгоритма сохранения массива в файл. Никак не могу дойти КАК?
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;
Digitman (2004-07-07 18:11:00) [1]
> Andy BitOff © (07.07.04 18:00) [6]
именно в реестр ? и именно в бинарном виде ?
в реестр вообще-то не есть корошо записывать всякий хлам, на то есть файлы, в т.ч. - INI
но если уж приспичило и при этом необязательно хранение данных массива именно в бин.виде, то во всех эти премудростях попросту отпадает необходимость, если воспользоваться классом TRegIniFile - там есть методы для записи любых данных простых типов, и строки там записываются методом WriteString()
Andy BitOff (2004-07-07 18:00:00) [2]
>Smithson © (07.07.04 17:51) [1]
Зачем так сложно.
Так сложно потому, что это потом надо в реестр сохранить.
Andy BitOff (2004-07-07 17:55:00) [3]
>Тимохов © (07.07.04 17:52) [3]
:) Так я это понимаю. Поэтому и пишу, что не верно.
Digitman (2004-07-07 17:55:00) [4]
> SizeItem:=SizeOf(HistoryAr[i].OpenedFile); // тут уже
> не верно
потому что тип String - динамический, и данные этого типа представляют собой 4-байтовый указатель
для сохранения данных типа String следует сначала сохранить Integer-значение strsize = Length(HistoryAr[i].OpenedFile), а следом - данные из буфера, адрес которого равен PChar(HistoryAr[i].OpenedFile), а длина буфера равна strsize
Тимохов (2004-07-07 17:52:00) [5]sizeof(string) = 4
Тимохов (2004-07-07 17:52:00) [6]т.к. строка (ansistring) есть указатель
Smithson (2004-07-07 17:51:00) [7]Зачем так сложно.
Сохраняй в нетипизированный файл (Rewrite(F, 1).
Для типов с известной длиной длину можно и не хранить. А вот для строк - обязательно, увеличишь потом скорость чтения, не придется читать побайтно и искать #0.
Чтение аналогично - порядок следования данных знаешь, читай их себе...