动态访问Delphi组件中的属性

Dra*_*rok 6 delphi dynamic

我正在使用Delphi 5,我们有一种方法可以根据数据库表的内容动态创建某些控件(我们主要创建TButtons)并在点击这些控件时采取行动.这允许我们向表单添加简单控件,而无需重新编译应用程序.

我想知道是否可以根据字符串中包含的属性名称设置组件的属性,以便我们可以设置更多选项.

伪代码:

Comp := TButton.Create(Self);

// Something like this:
Comp.GetProperty('Left').AsInteger := 100;
// Or this:
Comp.SetProperty('Left', 100);
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

Dan*_*ski 13

您必须使用Delphi 的运行时类型信息功能来执行此操作:

这个博客准确描述了你要做的事情:Delphi中的运行时类型信息 - 它可以为你做任何事吗?

基本上你必须获取属性信息,使用GetPropInfo然后SetOrdProp用来设置值.

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

这不像你的伪代码那么简洁,但它仍然可以完成这项工作.此外,它与其他内容(如数组属性)相比也变得更加复杂.


Ede*_*com 10

来自我的一个工作单位(虽然在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;
     ...
Run Code Online (Sandbox Code Playgroud)

您必须TypInfo在uses语句中包含.不知道这是否适用于Delphi 5.