Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизПродолжаем разбираться в записи / чтении из ресурса Найти похожие ветки
← →
Вомбат (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.028 c