-
DevilDevil (17.01.08 23:42) [20]> Целевые компоненты делаются невидимыми (аналоги полей).TComponentCollectionItem
?
что означает "сделать невидимыми" ?
> Пишется компонент-контейнер таких невидимых компонентов.TComponentCollection
?
> К нему пишется редактор
редакторы не писал ни разу. Я могу в качестве основы взять редактор для TCollection ? -
DimaBr © (18.01.08 08:44) [21]Давайте сначала !!!
У вас есть перечень компонентов на форме которыми вы хотите управлять из некоего редактора аля TCollectionEditor
Или у вас есть перечень компонентов внутри некоего компонента которые "не видны" (создаются внутри компонента) на форме и которыми вы хотите управлять. -
DevilDevil (18.01.08 12:08) [22]> DimaBr © (18.01.08 08:44) [21]
у меня есть класс формы (допустимTMyForm
), у которого есть свойствоObjects: TMyCollection
. Я сделал так, чтобы элементы однозначно идентифицировались по свойствуName
, например, так:WaterFigures := MyForm1.Objects['WaterFigures'];
Мне желательно, чтобыTMyForm1
содержал в себе соответствующиеTMyObject
-поля и создавались они автоматически.
Впринципе проблема решается ([19]), но делается это добавлением полей вручную и:procedure TMyForm.Loaded;
...
for i := 0 to Objects.Count-1 do
begin
Object := Objects[i];
P := FieldAddress(Object.Name);
if (P <> nil) then
TMyObject(P^) := Object;
end; -
DimaBr © (18.01.08 13:42) [23]Ничего не понял.
Имеется форма, у которой нужно организовать доступ по имени объекта ?
Так FindComponent поможет.
Чесно говоря я вообще не понимаю смысл вашей затеи. Опишите пожалуйста что вы хотите иметь в конечном результате желательно с примерами (без кода) -
Юрий Зотов © (18.01.08 15:06) [24]Насколько я понял, он хочет, чтобы:
- каждый элемент коллекции имел имя;
- форма имела поле с тем же именем;
- это поле указывало на компонент. -
DimaBr © (18.01.08 16:48) [25]Это-то мне и непонятно, зачем "масло-масленное".
Форма уже имеет поименованную "коллекцию" элементов -
> Юрий Зотов © (18.01.08 15:06) [24]
:) всё верно.
> Форма уже имеет поименованную "коллекцию" элементов
эээ...
именована сама коллекция, а не элементы.
а зачем и почему... потому чтоLabel1.Caption := 'Value'
лучше, чемTLabel(FindComponent('Label1')).Caption := 'Value' -
Юрий Зотов © (18.01.08 18:41) [27]> DevilDevil © (18.01.08 17:59) [26]
Все это действительно делается по аналогии с полями, но за это Ваше "лучше" придется заплатить довольно дорого. В частности, придется написать классы невидимых компонентов и их контейнера (а в них - код для правильного сохранения невидимых компонентов в DFM и их последующей загрузки), процедуру регистрации невидимых компонентов (аналог RegisterField) и механизм поддержки этой процедуры (внутренний список IDE), редактор (аналог редактора полей)... ну и еще что-то, возможно.
Стоит ли овчинка выделки? Давайте для начала ответим на вопрос - зачем вообще нужны эти компоненты? Ведь уже есть коллекция, у нее уже есть элементы, к этим элементам можно обращаться и в их код можно вставить всю нужную функциональность...
...так зачем вообще нужны дополнительные компоненты? Чем они лучше? Только тем, что обращение к ним на одно слово короче? -
DevilDevil (20.01.08 02:36) [28]> Юрий Зотов © (18.01.08 18:41) [27]
> Стоит ли овчинка выделки?
Вопрос в цель. Спасибо, Юрий, что разъяснили.
Решил обходиться ручным вписыванием полей в published секцию.
Огромное спасибо всем, что потратили уйму времени на помощь!