是的,先申明一个过程,但过程类型和OnClick必须一致,最后赋值,如下var Btn:TButton;procedure TForm1.MyOnClick(Sender:TObject); begin //SomeCodeImplementYourFunctionHere end;....procedure TForm1.FormCreate(Sender:TObject); begin Btn:=TButton.Create(Self); with Btn do begin Parent:=Self; OnClick:=Self.MyOnClick; end; end;
FrameSniper(§绕瀑游龙§) 已经回答了
to 绕瀑游龙 我做这个系统的构思是:在程序运行时在panel控件中动态生成几个shape控件,生成的控件在panel中当用鼠标拖动其中一个shape时,这个shape应能够移动。你觉得这个功能应该什么实现。
哦,就是实现控件的动态拖动吧!只要上层基类中包含TControl就好实现,如下:从TShape派生一个子类TMoveShape,然后覆盖基类的动态方法MouseDown并且写一个处理WM_SysCommand消息的消息处理器就可以了!type TMoveShape = class(TShape) private fDragable:Boolean; protected procedure MouseDown(Button: TMouseButton;Shift: TShiftState; X, Y: Integer);override; public Constructor Create(AOwner:TComponent);override; Destructor Destroy;override; published property Dragable:Boolean read fDragable write fDragable; end;procedure Register; implementation procedure Register; begin RegisterComponents('MoveShape', [TMoveShape]); end; { TMoveShape } constructor TMoveShape.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TMoveShape.Destroy; begin inherited; end; procedure TMoveShape.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; begin inherited; if assigned(onMouseDown)then OnMouseDown(self,Button,Shift,x,y); if fDragable then begin ReleaseCapture; (self as TControl).perform(WM_SysCommand, SC_DragMove, 0); end; end; 如此实现后,就可以实现运行时拖动了!
to 绕瀑游龙 可能是我没有把问题说清楚,让你误解了我的意思,我的想法是在程序运行时生成一个shape,然后能够拖动它,再把它拖动后的位置保存在表里面,以便下次程序运行时,直接从表里获得该shape拖动后的位置。如果shape是静态产生的就很容易,但如果是动态生成时,由于没有了mousedown事件,就比较麻烦了。我觉得应该用你第一个回贴就可以实现,但又不知道具体代码如何写。你能不能帮我实现它?谢了!!!呵呵!!
生成的button有onclick事件
你先写一个过程,参数要与onclick的参数一至
然后,button.onclick := 你的过程名ok
Btn:TButton;procedure TForm1.MyOnClick(Sender:TObject);
begin
//SomeCodeImplementYourFunctionHere
end;....procedure TForm1.FormCreate(Sender:TObject);
begin
Btn:=TButton.Create(Self);
with Btn do
begin
Parent:=Self;
OnClick:=Self.MyOnClick;
end;
end;
我做这个系统的构思是:在程序运行时在panel控件中动态生成几个shape控件,生成的控件在panel中当用鼠标拖动其中一个shape时,这个shape应能够移动。你觉得这个功能应该什么实现。
TMoveShape = class(TShape)
private
fDragable:Boolean;
protected
procedure MouseDown(Button: TMouseButton;Shift: TShiftState; X, Y: Integer);override;
public
Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;
published
property Dragable:Boolean read fDragable write fDragable;
end;procedure Register; implementation procedure Register;
begin
RegisterComponents('MoveShape', [TMoveShape]);
end; { TMoveShape }
constructor TMoveShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end; destructor TMoveShape.Destroy;
begin
inherited;
end; procedure TMoveShape.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
const
SC_DragMove = $F012;
begin
inherited;
if assigned(onMouseDown)then
OnMouseDown(self,Button,Shift,x,y);
if fDragable then
begin
ReleaseCapture;
(self as TControl).perform(WM_SysCommand, SC_DragMove, 0);
end;
end; 如此实现后,就可以实现运行时拖动了!
可能是我没有把问题说清楚,让你误解了我的意思,我的想法是在程序运行时生成一个shape,然后能够拖动它,再把它拖动后的位置保存在表里面,以便下次程序运行时,直接从表里获得该shape拖动后的位置。如果shape是静态产生的就很容易,但如果是动态生成时,由于没有了mousedown事件,就比较麻烦了。我觉得应该用你第一个回贴就可以实现,但又不知道具体代码如何写。你能不能帮我实现它?谢了!!!呵呵!!
我们能否用msn交流下。呵呵!!