我正在使用Delphi 5,我们有一种方法可以根据数据库表的内容(我们主要创建TButton)动态创建某些控件,并在单击这些控件时采取措施。这允许我们向表单添加简单控件,而无需重新编译应用程序。
我想知道是否可以根据字符串中包含的属性名设置组件的属性,以便我们可以设置更多选项。
的伪代码:
Comp := TButton.Create(Self);
// Something like this:
Comp.GetProperty('Left').AsInteger := 100;
// Or this:
Comp.SetProperty('Left', 100);
这有可能吗?
答案 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及更高版本上有效。