您好,请教过程指针应该怎么用 ? 下面的代码编译可以通过但执行有误,谢谢(50分)

P

pcgod

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,在如下代码中我定义了一个返回 String 的过程指针,但在使用中有误。
对过程指针我是这样想的,请指正:
定义了一个过程指针后系统将为这个类型分配一段存储空间,过程指针的类型名指向这段
空间的首地址。 该过程指针的实例变量也都指向这个首地址 。

请大家看看下面的代码,我作错在哪儿了?
还有, TThePas = procedure(APas: TThreadMe) of object; 这样定义的过程
指针返回的是什么 ?
谢谢

unit Unit1;
interface
uses
...
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TGetString = Function (i : Integer) : String ;

var
Form1: TForm1;
VGetS : TGetString ;

implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption := Caption ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(VGetS(1)) ;
end;
end.

谢谢
 
他是一个过程指针,并不是一个函数
 
TGetString = Function (i : Integer) : String ;
你好像不应该定义成函数,而应该是过程。
像上面那样定义有二义性吧,系统怎么知道得到的是函数的返回值还是指针呢?

如果要返回值可以用var参数吧。
 
过程指针 VGetS 没有初始化
 
unit Unit1;

interface

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

type
TGetString = Function (i : Integer) : String ;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
VGetS : TGetString ;


implementation
Function Getstring(i:integer):string;
begin
result:=inttostr(i);

end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Vgets:=Getstring;//!!!!!!!!!!!!!
showmessage(Vgets(1));
end;

end.
 
VGetS 是什么东东?
 
resun : 您好,谢谢您的回复,但是如果按照您给的代码还不如直接写成函数:),失去了定义过程指针的含义,您说呢?
薄荷:您好,我这样想的,也不知道对不对,望大家指正
TGetString = Function (i : Integer) : String ;
VGetS : TGetString ; //相当于定义了:
Function VGetS(i : Integer) : String ;
Begin
End;
(是不是我还要写一个函数体 ?)

过程指针到底应该怎么用? 能写一个例子吗? 谢谢
 
过程指针要指向一个过程的入口地址,你连过程都没有就用它当然会出错了。
PS: Delphi 里的所有事件都是过程指针.
比如:
Button1.OnClick = YourOnClickProcedure;
Button1.OnClick(nil);
 
你让我说什么好呢?我给你写的是书上的例子,:-<
不过,声明方法指针时必须加上of object,表示它所指的是个对象的方法
例如
type TNotifyEvent= Procedure (sender:TObject) of object
有了方法指针后,要扩展一个对象,不需重新派生出一个新的对象,只要把其它的对象
的方法赋给这个方法方法指针就可以了,这样做只是为了避免对象的层次过多而已
 
function test(i: integer): string;
begin
result := inttostr(i);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
VGetS := test ;
ShowMessage(VGetS(1)) ;
end;
 
resun : 抱歉 ,向您道歉
我初学,什么都不懂让您见笑了。
您的例子中
Function Getstring(i:integer):string;begin
result:=inttostr(i);
end;
然后调用。 我觉得如果这样写,就完全没有必要定义一个过程指针,直接给这样一个函数
就可以用。 我不是为了实现功能,只是想知道过程指针一般用在哪儿,怎么用 ?
能否解释一下这句的含义? 尤其 Of Object
type TNotifyEvent= Procedure (sender:TObject) of object

希望能得到您的再次指导,再次向您道歉。

望大家指导,谢谢

 
定义过程指针,一般是因为你没法直接使用原来那个函数或过程。
比如说你要从动态连接库里动态的引出一个函数GetString(i: integer),怎么实现呢?
首先,你要得到dll的句柄:dllHandle := LoadLibrary('str.dll');
然后,得到里面的某个函数的地址: GetProcAddress(dllHandle,'GetString');
得到地址然后怎么执行呢?这时候就需要你定义一个和getString一样的过程指针,然后
吧得到的地址赋给它: VGetS := GetProcAddress(dllHandle,'GetString');
然后你就可以执行VGetS了,就和执行dll中的GetString一样了:
dd := VGetS(23);
 
谢谢 ,谢谢各位

函数/过程类型:

type

//定义一个函数类型 . 任何函数*只要其参数为 Integer ,返回为 String

,就
//可以赋给这个函数类型的实例(变量)
//* : 该函数形参只有参数名可以和函数类型定义处的不同,参数传递方

式一定要相同
// TGetString = Function (var i : Integer) : String ; //时下

例编译错


TGetString = Function (var i : Integer) : String ;

var
VGetS : TGetString ;


Function pp(k: Integer) : String ;
begin
Result := IntToStr(k + 100) ;
end ;
// PP 符合TGetString类型

VGets := pp ;
ShowMessage(VGets(1)) ;

还有,在 DLL 中使用,如楼上所讲

但我还是不懂

TThePas = procedure(APas: TThreadMe) of object; 这样定义的过程
指针返回的是什么 ?

有何用途 ?

谢谢
 
TThePas = procedure(APas: TThreadMe) of object;
这不是指针,而是指针类型。
var
MyPointer:TThePas;
这才是指针.
 
过程变量没有初始,需要指向一个真正的函数!
 
谢谢楼上两位:)
您能否写一个小例子 ,用
TThePas = procedure(APas: TThreadMe) of object;


谢谢
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Tt(n:integer);
end;
TThePas = procedure(n:integer) of object;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
p:TThePas;
begin
p:=TT;
p(2);
end;

procedure TForm1.Tt(n: integer);
begin
showmessage(inttostr(n));
end;

end.
 
谢谢您,我觉得您给的这个例子和前面的过程/函数类型中不带 of Object 的情形相同

TThePas = procedure(n:integer) of object; //中 , Of Object 的作用是什么呢 ?您
能否就这一点举个例子 ? 谢谢您
 
of Object 表示过程指针指向的过程必须是一个类的方法,而不是普通的过程.
 
顶部