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

Вниз

Проблема сохранения в файл   Найти похожие ветки 

 
RaZEr_   (2002-05-15 19:49) [0]

Есть запись, к примеру:

type
TMyRec = record
Btn: TTabSheet;
Enabled: Boolean;
end;

Нужно ее сохранить а потом загрузить, так чтобы Button на форме сохранился а потом появился после загрузки .

var
MyFile: file of TMyRec;

...

// Запись
procedure save(Ext: TMyRec);
begin
AssignFile(MyFile,"save.dat");
ReWrite(MyFile);
Seek(MyFile,FileSize(MyFile));
Write(MyFile,Ext);
CloseFile(MyFile);
end;

// Чтение
procedure load;
var
Test: TMyRec;
begin
AssignFile(MyFile,"save.dat");
ReSet(MyFile);
WHILE not eof(MyFile) DO Read(MyFile,Test);
CloseFile(MyFile);
end;


PS: При сохранении в файле подозрительно мало информации (~ на 20 кнопок около 100 байт) . А при загрузке вылетает Access Violation (Если смотреть дамп, в адресах памяти ничего не записано) .


 
Song   (2002-05-15 23:26) [1]

А с какой целью употреблён Seek() ?


 
Malder   (2002-05-15 23:47) [2]

Угу. ВО первых, непонятно зачем Seek.
Во вторых, на 20 кнопок около 100 байт - э-э-э, а где там массив кнопок храниться ?


 
Anatoly Podgoretsky   (2002-05-16 00:04) [3]

SizeOf(TMyRec)*20 ~100 байт. все в порядке


 
RaZEr   (2002-05-16 05:55) [4]

Я упростил код, а seek убрать забыл . Ну это тут не принципиально . Да и массив у меня не кнопок а куда сложнее . У меня эта запись состоит из пяти компонентов, а на 6 элементов этой записи пришлось 120 байт . Тут даже и споров быть не может что ничего толком не сохранилось :(

Если этот метод применять к записи состоящей из всяких string"ов, integer"ов ,- то все работает .

Может что с распределением памяти, ведь у меня вместо Ext :

MyArray: array [1..100] of TMyRec;

PS: А вообще можно так сохранять компоненты ? И если нет, то как лучше всего сохранить такую запись (TMyRec) .


 
MBo   (2002-05-16 07:12) [5]

работая таким образом с записями, содержащими объекты, длинные строки или динамические массивы, ты записываешь не сам объект, а УКАЗАТЕЛЬ на него, что смысла не имеет. Занимает он 4 байта, вот тебе и 100 получается. Писать такие поля надо руками, но вот что ты имеешь в виду под сохранением Tabsheet, можно только догадываться. Смотри в сторону Stream, для объектов - SaveToStream


 
RaZEr   (2002-05-18 05:17) [6]

Да я так и думал по началу делать . Но у меня запись с объектами . Получается что мне прийдется сохранять каждый из объектов отдельно ?!


 
MBo   (2002-05-18 07:54) [7]

можно и в один файл. Принцип такой - пишешь в TFileStream обыкновенные поля, а объекты сначала Savetostream(Memorystream),
а потом пишешь в filestream длину memorystream, и memorystream.position:=0 и filestream.copyfrom(memorystream)


 
RaZEr   (2002-05-19 07:44) [8]

Это я в курсе, я про то, что писанины будет на килобайты чтобы сохранить из записи каждый объект отдельно, а потом считать . Мне же не все свойства нужны, а только некоторые . Поэтому я подумал что лучше будет сохранять именно те свойства, которые мне нужно . Я просто думал, что прокатит если я record сохранять буду .


 
Anatoly Podgoretsky   (2002-05-19 10:38) [9]

Подход нормальный, если будешь сохранять свойства, а не уазатели, например если ты хочешь сохранять шрифт и положение чего то, то опиши запись примерно так

TMyRec = record
BtnX: Integer;
BtnY: Integer;
BtnFontName: ShortString;
BtnFontColor: Integer;
BtnFontSize: Integer;
...
end;

Но с другой стороны, нахрен в этом случае записи, не лучше ли будет использоват INI файл



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
3-97196
kserg@ukr.net
2002-05-07 17:36
2002.05.30
Кто работал с данными типа Time - подскажите


1-97302
Blacki
2002-05-19 10:19
2002.05.30
Проблемы с TDateTime


1-97328
relaxoid
2002-05-19 18:40
2002.05.30
Народ, как добывать кавычки к строке ( )?


1-97344
Dinara
2002-05-19 21:07
2002.05.30
Как прибить поток и им же порожденные?


6-97368
alexay
2002-03-20 12:57
2002.05.30
Передача письма из дельфи с текстом сообщения и прикрепленными файлами!