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

很多初学者对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语句声明的地方,实际效果是一样的,没有什么差别吧。

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

delphi变量作用域的更多相关文章

  1. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  2. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  3. Java基础知识笔记(七:接口、变量作用域和参数传递)

    一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格 ...

  4. PHP常量、变量作用域详解(一)

    PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...

  5. PHP变量作用域详解(二)

    学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...

  6. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  7. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  8. 变量作用域&函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  9. OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...

随机推荐

  1. 新时代的Vim C++自动补全插件 clang_complete

    Vimer的福音 新时代的Vim C++自动补全插件 clang_complete   使用vim的各位肯定尝试过各种各样的自动补全插件,比如说大名鼎鼎的 OmniCppComplete .这一类的插 ...

  2. 5款最好用的开源Web快速开发工具

    1.Aptana Studio Aptana是一个用于HTML,CSS和JavaScript的网站开发工具.目前在社区里有成千上万的人在开发Aptana的插件. Apatana Studio官网:ht ...

  3. 最受欢迎的Web开发工具

    1)WebBuilderWebBuilder是一款开源的可视化Web应用开发和运行平台.基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成常规应用和面向手机的移动应用开发:高效.稳定和可扩展的 ...

  4. JS关闭当前页面的方法

    JS关闭当前页面的方法 一.不带任何提示关闭窗口的js代码 1 <a href="javascript:window.opener=null;window.open('','_self ...

  5. Js继承小结

    Js继承小结 一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.n ...

  6. hdu 1728 搜索求最少的转向次数

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. Qt在表格中加入控件

    任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...

  8. 百度地图在某架构下找不到符号.a文件的问题

    1.现象: 就是说找不到符号给i386的架构(就是模拟器).或者找不到符号给arm架构(真机). ld: warning: ignoring file /Users/pufang/xcode/demo ...

  9. Android打开系统设置

    今天在做项目过程中,遇到一个问题:用户体验某个功能时需要查看用户是否已经打开了GPS定位服务,若没有则要求进入定位服务设置界面. 下面就直接贴出代码 以下代码是放在了Button的监听事件里,只贴出重 ...

  10. 代码用于脚本语言开发平台Script.NET即将开源

    文章结束给大家来个程序员笑话:[M] 为了放慢Script.NET的开展,蓝蚂蚁工作室将在近期将Script.NET的全部代码开源,因为开源之前需要将代码先整理一遍,大约需要一周时间,筹划7月初可以整 ...