Главная страница
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.022 c
3-16119
Alex-kosmonavt
2004-01-15 18:56
2004.02.06
Не вводится русский язык


6-16552
Паша Т
2003-12-02 21:42
2004.02.06
IdFTP


3-16040
RUYurik
2004-01-13 05:59
2004.02.06
Лицензия для InterBase 7.0


6-16554
Delphi5.01
2003-11-30 22:08
2004.02.06
блокируется Интернет при использовании компонента IdHttp


14-16602
Hermit
2004-01-15 13:41
2004.02.06
Казино. Оазис-покер. Стрейт флеш