Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реинициализация компонентов


down ©   (2002-12-29 15:10:00) 

Как реинициализировать (загрузить заново все свойства, заданные при создании формы) какой-нибудь отдельный компонент?


Юрий Зотов   (2002-12-29 19:28:00) [1]

"Мы с тобой одной крови - ты и я".
(С) Маугли.


vuk   (2002-12-29 19:20:00) [2]

Ну это я и имел в виду под "шарить вручную". Ну ленивый я. :o)


Юрий Зотов   (2002-12-29 19:09:00) [3]

Не совсем. Поток не запишет дефолтные значения, а ручками можно скопировать всё.

А зачем шарить по таблицам? GetPropList с tkAny, а потом в простом цикле GetPropValue - SetPropValue. И все. Строк в 20, наверное, поместится.


vuk   (2002-12-29 18:56:00) [4]

С потоком как раз и получается RTTI, только вручную по таблицам шарить не надо. :o)


Юрий Зотов   (2002-12-29 18:50:00) [5]

А поскольку Assign, увы, далеко не всегда реализован на все 100, то, значит, остается RTTI.


vuk   (2002-12-29 17:54:00) [6]

Ну так этот подводный камень в обоих случаях может появиться. В первом варианте, опять же, все от того зависит, как Assign реализован.


Юрий Зотов   (2002-12-29 17:47:00) [7]

Да, это хороший способ. Но есть, IMHO, подводный камень - могут возникнуть проблемы с восстановлением дефолтных значений свойств (они не запишутся из Comp, а следовательно и не восстановятся в AComponent). Чтобы все было точно, следовало бы перед чтением пересоздать AComponent, но тогда потеряются внешние ссылки на него (сработает механизм уведомлений).


down   (2002-12-29 15:41:00) [8]

Спасибо, Алексей!


vuk   (2002-12-29 15:35:00) [9]

В принципе можно сделать немного иначе (тогда не важно, насколько поддерживается Assign):

procedure TForm1.ReloadComponent(AComponent: TComponent);
var
Comp : TComponent;
begin
with TForm1.Create(nil) do
try
Comp := FindComponent(AComponent.Name);
if Comp <> nil then
with TMemoryStream.Create do
try
WriteComponent(Comp);
Position := 0;
ReadComponent(AComponent)
finally
Free;
end;
finally
Free;
end
end;


down   (2002-12-29 15:30:00) [10]

Спасибо, спасибо, спасибо!


Юрий Зотов   (2002-12-29 15:27:00) [11]

Лучше немного изменить 3-ю строку:

with TFormClass(ClassType).Create(nil) do...

Тогда будет работать с любой формой.


Юрий Зотов   (2002-12-29 15:25:00) [12]

Возможный вариант:

procedure Form1.ReloadComponent(AComponent: TComponent);
begin
with TForm1.Create(nil) do
try
AComponent.Assign(FindComponent(AComponent.Name))
finally
Free
end
end;

Сработает, если компонент полностью поддерживает Assign. Иначе надо назначать каждое свойство отдельно (через RTTI - см. модуль TypInfo, а в нем GetPropList и Get/SetPropValue).


Наверх

Титульная страница Поиск, карта сайта Написать письмо