Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-16565
nester
2003-11-22 11:45
2004.02.06
Как распаковать PostData в TWebBrowser е


4-16834
vitalmoya
2003-12-01 23:03
2004.02.06
Название, класа по идентификатору


1-16503
Легионер
2004-01-28 17:13
2004.02.06
Скорость :(


14-16658
raidan
2004-01-01 22:23
2004.02.06
Прикольно у вас тут :)


6-16568
Sil
2003-12-01 17:59
2004.02.06
Моделирование сетей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский