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

Вниз

Продолжаем разбираться в записи / чтении из ресурса   Найти похожие ветки 

 
Вомбат   (2004-01-22 16:53) [0]

Проблема вот какая:

Беру CheckListBox и сохраняю его:

begin
aStream:= TFileStream.Create("1.res",fmCreate);

try

aStream.Seek(0, soFromBeginning);
aStream.WriteComponent(CheckListBox1);

except
end;

aStream.Free;
end;

Сохраняется отлично. Затем, произвожу чтение из файла способом:

begin

aStream:= TFileStream.Create("1.res",fmOpenRead);

try

FreeAndNil(CheckListBox1);
CheckListBox1:= TCheckListBox.Create(nil);
CheckListBox1:= TCheckListBox(aStream.ReadComponent(nil));
CheckListBox1.Parent:= Self;

except
end;

aStream.Free;

end;

В случае, когда CheckListBox1 был пустой и не содержал в себе Item"ов все проходит отлично. В противном случае на CheckListBox1:= TCheckListBox(aStream.ReadComponent(nil)) вылетает ошибка Component CheckListBox1 has no parent window.

В чем моя ошибка и как ее исправить?


 
MBo ©   (2004-01-22 16:55) [1]

В каком месте программы производится чтение?


 
Вомбат   (2004-01-22 16:57) [2]

2 MBo
подвешено на событие on click кнопочки Load


 
MBo ©   (2004-01-22 17:00) [3]

так строчки поменять местами не поможет?
CheckListBox1.Parent:= Self;
CheckListBox1:= TCheckListBox(aStream.ReadComponent(nil));


 
Вомбат   (2004-01-22 17:01) [4]

2 MBo

нет. пробовал.


 
Вомбат   (2004-01-22 17:17) [5]

Ответ найден: все дело в методе

aStream.ReadComponent

читаем хелп:
If Instance is nil (Delphi) or NULL (C++), ReadComponent constructs a component based on the type information in the stream and returns the newly-constructed component.

Если Instance = nil то процедура формирует НОВЫЙ лысый компонент
естественно без указателя на окно. И добавление в него Items вызывает ошибку (почему я пока не разобрался). Поэтому нужно писать не

FreeAndNil(CheckListBox1);
CheckListBox1:= TCheckListBox.Create(nil);
CheckListBox1:= TCheckListBox(aStream.ReadComponent(nil));
CheckListBox1.Parent:= Self;

а

FreeAndNil(CheckListBox1);
CheckListBox1:= TCheckListBox.Create(nil);

CheckListBox1.ParentWindow:= Self.Handle;
CheckListBox1:= TCheckListBox(aStream.ReadComponent(CheckListBox1));
CheckListBox1.Parent:= Self;


 
Юрий Зотов ©   (2004-01-22 17:18) [6]

F1 - TStream.ReadComponent:

If Instance is nil, ReadComponent constructs a component based on the type information in the stream and returns the newly-constructed component.

Таким образом, при чтении у Вас создается новый компонент, а предыдущее "ручное" создание не дает ничего, кроме утечки памяти. Соответственно, назначение Parent"а этоиу предыдущему экземпляру тоже ничего не дает, а вот созданный при чтении экземпляр остается без Parent"а (поскольку он сохранялся отдельно). Отсюда и ошибка.

Попробуйте так:

CheckListBox1.Free;
CheckListBox1 := TCheckListBox.Create(Self);
CheckListBox1.Parent := Self;
aStream.ReadComponent(CheckListBox1);


 
Вомбат   (2004-01-22 17:28) [7]

2 Юрий Зотов

уже нашел сам но всеравно спасибо :)



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

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

Наверх




Память: 0.48 MB
Время: 0.021 c
1-16221
Babay
2004-01-26 07:49
2004.02.06
XPmanifest и Dll (большой ворос)


7-16756
Prof
2003-11-19 10:55
2004.02.06
Информация о компьютере.


1-16499
kaginava
2004-01-27 15:05
2004.02.06
FileMode


14-16677
gishu
2003-12-29 08:50
2004.02.06
SFX на KOL


3-16075
jeka_t
2004-01-16 10:37
2004.02.06
TreeView & Table