这一切都取决于可见性。
在单元的接口部分(但在类和其他类型定义之外)声明的类型、变量、常量、过程和函数对其他单元是可见的,而在单元的接口部分中声明的类型、变量、常量、过程和函数一个单元的实现部分只能在同一个单元中使用(并且只能在声明下方)。因此,如果您需要特定单元中的类型/变量/函数/...,但不希望标识符在单元之外有意义,那么最好在需要它们之前在实现部分中声明它们.
此外,对于类,它们的标识符可以声明为私有、严格私有、公共、受保护和发布。这又是由于不同种类的能见度。私有标识符只能在类本身内部使用(或在同一单元中定义的其他类,除非 strict 私有),依此类推。
另外,请注意:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
alpha: integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
var
beta: integer;
implementation
{$R *.dfm}
end.
由于alpha 是类 TForm1 的成员,因此该类的每个实例,即该表单的每个对象(即该类创建的每个表单)都将有它的自己的 alpha 变量。另一方面,beta,在任何类之外的单元中声明,是“每个单元一个”,即每个TForm1 对象将看到相同的beta。 (还有“类变量”之类的。请参阅文档了解更多详细信息。)
(另外,您可能已经知道这一点,但在这种情况下
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm3 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
begin
beep;
end;
end.
您没有两个名为FormCreate 的函数,但只有一个。该函数的第一个引用是声明,它是interface 部分中类声明的一部分,其他类和单元将看到它。 FormCreate 函数(或其定义)的实际实现始终位于implementation 部分。实际上,其他类或单元不需要知道特定类中函数的确切实现。)
最后,推荐一下Delphi官方文档,非常好。从http://docwiki.embarcadero.com/RADStudio/en/Delphi_Language_Guide_Index开始。