Динамично получите доступ к свойству в компоненте Delphi

Я использую Delphi 5, и у нас есть метод для динамичного создания определенных средств управления на основе содержания таблицы базы данных (мы создаем TButtons главным образом), и примите меры, когда они нажаты. Это позволяет нам добавлять простые средства управления к форме, не имея необходимость перекомпилировать приложение.

Я задавался вопросом, было ли возможно установить свойство компонента на основе имени свойства, содержавшегося в строке, таким образом, мы могли установить дальнейшие опции.

Псевдокод:

Comp := TButton.Create(Self);

// Something like this:
Comp.GetProperty('Left').AsInteger := 100;
// Or this:
Comp.SetProperty('Left', 100);

Действительно ли это возможно вообще?

6
задан Drarok 15 January 2010 в 12:00
поделиться

2 ответа

Вы должны использовать информацию информацию о времени выполнения . Особенности Delphi, чтобы сделать это:

Этот блог описывает именно то, что вы пытаетесь сделать: Информация о типе работы в Delphi - может ли она сделать что-нибудь для вас?

В основном вы должны получить информацию о недвижимости, используя GetPropinfo , а затем использовать SetDProp , чтобы установить значение.

var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Comp.ClassInfo, 'Left');
  if Assigned(PropInfo) then
    SetOrdProp(Comp, PropInfo, 100);
end;

Это не такое же краткое, как ваш псевдокод, но он все еще делает работу. Также он становится все более сложным с другими вещами, такими как свойства массива.

13
ответ дан 8 December 2019 в 05:21
поделиться

Из одного из моих рабочих единиц (в 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.

10
ответ дан 8 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: