Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
14-37373
LD
2002-12-25 14:03
2003.01.13
Как изменить системное время?


4-37425
Cosmic
2002-11-23 21:01
2003.01.13
Как добавить пункт в ListBox?


3-36977
Alexei113
2002-12-18 18:01
2003.01.13
---|Ветка была без названия|---


3-36991
Rust1970
2002-12-17 15:26
2003.01.13
как через ADO вызвать хрпроцедуру, которая пишет в BLOB (oracle)


14-37379
SergBBS
2002-12-25 12:23
2003.01.13
Interbase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский