delphi变量作用域

时间:2023-02-05 17:29:31

完全摘自网络(一件飘雪),供参考:

很多初学者对delphi单元的变量和函数访问权限不理解,在此我举例说明,希望初学者看此文后能茅塞顿开。

delphi单元的变量和函数访问权限问题如下两个单元描述:

unit Unit1;

interface

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

type
//===============================对象及其成员区域===============================
TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
    str1:string;                        //在此区域定义的私有变量和私有函数只能在本单元Unit1使用
public
    str2:string;                        //在此区域定义的公有变量可以在其它单元使用,但必须先引用此单元 uses unit1; 然后使用Unit1.Form1.str2; 成员变量str2是对象Form1的成员,必须通过对象Form1才能得到成员str2
    function public1(a:String):String ; //在此区域定义的公有函数可以在其它单元使用,但必须先引用此单元 uses unit1; 然后使用Unit1.Form1.pub1(2); 成员函数pub1是对象Form1的成员,必须通过对象Form1才能得到成员函数pub1
    { Public declarations }
end;
//===============================对象及其成员区域===============================

//=====================================全局区域=================================
//在此区域定义的变量和函数是全局的,对其它单元都是可见的,只要该单元uses unit1 则可可以直接引用该区域的变量和函数

// 全局变量最好统一写到一个文件里面。

TChar3 = array[0..2] of Char;
TString3 = array[0..2] of String;
function all(str:String):string;   //全局函数,不属于某个对象
var
Form1: TForm1;
chr:TChar3;          //全局变量,不属于某个对象
str3:TString3;
//=====================================全局区域=================================
implementation

uses Unit2;

{$R *.dfm}
//====================================局部区域==================================
//在此区域定义的变量和函数是局部的,只能在本单元Unit1使用,对其它单元是不可见的
var
str4:string;
function local1(a:String):String ;
begin
Result := a;
end;
//====================================局部区域==================================

function TForm1.public1(a:String):String ;
begin
Result := a;
end;

function all(str:String):string;
procedure localfunction; //此处定义的局部函数dudu只能在function all(str:String):string;使用
begin
    ShowMessage('函数内部使用');
end;
begin
    result:=str;
    localfunction;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
str1:='1112';
str2:='3333';
str4:='4433';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.ShowModal;
end;

end.

unit Unit2;

interface

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

type
TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Form2: TForm2;

implementation
   uses Unit1;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
    chr[0]:='c';
    showmessage('全局变量'+chr[0]);
    str3[0]:='全局变量';
    showmessage(str3[0]);
    showmessage('公共变量'+Unit1.Form1.str2);
    showmessage(Unit1.Form1.public1('公共函数'));
    showmessage(all('全局函数'));
    //showmessage('私有变量'+Unit1.Form1.str4); //不可以引用
    //showmessage('局部函数'+Unit1.Form1.local1('dd')); //不可以引用
end;

end.

unit文件结构实例:
unit Unt1;
interface
uses Windows, Messages, SysUtils;  
type
  Tfrm1 = class(TForm)
  private
    {code1}
  public
    {code2}
  end;
var
  {code3}
implementation
uses untpublic;
  {code4}
end;

作用域:
1.在code3处声明的全局变量可以被Unt1及其所属工程(project1)的其他Unit文件访问(只要其他unit声明了uses unt1)
2.在code2处声明的全局变量和code3处的变量作用域相同
3.在code1处声明的全局变量只能被Unt1内部访问即使其他Unit文件声明了uses unt1
4.在code4处声明的局部变量只能在所属的函数或方法内访问
生命周期:
1.code3处声明的全局变量在Unt1结束时(区别于Tfrm1结束时)销毁,这种情况大多发生在所属工程(project1)结束时
2.code1和code2处的全局变量在Tfrm1结束(比如Tfrm1.free)时销毁
4.code4处的局部变量在所属的方法或函数调用结束时销毁
另外
实例中两处uses语句声明的地方,实际效果是一样的,没有什么差别吧。

以上是个人理解,有错误或不全之处还望大家指出更正之。