动态访问Delphi组件中的属性

时间:2010-01-15 12:00:48

标签: delphi dynamic

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

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

的伪代码:

Comp := TButton.Create(Self);

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

这有可能吗?

3 个答案:

答案 0 :(得分:13)

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

此博客准确描述了您要执行的操作:Run-Time Type Information In Delphi - Can It Do Anything For You?

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

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

这不像你的伪代码那么简洁,但它仍然可以胜任。此外,它还会变得更加复杂,如数组属性。

答案 1 :(得分: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;
     ...

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

答案 2 :(得分:1)

仅作为示例。这是设置子属性的方法,我在此Button组件上设置边距:

wp_print_scripts

由于内联变量,这在Delphi 10.3 Rio及更高版本上有效。