请问在一个unit里(不带form)如何写由一个事件触发一个过程这样的代码?(急)(130分)

  • 主题发起人 主题发起人 base7
  • 开始时间 开始时间
B

base7

Unregistered / Unconfirmed
GUEST, unregistred user!
那个unit在另一个form里动态生成一个Timage的控件
然后写了一段过程,想把它加到对那个Timage控件的mousedown事件里,
我用了这样一句代码,
gui_ip.pic_flash.onmousedown:=my_ipnet_mousedown;
^ ^ ^
| | |
Timage mousedown事件 自己定义的过程

但系统编译到这句总报错:
Incompatible types: method pointer and regular procedure

大虾救命呀,快交活了...:(
分不够还可再加,还有500多分呢... ...
 
是你定义的过程的参数和OnMouseDown方法的参数不一样吧?
 
my_ipnet_mousedown在声明和实际的主体不一样,参数有可能不一样!
 
my_ipnet_mousedown定义错误, 事件中赋值的必须是类中的方法, 它的定义必须是
<strong>procedure/function (...) <font color = 'red'>of object</font></strong>;
而你的my_ipnet_mousedown显然是个普通的过程/函数
 
你的 my_ipnet_mousedown声明是 :
procedure my_ipnet_mousedown(Sender : TObject);
这样的吗?这个肯定没问题!!!!!
 
procedure my_ipnet_mousedown(Sender:TObject;
Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
参数必须是这样才行
 
恰克误人子弟啦.
必须定义成procedure <strong><font color = 'red'>Txxxx.</font></strong>my_ipnet_mousedown(Sender:TObject;
Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
才行.
注意: 类中的方法是个64位的指针, 而普通函数是32位指针
 
右边要的是指针类型,必须加个@,即
gui_ip.pic_flash.onmousedown:=@my_ipnet_mousedown;
试试看!
 
Another_eYes is right.
 
我的my_ipnet_mousedown是这样定义的:
procedure Tmain_ctrl_form.my_ipnet_mousedown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ipnet_drag:=true; //开始拖动
ps:=sender as timage;
temp_x:=x;
temp_y:=y;
temp_left:=ps.Left;
temp_top:=ps.top;
end;
应该没有什么问题吧?
我还试过把Tmain_ctrl_form.这句去掉,但报的错还是一样...
各位大侠还有什么解决方法吗?
 
那么eyes,64为指针是做什么用的呢?是不是说其中的32位指向类的地址,而另外的
32位是偏移呢?而一般的过程的32位指针就仅仅是一个地址???
 
要么把方法定义到 Class 内部,要么加上 “of object” 关键字。
 
我现在已经写成procedure my_ipnet_mousedown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer)of object;了,可是问题还是一样呀?
 
建议把 my_ipnet_mousedown 作为 gui_ip 类的一个方法
 
procedure my_ipnet_mousedown(Sender:TObject;
Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
应该这样写
还出问题我觉得你上述声明和你的Form,Image放在一个Unit试试
另外在Form的Private里加上上述声明才行,多试试吧





 
在无表单的UNIT2 是定义一个 duchMouseMove 过程,如下:
unit Unit2;

interface

uses menus,windows,shellapi,Classes,Dialogs, Sysutils;

 procedure duchMousMove(sender:Tobject;shift:TShiftState; X,Y:integer);

implementation


procedure duchMouseMove(sender:Tobject;shift:TShiftState; X,Y:integer);
begin
ShowMessage(IntToStr(X) + ',' + IntToStr(Y));
end;

end.

然后在要动态生成 TImage 的单元中如下定义:

unit Unit1;

interface

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

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

{ Private declarations }
public
procedure duClick(sender:Tobject;shift:TShiftState; X,Y:integer);
{ Public declarations }
end;

var
Form1: TForm1;


implementation

uses ShellAPI,unit2;
{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
var
duch:TImage;
begin
duch := TImage.Create(nil);
duch.Picture.LoadFromFile('c:/12.bmp');
duch.Parent := Form1;
duch.Show;
duch.OnMouseMove := duClick;
end;

procedure TForm1.duClick(sender:Tobject;shift:TShiftState; X,Y:integer);
begin
duchClick(sender,shift,x,y);
end;


end.

即可,笨一点,有效!
 
procedure TForm1.duClick(sender:Tobject;shift:TShiftState; X,Y:integer);
begin
duchMouseMove(sender,shift,x,y); //写错了,是duchMouseMove
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
939
DelphiTeacher的专栏
D
D
回复
0
查看
712
DelphiTeacher的专栏
D
后退
顶部