Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1086194606
iat
2004-06-02 20:43
2004.07.18
Как определить в рантайме отключение клавиатуры и мыши


3-1087988695
nik7777
2004-06-23 15:04
2004.07.18
Вопрос по репликации


1-1089145547
Огромное Кулясищще
2004-07-07 00:25
2004.07.18
Показать неглавное окно


1-1088754663
NeyroSpace
2004-07-02 11:51
2004.07.18
Можно ли при помощи TApplication организовать главный цикл


1-1089019622
serg128
2004-07-05 13:27
2004.07.18
Как отследить нажатие клавиши на клавиатуре?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский