如何为动态创建的组件写事件

caixinke 2007-02-08 11:54:53
我现在遇到的问题是,动态创建了可视组件Tedit后,要为这个动态控件指定onmousemove事件,而且不只是动态创建一个Tedit控件,有可能是多个,每个Tedit控件的onmousemove事件是一样的。按照一般的方法,就是先定义一个函数,然后在创建Tedit控件的时候直接指定onmousemove事件,下面是delphi标准的事件代码:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//具体代码省略
end;
请大家注意,创建Tedit我是这样做的(省略了部分内容)
var e:Tedit;
begin
e:=Tedit.create(self);
e.parent:=panel1;
e.onmousemove:=myfunction(//这里的参数不会指定,自定义函数myfunction的代码在下面);
end;


自定义函数myfunction的代码:
procedure tform1.myfunction(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);
begin
//代码省略
end;
大家注意,自定义函数myfunction中的shift参数和x,y参数在e.onmousemove:=myfunction(。。。)如何给出?其他参数不用考虑,我知道怎么写.唯恐问题说不明白,所以比较罗嗦,请大家见谅。多谢!!!
...全文
822 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
肥仔胧 2007-02-12
  • 打赏
  • 举报
回复
依题意赋值时是不用参数的
仙侣步惊云 2007-02-12
  • 打赏
  • 举报
回复
事件是一种特殊的属性,该属性的数据类型一个过程指针(即某个对象的方法),过程
指针赋值兼容的前提是参数必须完全一致。
snowflying928 2007-02-12
  • 打赏
  • 举报
回复
關注
Frank.WU 2007-02-10
  • 打赏
  • 举报
回复
原因就是你問題說不明白!!!!!!!!

你的問題很簡單:
===================
如何給動態創建的組建指定事件!!!!!!!
===================
這麼簡單的事情....
caixinke 2007-02-09
  • 打赏
  • 举报
回复
请高手帮忙
gaolin 2007-02-09
  • 打赏
  • 举报
回复
对控件类型写事件,事件里面判断
caixinke 2007-02-09
  • 打赏
  • 举报
回复
TO:kjiwu(阿磊)

你的答案我由于没仔细分析,当时认为不对,现在看来是正确的,多谢!!!
caixinke 2007-02-09
  • 打赏
  • 举报
回复
TO:ahjoe(强哥)

HoHo,你不愧是强哥啊,这么多人就是看不明白我的问题在哪里,只有你一针见血啊,高人啊!!!
多谢多谢,暂时没多少分,以后必定另外开帖送分!
caixinke 2007-02-09
  • 打赏
  • 举报
回复
TO:ahjoe(强哥)

我测试一下你的代码
Frank.WU 2007-02-09
  • 打赏
  • 举报
回复
一句話: 不行!

原因:參數不一致!

建議: 使用 Tag
ahjoe 2007-02-09
  • 打赏
  • 举报
回复
事件处理函数必须属于某个对象的。

独立函数是不可以作为事件处理函数的。

比如 kjiwu(阿磊) 的以下代码

Edit1.OnMouseMove := YourFunc;

procedure YourFunc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit2.text := IntToStr(x);
Edit3.text := IntToStr(y);
end;

因为 YourFunc是一个不属于任何对象的,独立的函数,所以这样是不行的。

解决办法: 将该函数放到 TForm1 窗口类中,作为窗口的一个成员函数

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure YourFunc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.YourFunc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit2.text := IntToStr(x);
Edit3.text := IntToStr(y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.OnMouseMove := YourFunc;
end;
caixinke 2007-02-08
  • 打赏
  • 举报
回复
TO trainbox(rain):

自定义函数myfunction是有参数的,怎么能在e.onmousemove:=myfunction中不指定参数?
trainbox 2007-02-08
  • 打赏
  • 举报
回复
e.onmousemove:=myfunction;

这里不需要指定参数
trainbox 2007-02-08
  • 打赏
  • 举报
回复
没什么问题啊,你有什么问题啊?
caixinke 2007-02-08
  • 打赏
  • 举报
回复
TO:kjiwu(阿磊)

自定义函数的参数为什么要和要赋值的事件的参数一致?最主要的问题就在于怎么指定参数。可能大家还是没看明白我的疑惑再什么地方啊!

请大家注意,自定义函数myfunction的参数shift和x,y与标准onmousemove事件中的参数shift和x,y名称及类型是相同的,但这只是形式的相同而已。关键是给动态创建的Tedit的onmousemove事件赋值myfunction函数,myfunction函数中的shift、x、y的参数值就是要取控件的标准onmousemove事件中的对应参数值,这是最大的问题。
kinglh 2007-02-08
  • 打赏
  • 举报
回复
学习
kjiwu 2007-02-08
  • 打赏
  • 举报
回复
注意自定义的事件的参数要与要赋值的事件的参数一致!
Edit1.OnMouseMove := YourFunc;

procedure YourFunc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit2.text := IntToStr(x);
Edit3.text := IntToStr(y);
end;
caixinke 2007-02-08
  • 打赏
  • 举报
回复
TO:Antiquesoft(古董)

我的自定义函数myfunction有多个参数,并非一个参数,而且并不是你说的是想判断是哪个Tedit触发的事件,请把问题看清楚,多谢!

Antiquesoft 2007-02-08
  • 打赏
  • 举报
回复
你这个参数无非是想指定是哪个Edit触发的事件, 所以没有必要在 myfunction 中指定!

你可以利用 Edit 的 tag 属性

在myfunction 中:

Case When TEdit(Sender).Tag of
1:
end

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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