![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись динамического массива в файл [D6, WinXP]
Злой!!! © (2002-08-30 12:15:00)Господа мастера! Подскажите как записать динамический массив объектов в файл, а то у меня вместо значений, в файл записываются указатели. Я объявляю:
smeta: array of TSmeta;
smFile: file of TSmeta;
TSmeta - это класс. При записи пишу:
for i:=0 to High(Smeta) do
begin
write(smFile,smeta[i]);
end;
Спасибо.
Злой!!! (2002-08-30 16:20:00) [1]Всем, спасибо, работает - по совету Opuhshii записываю свойства ручками... К сожалению остальные способы мне пока непонятны :(
Skier (2002-08-30 15:40:00) [2]>PVOzerski
Ага. Значит я тебя не понял я то думал что ты
под фразой "tSmeta сделать компонентом" имел ввиду как раз
инсталлирование, регистрирацию и т.п.
IMHO, автору вопроса нужно сделать свою tSmeta потомком tComponent и опубликовать необходимые свойства. И будет ему счастье :))
PVOzerski (2002-08-30 15:33:00) [3]>> что если tSmeta сделать компонентом
Да просто Help почитал, а там описалово на функции такое:
WriteComponentResFile procedure
Writes components and their properties to a file using a Windows resource file format.
procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
ReadComponentResFile function
Reads components and their properties from a specified Windows resource file.
function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
Вроде бы то, что надо, но параметр Instance должен быть совместим с tComponent. Из чего совершенно не следует, что его надо инсталлировать, регистрировать и т.п.
Skier (2002-08-30 14:01:00) [4]>PVOzerski
> что если tSmeta сделать компонентом
А это зачем ?
PVOzerski (2002-08-30 13:57:00) [5]либо переделать tSmeta из class в object, взять из OWL от BP tFileStream, подправить его для 32-разрядности (предупреждаю: работа огромная) и работать через него, либо писать тем или иным способом интересующие вас поля отдельно. Во 2-м случае могу порекомендовать собрать эти поля (для property это не подойдет) в одно поле-record. А еще в модуле Classes есть функции ReadComponentResFile и WriteComponentResFile для классов-наследников tComponent. Я их не пробовал, но предполагаю, что если tSmeta сделать компонентом, то они могут оказаться тем, что надо.
Iliaser (2002-08-30 12:47:00) [6]
write(smFile,smeta[i]);
Записывает в файл кусок памяти расположенный по адресу
@smeta[i] размером в sizeof(TSmeta) байт. Следовательно
если в структуре у тебя есть поле указатель на что либо
то в файл будет записано значение этого указателя а не
данные на которые этот указатель указывает.
Opuhshii (2002-08-30 12:46:00) [7]мда,.. ну и что?,..
Pointer types—whether implicit or explicit—are not allowed, so a file cannot contain dynamic arrays, long strings, classes, objects, pointers, variants, other files, or structured types that contain any of these.
тут я вижу два варианта,. либо ваша TSmeta = class(TComponent)..,
там есть imho SaveToStream для published (D6 под рукой нет,.. но такое кажеться было,... !!! (не факт)),,.
либо... либо ручками,..
Skier (2002-08-30 12:32:00) [8]>Злой!!!
Я так понял что тебе нужно записать свойства
объектов в файл. Для этого ты сначала посмотри, как
в Delphi организованы классы TReader и TWriter - очень
поучительно, знаешь ли...
Виктор Щербаков (2002-08-30 12:30:00) [9]Smithson © (30.08.02 12:25)
Дело не в этом. array of TSmeta - это массив указателейна экземпляры класса TSmeta.
Smithson (2002-08-30 12:25:00) [10]Попробуй, когда открываешь файл - Reset(smFile, [b]1[/b]);