Я использую Delphi 5, и у нас есть метод для динамичного создания определенных средств управления на основе содержания таблицы базы данных (мы создаем TButtons главным образом), и примите меры, когда они нажаты. Это позволяет нам добавлять простые средства управления к форме, не имея необходимость перекомпилировать приложение.
Я задавался вопросом, было ли возможно установить свойство компонента на основе имени свойства, содержавшегося в строке, таким образом, мы могли установить дальнейшие опции.
Псевдокод:
Comp := TButton.Create(Self);
// Something like this:
Comp.GetProperty('Left').AsInteger := 100;
// Or this:
Comp.SetProperty('Left', 100);
Действительно ли это возможно вообще?
Вы должны использовать информацию информацию о времени выполнения . Особенности Delphi, чтобы сделать это:
Этот блог описывает именно то, что вы пытаетесь сделать: Информация о типе работы в Delphi - может ли она сделать что-нибудь для вас?
В основном вы должны получить информацию о недвижимости, используя GetPropinfo
, а затем использовать SetDProp
, чтобы установить значение.
var
PropInfo: PPropInfo;
begin
PropInfo := GetPropInfo(Comp.ClassInfo, 'Left');
if Assigned(PropInfo) then
SetOrdProp(Comp, PropInfo, 100);
end;
Это не такое же краткое, как ваш псевдокод, но он все еще делает работу. Также он становится все более сложным с другими вещами, такими как свойства массива.
Из одного из моих рабочих единиц (в Delphi 7, хотя)
var
c : TComponent;
for i := 0 to pgcProjectEdits.Pages[iPage].ControlCount - 1 do
begin
c := pgcProjectEdits.Pages[iPage].Controls[i];
if c is TWinControl
then begin
if IsPublishedProp(c,'color')
then
SetPropValue(c,'color',clr);
if IsPublishedProp(c,'readonly')
then
SetPropValue(c,'readonly', bReadOnly );
...
end;
...
Вы должны включить Typinfo
в операторе использования.
Не знаю, работает ли это под Delphi 5.