完全摘自网络(一件飘雪),供参考:
很多初学者对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语句声明的地方,实际效果是一样的,没有什么差别吧。 以上是个人理解,有错误或不全之处还望大家指出更正之。 |