Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.13;
Скачать: CL | DM;

Вниз

Реинициализация компонентов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
4-37437
Cosmic
2002-11-24 21:58
2003.01.13
Как получить элемент ListBox a???


1-37208
maxim2
2002-12-31 09:18
2003.01.13
Undeclared identifier VarToStr что за ошибка ???


3-36939
std79
2002-12-18 09:57
2003.01.13
Database not assigned, Обновление данных


14-37383
stas_a
2002-12-25 14:32
2003.01.13
StringGrid с компонентами внутри ячеек


14-37280
vopros
2002-12-23 10:53
2003.01.13
Куда Колян пропал?