如何对动态生成控件的事件进行传递(200分)

  • 主题发起人 主题发起人 aahben
  • 开始时间 开始时间
A

aahben

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是动态生成一个LISTBOX,在里面是数据表中的字段名,用户选择几个(如5个)字段名后生成5组控件,每一组控件是EDIT1 ,'<'(commbox),字段名(panel),'<'(commbox),edit2,还生成一个PANEL,在用户在生成的控件组中输入和选择后生成查询条件后,点击PANEL进行查询,查询函数定义为panelclick(sender:tOBJECT);因为需要获得上面动态生成控件的caption和数值,所以必须定义在本函数内部,在函数赋值时我不知道该怎么值.请大家指导,高分感谢.程序结构如下procedure Thj_main.RzCheckListExit(Sender: TObject;
Index: Integer;
NewState: TCheckBoxState);
var rzboxtmp1, rzboxtmp2: array of TRzComboBox;
paneltmp: array of trzpanel;
paneltmp1,paneltmp2:trzpanel;
edittmp1, edittmp2: array of trzedit;
procedure paneltmp2(sender:tobject);
begin
////////////code
end;
begin
////其它代码
paneltmp2.onclick:=paneltmp2////这里是错误了,我不知道怎么做,首先MethodAddress不能用,因为不是publish的。
end;
 
大家帮忙看一吧,分数是有限的,大家的力量是无限了,要分数的我可以给800
 
把一个过程名赋值给事件的属性就可以了,如:
SN1_Value[SN1_Num-1].OnEnter:=Frm_Main.Edt_SampleEnter;
SN1_Value[SN1_Num-1].OnExit:=Frm_Main.Edt_SampleExit;
 
谢谢aikede,可是我的事件paneltmp2是不能在外部定义,因为它要利用内部自定义的控件参数.
 
这个一定行,我在系统里有大量动态创建控件及事件。
动态创建控件后,赋事件参数时所有参数需要一致。
 
bbscom正解
 
关注,我也想了解,顶起来
 
大概是这样:
不过这样写的时候,很容易出问题,这种隐式写法,很容易在里面的代码很容易出现访问地址错误
不建议这种写法。
procedure GetEvent(var Event;
AData, ACode: Pointer);
begin
TMethod(Event).Data := AData;
TMethod(Event).Code := ACode;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Edit: TEdit;
procedure EditEnter(Instance, Sender: TObject);
begin
//.... your code
// 注意:里面的代码需要访问类实例时,需要明确写出类实例。
// 如下,如果写成Caption := 'OnEnter',代码就会出错。
Form1.Caption := 'OnEnter';
end;

procedure EditExit(Instance, Sender: TObject);
begin

Form1.Caption := 'OnExit';
end;

var
Event: TNotifyEvent;
begin
Edit := TEdit.Create(Self);
Edit.Parent := Self;
GetEvent(Event, Edit, @EditEnter);
Edit.OnEnter := Event;
GetEvent(Event, Edit, @EditExit);
Edit.OnExit := Event;
end;
 
记得:函数中,最前面第一个参数都加上Instance: TObject,即使没有参数。
 
谢谢大家,由于我的程序在多个地方都要访问创建的控件,所以我把他们定义到外部去了,所以此问题暂时解决了,但不知道这样做会不会产生其它的负面影响,现在我的程序老是出现访问冲突,执行可执行程序时有时会自动退出.
 
散分了,多谢大家
 
后退
顶部