高难度问题,可不是你想的那么简单:如何强行指定调用重载函数中的某一个? (200分)

  • 主题发起人 主题发起人 lyco
  • 开始时间 开始时间
Darkiss, 我的测试用的例子和你的几乎一样,也是把2个Test方法写到TForm1类里面,
然后在Botton1Click里面调用。

但是,你的回答:
funcAssign(FuncPointer1(@Form1.Test)
//少了一个括号,是故意的吗?
系统编译不通过呀,错误是:“Variable required”。
加上括号,错误是一样的!
所以你在“2002-1-15 15:39:00”的解答可能写错了。
 
用class procedure的方法是没有错误的.主意是TForm1.Test而不是Form1.Test
如果你一定要用到类内部的成员变量,就不能用class procedure.
 
对于后面的方法,呵呵,是错误的,forget it.
 
darkiss:

>>这个是利用delphi的一个小'bug',
请问这是什么意思?
我按照你说的作了,发现不用定义成类方法也可以呀,这是为什么?

>>尽量不要这么去做.
正确的方法应该是怎么样的呢?
 
type
FuncPointer1 = procedure(X: Integer)

FuncPointer2 = procedure(X, Y: Integer)


procedure Test(X: Integer)
overload

procedure Test(X, Y: Integer)
overload

procedure FuncAssign(FP1: FuncPointer1)
overload

procedure FuncAssign(FP1: FuncPointer2)
overload


这时,如果我调用:
FuncAssign(FuncPointer1(Test))
//or
FuncAssign(FuncPointer2(Test))

 
哎呀,Darkiss,我的程序是不能使用class procedure呀!class procedure的限制你
你也很清楚。只是,我没有把两个Test过程定义成Class procedure, 程序居然也通过
了编译。但是在运行的时候,如果Test里面使用用到了类的内部成员,一旦Test被调用,
而且执行到了使用类内部成员的语句,就会出现“Access Violation At Address XXXX”
的错误。
唉,看来我的问题确是Delphi的一个BUG,再等几天,如果还没有进展的话,我就把问
题Close掉。



 
好难啦,我一个都看不懂,只有收起来,以后再看吧!
 
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 }
end;

type
TestClass = class
public
procedure Test(X: Integer)
overload
//类中的方法
procedure Test(X, Y: Integer)
overload
//类中的方法
end;

FuncPointer1 = procedure(X: Integer) of object
//指针是方法指针
FuncPointer2 = procedure(X, Y: Integer) of object
//指针是方法指针

procedure FuncAssign(FP1: FuncPointer1)
overload;
procedure FuncAssign(FP1: FuncPointer2)
overload;
var
TestClass1:TestClass;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure FuncAssign(FP1: FuncPointer1)
overload;
begin
FP1(1);
end;
procedure FuncAssign(FP1: FuncPointer2)
overload;
begin
FP1(1, 2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
FP1: FuncPointer1;
FP2: FuncPointer2;
begin
TestClass1 := TestClass.Create;
FP1 := TestClass1.Test;
FP2 := TestClass1.Test;
FuncAssign(FP1);
FuncAssign(FP2);
TestClass1.Free;
end;

{ TestClass }

procedure TestClass.Test(X: Integer);
begin
ShowMEssage('X');
end;

procedure TestClass.Test(X, Y: Integer);
begin
ShowMEssage('X, Y');
end;

end.
 
拜托,大家别老用临时变量赋值这么老土地方法好不好!
OK,我现在把问题Close了,
不过还是欢迎大家提供建议
 
后退
顶部