首页
社区
课程
招聘
一个程序里有两个一样的函数
2006-11-16 17:53 4330

一个程序里有两个一样的函数

2006-11-16 17:53
4330
今天看个程序
  FsVersionHash:=GetVersionHash;
然后找  GetVersionHash,结果出来两个
Function GetVersionHash : String; Forward;

Function GetVersionHash : String;
var reg : TRegistry;
    sWinVer : String;
begin
....
end;
请问这是什么意思?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-11-16 18:15
2
0
第一个是第二个函数的声明,第二个才是真正执行的功能函数。
雪    币: 263
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codename 2006-11-16 18:18
3
0
为什么不直接把第二个函数写成
Function GetVersionHash : String; Forward;
begin
....
end;
雪    币: 263
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codename 2006-11-16 18:50
4
0
两个函数都是在implementation之后的
几乎可以把它们看成连续排列的两个函数,这样的方式应该不是申明吧,如果是的话,为什么要这么申明,而不是放在前面申明呢,不懂
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-11-16 19:38
5
0
一般这样使用的函数都会有像如下的形式:
Function GetVersionHash : String; Forward;

Function xxxxFunc:String;
begin
  xxx := GetVersionHash(); //GetVersionHash前面的函数要调用GetVersionHash函数就必须在使用之前声明他才行。
end;

Function GetVersionHash : String;
var reg : TRegistry;
    sWinVer : String;
begin
....
end;

当然,这个函数的声明是在implementation节里,如果不是我说的上面的情况,那么第一种的声明不要也可以。
雪    币: 263
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codename 2006-11-16 21:50
6
0
刚又仔细看了下,发现情况是这样的
这是语句  FsVersionHash:=GetVersionHash;

下面这个函数在语句后面
Function GetVersionHash : String;
begin
....
end;
由于函数在语句后面,如果不用第一个函数的话,那语句是不能调用函数的,所以作者在前面加了那个,也可以说是声明吧
那个函数是这样的
Function GetVersionHash : String; Forward;
现在有个问题,那个Forward;代表什么意思?
雪    币: 263
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codename 2006-11-16 21:54
7
0
简单测试了下
function test: string; Forward;

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(test);
end;

function test: string;
begin
  Result:= '123456';
end;
结果是正确的,但是不懂Forward;代表什么
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-11-16 23:46
8
0
Forward是Delphi的关键字,指示这个函数是一个声明函数,而不是实现函数。这个定义主要是用在前面的函数如果要调用他后面的函数而设定的。
雪    币: 208
活跃值: (371)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
moodsky 8 2006-11-17 09:46
9
0
[ZT]

Delphi 调用协定

32位的Delphi 中增加了新的参数传递方法,称为fastcall:只要有可能,传递到CPU寄存器的参数能多达三个,使函数调用操作更快。这种快速调用协定(Delphi 3确省方式)可用register 关键字标示。

问题是这种快速调用协定与Windows不兼容,Win32 API 函数必须声明使用stdcall 调用协定。这种协定是Win16 API使用的原始Pascal 调用协定和C语言使用的cdecl 调用协定的混合体。

除非你要调用外部Windows函数或定义Windows 回调函数,否则你没有理由不用新增的快速调用协定。 在后面你会看到使用stdcall 协定的例子,在Delphi帮助文件的Calling conventions 主题下,你能找到有关Delphi调用协定的总结内容。

什么是方法?

如果你使用过Delphi 或读过Delphi 手册,大概已经听说过“方法”这个术语。方法是一种特殊的函数或过程,它与类这一数据类型相对应。在Delphi 中,每处理一个事件,都需要定义一个方法,该方法通常是个过程。不过一般“方法”是指与类相关的函数和过程。

你已经在本章和前几章中看到了几个方法。下面是Delphi 自动添加到窗体源代码中的一个空方法:

procedure TForm1.Button1Click(Sender: TObject);
begin
  {here goes your code}end;
Forward 声明

当使用一个标识符(任何类型)时,编译器必须已经知道该标识符指的是什么。为此,你通常需要在例程使用之前提供一个完整的声明。然而在某些情况下可能做不到这一点,例如过程A调用过程B,而过程B又调用过程A,那么你写过程代码时,不得不调用编译器尚未看到其声明的例程。

欲声明一个过程或函数,而且只给出它的名字和参数,不列出其实现代码,需要在句尾加forward 关键字:

procedure Hello; forward;
在后面应该补上该过程的完整代码,不过该过程代码的位置不影响对它的调用。下面的例子没什么实际意义,看过后你会对上述概念有所认识:

procedure DoubleHello; forward;
procedure Hello;
begin
  if MessageDlg ('Do you want a double message?',      mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    DoubleHello  else
    ShowMessage ('Hello');
end;
procedure DoubleHello;
begin
  Hello;  Hello;
end;
上述方法可用来写递归调用:即DoubleHello 调用Hello,而Hello也可能调用DoubleHello。当然,必须设置条件终止这个递归,避免栈的溢出。上面的代码可以在例DoubleH 中找到,只是稍有改动。

尽管 forward 过程声明在Delphi中不常见,但是有一个类似的情况却经常出现。当你在一个单元(关于单元的更多内容见下一章)的interface 部分声明一个过程或一个函数时,它被认为是一个forward声明,即使没有forward关键字也一样。实际上你不可能把整个例程的代码放在interface 部分,不过你必须在同一单元中提供所声明例程的实现。

类内部的方法声明也同样是forward声明,当你给窗体或其组件添加事件时, Delphi会自动产生相应的代码。在TForm 类中声明的事件是forward 声明,事件代码放在单元的实现部分。下面摘录的源代码中有一个Button1Click 方法声明:

type
  TForm1 = class(TForm)    ListBox1: TListBox;    Button1: TButton;    procedure Button1Click(Sender: TObject);  end;
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
softafei 2006-11-17 18:42
10
0
我一直以为Forword关键字在写程序时,可有可无。不知在那个地方看到的:
据说Forword 关键字 在Delphi中是默认的选项。
游客
登录 | 注册 方可回帖
返回