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

很多初学者对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. 基于Hadoop开发网络云盘系统客户端界面设计初稿

    基于Hadoop开发网络云盘系统客户端界面设计初稿 前言: 本文是<基于Hadoop开发网络云盘系统架构设计方案>的第二篇,针对界面原型原本考虑有两个方案:1.类windows模式,文件夹 ...

  2. SP2-1503: 无法初始化 Oracle 调用界面

    问题描述: win7下,cmd运行 输入sqlplus报一下错误 SP2-1503: 无法初始化 Oracle 调用界面 SP2-0152: ORACLE 不能正常工作 解决办法 1.cmd右键--以 ...

  3. 转载:JavaScript多线程编程简介

    虽然有越来越多的网站在应用AJAX技术进行开发,但是构建一个复杂的AJAX应用仍然是一个难题.造成这些困难的主要原因是什么呢?是与服务器的异步通信问题?还是GUI程序设计问题呢?通常这两项工作都是由桌 ...

  4. enode框架step by step之消息队列的设计思路

    enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...

  5. bat编程基本知识

    1 声明变量 ::注意=前后不要留空格.随便说一下,在bat中,连续两个冒号表示注释 set var1=test 如果要引用这个变量的话,可以这样写:%var1% 2 echo off/on echo ...

  6. 前端:JS获取单击按钮单元格所在行的信息

    在操作表格前后端交互式时,总会遇到将所要操作的行的信息传至后台进行数据库更新的操作,本文适用于标准的html页面和js库,并提出了三种操作方式根据实际情况进行选择 1.表格格式如图所示 2.表格代码如 ...

  7. 浅谈敏捷组织中PMO的角色

    所谓的"敏捷组织"其实并没有标准的模式,而且PMO(项目管理办公室)并没有一个标准的角色定义.有一个非常普遍的误解,公司在选择"敏捷"或者"瀑布&qu ...

  8. jsp-1 简单的应用servlet,并用其跳转页面

    jspweb里面用到的servlet跳转页面的方法 使用的jar包只有 commons-lang3-3.5.jar 运行时,tomcat会先根据web.xml里面的信息,查找servlet <? ...

  9. js实现表格的增删改查

    这份代码实现了对表格的增加,删除,更改,查询. 点击一次添加按钮,表格会增加一行. 点击重置按钮,输入框的内容会被清空. 添加一行后,最后两格为更改和删除.点击更改,原有内容会各自显示在一个输入框内, ...

  10. 【Backbone】 Backbone初探

    前言 在此之前研究了一段React,但是不得不承认React.Vue等MVVM框架相对于原有的Jquery来说,简直是翻天覆地的不同.它们之间的差异不仅仅体现在框架思维的不同,而是ES5到ES6的编程 ...