这种过程怎么写阿?帮帮忙,谢了!

Rayphrank 2003-08-30 11:08:05
我想写一个过程
type
A=class
protected
ControlClick(sender:TObject);
public
procedure setControlClick(control:TControl);
end;

implementation

procedure A.setControlClick(control:TControl);
begin
????????????
???????????????
????????
end;
procedure A.ControlClick(sender:TObject)
begin
showMessage('Hello');
end;



我的目的是可以这样使用类A,即:
假如有一个TControl的子类TButton的实例Button1
通过调用 A.setControlClick(Button1);
以后Button1的click事件就为procedure A.ControlClick(sender:TObject)函数做的事,即显示一个'Hello',
假如还有一个TControl的子类TSpeedButton实例SPBtn1
我再调用A.setControlClick(SPBtn1);
同样,函数执行后,以后SPBtn1的click事件就为procedure A.ControlClick(sender:TObject)函数做的事,即显示一个'Hello',

主要是TControl的Property ONClick是保护型的,所以我不能直接在函数里写
control.onclick:=ControlClick;否则就简单了,
子类化我也想到了,可惜TControl没有Handle,(从TWinContol才开始有handle,但TSpeedButton不是从TWinControl继承下来的,TSpeedButton也没有handle,我晕!!!)

我不想改TControl的源码!


哪位老大能帮帮我想想,怎样完成这个函数
...全文
31 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zousoft 2003-09-03
  • 打赏
  • 举报
回复
我的方法应该没问题呀,我试过了。楼主再试试。
mrtxc 2003-09-01
  • 打赏
  • 举报
回复
试试: lxpbuaa(桂枝香在故国晚秋) 的办法
lxpbuaa 2003-09-01
  • 打赏
  • 举报
回复
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
SpeedButton1: TSpeedButton;
procedure Button1Click(Sender: TObject);
private
procedure ControlClick(Sender: TObject);
procedure SetControlClick(Control: TControl);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses TypInfo;

{$R *.dfm}

procedure TForm1.ControlClick(sender:TObject);
begin
ShowMessage('Hello');
end;

procedure TForm1.SetControlClick(Control: TControl);
const
ProName = 'OnClick';
var
E: TNotifyEvent;
begin
if GetPropInfo(Control, ProName) <> nil then
begin
E := ControlClick;
SetMethodProp(Control, ProName, TMethod(E));
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetControlClick(Button2);
SetControlClick(SpeedButton1);
end;

end.

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
zousoft 2003-08-31
  • 打赏
  • 举报
回复
还有种适用范围更广的办法:
TMyControl = class(TControl)
public
property OnClick;
end;

procedure A.setControlClick(control:TControl);
begin
TMyControl(control).OnClick := ControlClick;
end;
mrtxc 2003-08-31
  • 打赏
  • 举报
回复
想想,再回来
UP
cnssk 2003-08-31
  • 打赏
  • 举报
回复
看着有点头晕,帮你up
Rayphrank 2003-08-30
  • 打赏
  • 举报
回复
呵呵,老大,我就是不想在函数里出现if... if....我的函数目的是只有是TControl的子类就能能完成给他赋click事件的功能,毕竟TControl里面已经实现了OnClick,只是保护的而以,

如果这样if...if...我要写多少if阿

不过还是很感谢你!
zousoft 2003-08-30
  • 打赏
  • 举报
回复
procedure TForm1.setControlClick(control: TControl);
begin
if control is TButton then
(control as TButton).OnClick := ControlClick
else
(control as TSpeedButton).OnClick := ControlClick;
end;

5,388

社区成员

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

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