请教动态生成多种类型控件的办法?

bosshoss 2008-03-26 05:10:55
比方我有一个表格,有控件类型,控件大小,位置

现我是定义一个数组好呢?还是定义一个链好?
我的试验:
VAR Dwincontrol:array[1..100]of TWinControl; //动态控件


procedure TForm_zhipiao_main.BitBtn1Click(Sender: TObject);
begin
I:=I+30;
Dwincontrol[j]:=TDBEdit.Create(Self);
Dwincontrol[j].Parent:=Self;
Dwincontrol[j].Height:=30;
Dwincontrol[j].Width:=75;
Dwincontrol[j].Visible:=True;
Dwincontrol[j].top:=Self.Top+50+I;
Dwincontrol[j].Left:=Self.Left+50+I;
tdbedit(Dwincontrol[j]).Text:='动态控件';
tdbedit(Dwincontrol[j]).OnClick:=DwincontrolClick ;
j:=j+1 ;
end;

请教,
我想在procedure Dwincontrolclick(Sender: TObject);中
我怎么才能得到我选定的动态控件?
再进行另外的操作?
...全文
61 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bosshoss 2008-03-27
  • 打赏
  • 举报
回复
谢谢楼上的大大们
明白了
lihuasoft 2008-03-26
  • 打赏
  • 举报
回复
还有,你还提到了动态创建多种类型的控件。在响应单击事件时,统一把它们视为其祖先类操作,当然可以,比如视为TComponent类或TWinControl类。但有一定局限。这与用Sender或你的做法(声明一个:^TWinControl指针)都无关系。Sender本身就是一个指针了(Sender是TObject类对象,但对象就是指针)

要真正操作它,必然要转换为子代类型。这样,处理多种类型,就在OnClick过程中写判断语句就可以了:


if Sender is TEdit then
Showmessage(TEdit(Sender).Name);
if Sender is TButton then
Showmessage(TButton(Sender).Name);
if Sender is TImage then
Showmessage(TImage(Sender).Name);
//....
lihuasoft 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 peterwgt 的回复:]
等待答案
[/Quote]

还在等答案?看来你还是没明白。
关于动态创建对象,以及Sender的应用,给你写了一个小例子,你新建一个工程把代码复制过去试下。
主窗体上只需一个Button


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure EdtClick(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I: integer;
begin
for I := 0 to 4 do
with TEdit.Create(Self) do begin
Parent := Self;
Width := 60;
Top := 50;
Left := I * 100 + 50;
OnClick := EdtClick;
Name := Format('MyEdit%d',[I]);
Text := Name;
Visible := True;
end;
end;

procedure TForm1.EdtClick(Sender: TObject);
begin
if Sender is TEdit then
Showmessage(TEdit(Sender).Name);
end;

end.
lihuasoft 2008-03-26
  • 打赏
  • 举报
回复
procedure TForm_zhipiao_main.Dwincontrolclick(Sender: TObject);
peterwgt 2008-03-26
  • 打赏
  • 举报
回复
等待答案
lihuasoft 2008-03-26
  • 打赏
  • 举报
回复

procedure Dwincontrolclick(Sender: TObject);
begin
if Sender is TDBEdit then
Showmessage(TDBEdit(Sender).Text);
{注意Sender的应用。
当然,TDBEdit(Sender)也可以改用(Sender as TDBEdit),
但前面已经做is判断了,直接强制转换也很安全的}
{另外,如果TDBEdit不连接数据源,Text会全部为空---这与问题无关}
end;

//你用ActiveControl当然也可实现,但是走弯路了
bosshoss 2008-03-26
  • 打赏
  • 举报
回复
搞定,
定义了一个指针:pdwincontrol:^twincontrol;
在form oncreate中new(pdwincontrol);
在form onclose中dispose(pdwincontrol)
在procedure Dwincontrolclick(Sender: TObject);中
pdwincontrol^:=self.ActiveControl;//把指针指向选定的控件

再对指针进行操作
bosshoss 2008-03-26
  • 打赏
  • 举报
回复
还是没有明白
比方:我在窗口中建立了十个动态控件,
我现在选中第五个动态控件,
再进行其它操作,用窗口的焦点反回值?
Corn1 2008-03-26
  • 打赏
  • 举报
回复
(Sender as TDBEdit)
mantti 2008-03-26
  • 打赏
  • 举报
回复
在创建时,将新建控件的Tag值设为j,这样要找时只需找相应Tag值得控件就可以了
lihuasoft 2008-03-26
  • 打赏
  • 举报
回复
Sender就是

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧