Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизСохранение массива. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c