![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реинициализация компонентов
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).