冥界3大法王 发表于 2024-2-15 15:58

新Delphi问题,如何创建动态的“活的未知已知组”控件?

本帖最后由 冥界3大法王 于 2024-2-15 16:03 编辑


譬如说,最简单的是动态创建控件的实例像下面这种:
procedure TForm7.动态创建控件Click(Sender: TObject);
var
MyEdit: TEdit;         // 定义变量存储新创建的编辑控件
begin
MyEdit := TEdit.Create(Self); // Self表示当前所属的窗体或者容器
MyEdit.Parent := Form7;// Form7
MyEdit.Left := 50;       // 设置编辑控件左边距
MyEdit.Top := 50;      // 设置编辑控件上边距
MyEdit.Width := 50;   // 设置编辑控件宽度
MyEdit.Height := 50;    // 设置编辑控件高度
end;

注意看红字 和 绿字

https://static.52pojie.cn/static/image/hrline/1.gif


问题来了。。。。假设我把未知要创建的控件类型 ,弄到ComboBox下拉菜单列表里边去
假设有
TEdit
TButton
。。。省略137种

那我红字和绿色的定义如何表达呢?{:301_974:}{:301_974:}{:301_974:}


不出所料,果然报错了。{:301_988:}

homejun 发表于 2024-2-15 16:56

根据字符串调用特定的控件create

DEATHTOUCH 发表于 2024-2-15 17:04

如楼上所说,就是判断字符串。
这种又叫工厂模式。

冥界3大法王 发表于 2024-2-15 17:11

DEATHTOUCH 发表于 2024-2-15 17:04
如楼上所说,就是判断字符串。
这种又叫工厂模式。

是不是没有简单的方法了?

wyw6813 发表于 2024-2-15 17:17

最简单的实现如下,楼主大魔王玩了这么多年delphi,似乎还是什么都不会,基础太差了点。。。多补补基础,不要整天搞那些花里胡哨的。
procedure TForm1.Button1Click(Sender: TObject);
var
NewControl: TControl;
begin
case ComboBox1.ItemIndex of
    0: NewControl := TEdit.Create(Self);
    1: NewControl := TButton.Create(Self);
    // 添加其他控件类型...
    else
      Exit; // 如果没有选择控件类型,直接退出
end;

// 设置控件的属性
NewControl.Parent := Self; // 设置父级为当前的Form
NewControl.Left := 100;
NewControl.Top := 100;
end;

冥界3大法王 发表于 2024-2-15 17:21

wyw6813 发表于 2024-2-15 17:17
最简单的实现如下,楼主大魔王玩了这么多年delphi,似乎还是什么都不会,基础太差了点。。。多补补基础,不 ...

可是这还是写死的啊。

DEATHTOUCH 发表于 2024-2-15 17:52

利用RegisterClass和GetClass或FindClass也可以哦,不过非常花里胡哨,不如字符串匹配写个类厂直接。
procedure TForm1.FormCreate(Sender:TObject);
var
ps:TPersistentClass;
btn:TButton;
begin
ps:=GetClass('TButton');
if ps<>nil then
begin
    btn:=TButton(TComponentClass(ps).Create(Self));
    btn.Parent:=Self;
    btn.SetBounds(100,50,200,80);
    btn.Caption:='按钮';
end;
end;

initialization

RegisterClass(TButton);

wyw6813 发表于 2024-2-15 18:29

冥界3大法王 发表于 2024-2-15 17:21
可是这还是写死的啊。

有写死的方法,当然必定有不写死的方法。
使用TControlClass,TControl,FindClass可以动态实现,不需要显式的知道当前要创建的控件是什么类型。自行探索吧。

happyxuexi 发表于 2024-2-16 07:33

貌似简单的问题,实现方法各不相同,学习了。
页: [1]
查看完整版本: 新Delphi问题,如何创建动态的“活的未知已知组”控件?