unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    int_a:int;//***1
    { Public declarations }
  end;var
  Form1: TForm1;
  int_b:int;//***2implementation{$R *.DFM}
var
int_c:int;//***3procedure TForm1.Button1Click(Sender: TObject);
begin
//do something
end;end.
全局变量大家一定用的很多,但是它却可以在多个地方进行定义(或许有一个或者几个地方定义是错误的),我以上面的一个最基本的unit为例子,在打星号的1,2,3三个地方我都可以定义全局变量。我认为,三者是有区别的,区别在于,1,2两个地方定义的,其他unit可以用到,而3定义的只有在本unit中使用。到底1,2有何区别?或者还有什么其他的区别?还望大家一起讨论!

解决方案 »

  1.   

    位置1处定义:是类TForm1的变量,如果本单元中有其他的类或者其他单元,那么在其过程中引用时要先写出"form1."。
    位置2处定义:是本单元的变量,所以本单元内所有的类或者其他单元(当然要引用本单元)都可以直接引用。
       以上为本人愚见,请不吝赐教!
      

  2.   

    guestman(天涯浪子)说的很有道理,1中的变量应该是归因到form类中在公共区的一个属性,令我茅塞顿开!这样说的话2更象是个全局变量了,是否可以说在3中定义的是单元的全局变量,而在2中定义的是工程的全局变量呢?但是1和3所能达到的效果是一样的,从性质上有区别,实质上呢?真的要用,该用哪个?或者说在什么情况下用1定义,什么情况下用2来定义会比较合适?
      

  3.   

    第一樓說的對guestman(天涯浪子)
    基礎知識,學習
      

  4.   

    建议看看Delphi帮助《Object Pascal Reference》中有关作用域(Scope)的帮助主题,会有很大帮助的。俺贴一小段:命名冲突
    当一个块封装了另一个块时,前者叫做外部块,后者叫做内部块。如果声明在外部块中的标识符又在内部块中重新声明(同名),那么在整个内部块中,内部块声明的标识符将忽略外部块中的声明(也就是说,编译器在整个内部块中都将该标识符作为内部块的声明解释和使用)。例如,如果在单元的接口节声明了变量MaxValue,然后在单元中的某个函数中声明了同名变量,并且在函数块中引用时没有冠以任何限定词,那么函数块中对MaxValue的引用将解释为局部变量,即函数中的声明。同样,函数中如果创建了另一个函数,在外部作用域中使用的标识符,在内部域中也可以重新声明同名的局部变量(见当前主题编者注中的过程和函数的嵌套定义)。多重单元引用使作用域的定义变得更为复杂。列在uses子句中的每个单元都强制增加了一个新的作用域,该作用域封装了被使用的其他单元、程序以及包含在该单元uses子句中的单元。uses子句中的第一个单元表示了最外层的作用域,紧接其后的单元表示了在该作用域内的新的作用域。如果在两个或更多单元的接口节中声明了相同标识符,那么当引用该标识符而没有冠以限定词时,将选择最内层作用域中的声明,也就是说,选择引用该标识符的单元,或者,如果该引用该标识符的单元中没有对其声明,那么将选择在单元uses子句的单元列表中最后一个声明了该标识符的单元。(见当前主题编者注中的接口节中uses子句对作用域的影响和接口节和实现节中uses子句对作用域的影响)Borland提供的System单元自动被每个程序或单元使用。System单元中的所有声明和编译器能自动识别的预定义类型、例程、常量等一起,总是作为最外层的作用域。(见当前主题编者注中的唯一特殊的System单元)可以通过使用冠以限定词的标识符(见限制标识符)或with语句(见With语句)来超越上述作用域规则从而绕过内层作用域的声明。