![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создать контрол с заранее неизвестным классом [D7, WinXP]
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)?
переформулируй, а то вообще не въехал...