菜鸟级的问题,关于TnotifyEvent的用法。轻松得100分。(100分)

I

icet

Unregistered / Unconfirmed
GUEST, unregistred user!
目的:我在程序运行的过程中让用户自己生成一些控件,然后把这些新生成的控制赋上事件代码。
比如:我让用户在运行中生成一个或多个按钮,如何给这个新的按钮的点击事件写代码?
我记得是似乎是用什么button1.onclick赋值的方法,但是当写到新控件的onclick事件系统提示为TnotifyEvent后,我看了半天的帮助文件还是没有看懂。
请高手明示,最好有个小小人例子。
 
我们一直用button1.onclick = myclick 的方法,呵呵
 
procedure TForm1.click(Sender: TObject);
begin
....
end;
button1.onclick:=click(nil)
我在网吧上网的,没调试,你自己再试试吧。
 
那看一下程序,在本程序中,表单上仅有一个按钮控件。
系统提示是:'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'。


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public

{ Public declarations }
end;

procedure but1Click(var i: integer);

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var but1: Tbutton;
i: integer;
begin
but1:=Tbutton.Create(self);
but1.Parent:=form1;
but1.Top:=100;
but1.Left:=100;
but1.Caption:='Test';

i:=3;
but1.onClick:=but1click(i); //编译到这里的时候提示为:Incompatible types: 'TNotifyEvent' and 'procedure,
//untyped pointer or untyped parameter'
end;

procedure but1Click(var i: integer);
begin
showmessage(inttostr(i)+#13+'sdf;asldjfk');
end;

end.
 
另:jian1和oiwin说的似乎都是对的,如果被调用的过程不带参数似乎就不会出问题。
 
哇塞,帅哥,事件岂能乱赋
你要记住一个准则,
参数列表必须一致
but1Click(var i: integer);
改为but1Click(Sender: TObject);

呵呵
 

参数列表要一致
 
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 myClick(Sender: TObject);
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.myClick(Sender: TObject);
begin
showmessage('Ok!');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
myBtn : TButton;
begin
myBtn := TButton.Create(Self);
with myBtn do
begin
Left := 100;
Top := 100;
Caption := '100分';
Parent := Form1;
OnClick := myClick;
end;
end;

end.
//-----------------------为你定做的,注意参数的传递,给我100分,我最高兴。
 
谢谢各位了,但是coolbaby的一句话“事件岂能乱赋”这个语句我理解得不够透彻。
意思是那里面的参数只能是sender?还想请教了。还有,对sender这个参数的应用,能否
给个较为详细的介绍?比如说我自动生成一组类似的按钮,但我给它们写一个共同的点击
事件,在这个事件里面判断sender,如果是某一个按钮的时候,在某一段可以有特殊的代码。
例如:
var btn: array [1..9] of Tbutton;
...
Procedure Click
begin
case sender=... //判断sender。
....
end;
可以另加100-200分。

另:嘻嘻,cut.fei的热心我表示感谢,但是价值不高,我前面说不带参数的意思就是这个sender了。
意思就是我已经知道了。根据多劳多得与按值取酬结合的原则,你将得到20分。哈哈。。。
(玩笑。)

 
注意参数的传递,参数的个数,顺序、类型必须一致。
其他事件也同理,不是一个参数的问题,也不是仅仅一个Sender了。
否则就不可以的。
//--------------------补充解释---------加分啊!!!!
 
:) 收到。但是从你的解释看来你是很明白,但是我却还不是很明白。
这些解释能否针对性地就此例而谈? 那个sender与一般的var 的区别如何?(菜鸟问问题
没有水平请不要见怪。。。) 就此例而言,我如果想要带其他的参数是否要修改似乎control
的那个unit? 或者重新建一个类?
或者,能否我们进行较为在针对性的交谈?QQ 588527。
加分是肯定有的。应该不会少于150分。

----------
一定加分!一定加分!一定加分!


 
Sender 是一个基础对象类型,而var 的变量是传入、传出的对象变量,或其他类型变量。
另外:你是动态创建一个TButton的对象。它只是继承了TButton类的特性。
所以,在相应的事件中,如Click的必须定义参数为一个Sender : TObject;
其他的如:MouseMove事件传送的参数必须为:
procedure myBtnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
 
如果,你想改变传入参数,那么你只有自己开发一个Button控件。将相应的事件予以重写。
再安装、动态创建。
 
谢谢。。。
 
顶部