Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создать контрол с заранее неизвестным классом [D7, WinXP]


Страницы:   1 2

den303_work ©   (2007-09-06 15:35:00) 

Доброго времени суток!

Проблема такая:
В XML записаны некоторые объекты (контролы) и их свойства. Я генерирую форму в run-time из этого файла. Заранее класс контрола неизвестен. Как мне объявить класс контрола на этапе проетирования, притом что нужен доступ к специфическим свойствам (к примеру, Caption для TLabel)?

Вопрос вдогонку :o) :
Какое объявление лучше использовать для хранения списка контролов и подчинённых им свойств (у каждого контрола, опять же, свой набор)?


Инс   (2007-09-06 16:30:00) [21]


> Ммммм.... А что это? [бьётся головой о стол :o( ]

См. TStream.WriteComponent, TStream.ReadComponent, классы TReader, TWriter.


den303_work   (2007-09-06 16:27:00) [22]


> Игорь Шевченко ©   (06.09.07 16:16) [8]

ОК, сенкс, попробую.


> Dib@zol ©   (06.09.07 16:19) [10]

Не в файле, а в переменной :o)
Думал использовать Array of array of string и TList с TStringList вместо итемов, обе реализации не понравились.


> Инс ©   (06.09.07 16:22) [11]

Ммммм.... А что это? [бьётся головой о стол :o( ]


homm   (2007-09-06 16:25:00) [23]

> Какое объявление лучше использовать для хранения списка
> контролов и подчинённых им свойств (у каждого контрола,
> опять же, свой набор)?

А кто запрещает в dfm хранить?


Инс   (2007-09-06 16:22:00) [24]

А стандартная сериализация/десериализация не подходит?


Dib@zol   (2007-09-06 16:19:00) [25]

> Тогда см. второй вопрос :o)

У ИНИ-файла отличная структура, никогда не подволила =)


den303_work   (2007-09-06 16:17:00) [26]


> Dib@zol ©   (06.09.07 16:13) [7]

Не, ну понятно, что классы опять же будут валидными. Но, блин.... А, ладно! Объявлю, какие есть, пусть так работает.

Тогда см. второй вопрос :o)


Игорь Шевченко   (2007-09-06 16:16:00) [27]


>  Как мне объявить класс контрола на этапе проетирования,
>  притом что нужен доступ к специфическим свойствам (к примеру,
>  Caption для TLabel)?


Использовать RTTI, доступ к свойствам сделать через GetxxxxProp|SetxxxProp (uses TypInfo)


Dib@zol   (2007-09-06 16:13:00) [28]

> в xml могут быть абсолютно любые классы контролов. Не объявлять же все...

у, батенька, это увы не прокатит. Тут либо окно вручную создавать и мессаги ему слать, либо никак... Каждый компонент из ВЦЛ заточен только под свой набор свойств. Сложно даже представить себе, какие глюки пойдут, если скажем ВЦЛьной кнопке проставили напр класс 'msctls_toolbar32'.


den303_work   (2007-09-06 16:07:00) [29]


var
 obj:TControl;
 s:string; //<-тип контрола('TLabel')
begin
 obj:=TControl(s);
 obj:=TControl.Create(self);
 obj.Parent:=Form1;
 (obj as TLabel).Caption:='test'; //<-на этом месте вылетает, даже несмотря на то, что я объявляю as TLabel

Ну а нужно опять же типа (obj as s).Caption:='test';

ЗЫ: Caption здесь просто для примера, на самом деле свойства для каждого контрола тож из xml идут и все валидные

ЗЫ2:
> Инс ©   (06.09.07 15:41) [3]

Тож не катит (либо я не понял), т.к. в xml могут быть абсолютно любые классы контролов. Не объявлять же все...


den303_work   (2007-09-06 15:45:00) [30]


> Dib@zol ©   (06.09.07 15:41) [2]

Абсолютно верно! [ Y/N] :o)


den303_work   (2007-09-06 15:43:00) [31]


> Ega23 ©   (06.09.07 15:37) [1]

Уххх... Сумбурно объяснил, сорри. Короче, надо написать процедуру создания контрола
var
 obj:TControl;
 s:string;  //<-здесь хранится тип контрола, вытянутый из xml. В данном случае TLabel.
begin
 obj:=TControl.Create;
 //Надо типа того: obj:=s.Create;
...

Даже не представляю, куда копать


Инс   (2007-09-06 15:41:00) [32]

см. RegisterClasses/FindClass


Dib@zol   (2007-09-06 15:41:00) [33]

Ну типа читает прога ХМЛ. Видит: object "name1" class "BUTTON" ну или как-то так. Дык вот, этого класса окно ему и надо создать.
Правильно ли работает телепатор [Y/N]?


Ega23   (2007-09-06 15:37:00) [34]


> Как мне объявить класс контрола на этапе проетирования,
> притом что нужен доступ к специфическим свойствам (к примеру,
>  Caption для TLabel)?


переформулируй, а то вообще не въехал...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо