新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:} 根据字符串调用特定的控件create 如楼上所说,就是判断字符串。
这种又叫工厂模式。 DEATHTOUCH 发表于 2024-2-15 17:04
如楼上所说,就是判断字符串。
这种又叫工厂模式。
是不是没有简单的方法了? 最简单的实现如下,楼主大魔王玩了这么多年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; wyw6813 发表于 2024-2-15 17:17
最简单的实现如下,楼主大魔王玩了这么多年delphi,似乎还是什么都不会,基础太差了点。。。多补补基础,不 ...
可是这还是写死的啊。 利用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); 冥界3大法王 发表于 2024-2-15 17:21
可是这还是写死的啊。
有写死的方法,当然必定有不写死的方法。
使用TControlClass,TControl,FindClass可以动态实现,不需要显式的知道当前要创建的控件是什么类型。自行探索吧。 貌似简单的问题,实现方法各不相同,学习了。
页:
[1]