Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизРеинициализация компонентов Найти похожие ветки
← →
down (2002-12-29 15:10) [0]Как реинициализировать (загрузить заново все свойства, заданные при создании формы) какой-нибудь отдельный компонент?
← →
Юрий Зотов (2002-12-29 15:25) [1]Возможный вариант:
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).
← →
Юрий Зотов (2002-12-29 15:27) [2]Лучше немного изменить 3-ю строку:
with TFormClass(ClassType).Create(nil) do...
Тогда будет работать с любой формой.
← →
down (2002-12-29 15:30) [3]Спасибо, спасибо, спасибо!
← →
vuk (2002-12-29 15:35) [4]В принципе можно сделать немного иначе (тогда не важно, насколько поддерживается 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:41) [5]Спасибо, Алексей!
← →
Юрий Зотов (2002-12-29 17:47) [6]Да, это хороший способ. Но есть, IMHO, подводный камень - могут возникнуть проблемы с восстановлением дефолтных значений свойств (они не запишутся из Comp, а следовательно и не восстановятся в AComponent). Чтобы все было точно, следовало бы перед чтением пересоздать AComponent, но тогда потеряются внешние ссылки на него (сработает механизм уведомлений).
← →
vuk (2002-12-29 17:54) [7]Ну так этот подводный камень в обоих случаях может появиться. В первом варианте, опять же, все от того зависит, как Assign реализован.
← →
Юрий Зотов (2002-12-29 18:50) [8]А поскольку Assign, увы, далеко не всегда реализован на все 100, то, значит, остается RTTI.
← →
vuk (2002-12-29 18:56) [9]С потоком как раз и получается RTTI, только вручную по таблицам шарить не надо. :o)
← →
Юрий Зотов (2002-12-29 19:09) [10]Не совсем. Поток не запишет дефолтные значения, а ручками можно скопировать всё.
А зачем шарить по таблицам? GetPropList с tkAny, а потом в простом цикле GetPropValue - SetPropValue. И все. Строк в 20, наверное, поместится.
← →
vuk (2002-12-29 19:20) [11]Ну это я и имел в виду под "шарить вручную". Ну ленивый я. :o)
← →
Юрий Зотов (2002-12-29 19:28) [12]"Мы с тобой одной крови - ты и я".
(С) Маугли.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c