Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Вниз
Запись динамического массива в файл Найти похожие ветки
← →
Злой!!! (2002-08-30 12:15) [0]Господа мастера! Подскажите как записать динамический массив объектов в файл, а то у меня вместо значений, в файл записываются указатели. Я объявляю:
smeta: array of TSmeta;
smFile: file of TSmeta;
TSmeta - это класс. При записи пишу:
for i:=0 to High(Smeta) do
begin
write(smFile,smeta[i]);
end;
Спасибо.
← →
Smithson (2002-08-30 12:25) [1]Попробуй, когда открываешь файл - Reset(smFile, [b]1[/b]);
← →
Виктор Щербаков (2002-08-30 12:30) [2]Smithson © (30.08.02 12:25)
Дело не в этом. array of TSmeta - это массив указателей на экземпляры класса TSmeta.
← →
Skier (2002-08-30 12:32) [3]>Злой!!!
Я так понял что тебе нужно записать свойства
объектов в файл. Для этого ты сначала посмотри, как
в Delphi организованы классы TReader и TWriter - очень
поучительно, знаешь ли...
← →
Opuhshii (2002-08-30 12:46) [4]мда,.. ну и что?,..
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 под рукой нет,.. но такое кажеться было,... !!! (не факт)),,.
либо... либо ручками,..
← →
Iliaser (2002-08-30 12:47) [5]
write(smFile,smeta[i]);
Записывает в файл кусок памяти расположенный по адресу
@smeta[i] размером в sizeof(TSmeta) байт. Следовательно
если в структуре у тебя есть поле указатель на что либо
то в файл будет записано значение этого указателя а не
данные на которые этот указатель указывает.
← →
PVOzerski (2002-08-30 13:57) [6]либо переделать tSmeta из class в object, взять из OWL от BP tFileStream, подправить его для 32-разрядности (предупреждаю: работа огромная) и работать через него, либо писать тем или иным способом интересующие вас поля отдельно. Во 2-м случае могу порекомендовать собрать эти поля (для property это не подойдет) в одно поле-record. А еще в модуле Classes есть функции ReadComponentResFile и WriteComponentResFile для классов-наследников tComponent. Я их не пробовал, но предполагаю, что если tSmeta сделать компонентом, то они могут оказаться тем, что надо.
← →
Skier (2002-08-30 14:01) [7]>PVOzerski
> что если tSmeta сделать компонентом
А это зачем ?
← →
PVOzerski (2002-08-30 15:33) [8]>> что если 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 15:40) [9]>PVOzerski
Ага. Значит я тебя не понял я то думал что ты
под фразой "tSmeta сделать компонентом" имел ввиду как раз
инсталлирование, регистрирацию и т.п.
IMHO, автору вопроса нужно сделать свою tSmeta потомком tComponent и опубликовать необходимые свойства. И будет ему счастье :))
← →
Злой!!! (2002-08-30 16:20) [10]Всем, спасибо, работает - по совету Opuhshii записываю свойства ручками... К сожалению остальные способы мне пока непонятны :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c