var
  Form1: TForm1;
  Y:integer;
implementation{$R *.dfm}
var
  X:integer;请教个问题,Y和X声明的位置不同,有什么区别吗?
那个private和public区域的声明好理解,是对外开放,共有还是私有变量的意思。但是上面的两个变量X,Y,位置不同,有什么特别的地方吗?和private区和public区有区别吗?

解决方案 »

  1.   

    X和Y都属于全局变量。而private区和public区的是类变量,要通过类实例来访问。X与Y的区别不大,但还是有的。
    比如当如下定义时:
    var
      Form1: TForm1;
      Y:integer;
    implementation{$R *.dfm}
    procedure test();
    begin
      y := 0; //使用正确
      x := 100;//这样子编译是会出错的,提示X未定义。
    end;
    var
      X:integer;

    var
      Form1: TForm1;
      Y:integer;
    implementation{$R *.dfm}
    var   X:integer;
    procedure test();
    begin
      y := 0; //使用正确
      x := 100;//使用正确
    end;
      

  2.   

    如果LZ举例的单元被别的单元引用时
    Y能在别的单元调用
    X不能
      

  3.   

    Y相当于public
    X相当于private
      

  4.   


    主要是作用域名不同,对其它单元来说区别是由谁来调用...在public下是类的实例调用
    在Y位置直接使用
    在X位置不能被访问
      

  5.   

    Y是只要别的单元引用了它,就可以用Y,而X只对本单无有效。
      

  6.   

    不过我觉得最好还是别这样用,还是放在
    private
    public
    里面。
      

  7.   

    要想声明全局变量必须在Public下声明的
      

  8.   

    1:public和private中声明的成员,一定需要通过类来引用
    例如
    TTest = class
    private
      FVar1: string;
      function GetVar1(): string;
    public
      FVar2: string;
    end;引用FVar2需要按照以下的方式,实例化对象,再引用对象成员。注意,FVar2一定是通过对象Test来引用的,不可以在外部直接引用。如果是在TTest内部引用,self可以省略。
    var
      Test: TTest;
      S: string;
    begin
      Test:= TTest.create;
      S:= Test.FVar2;
      S:= Test.FVar1; // 这一行出错,私有变量不能被外部引用,只能在内部通过Self来引用,Self可以省略
    end;这里有个小技巧,如果你是在TTest声明所在的单元内部,调用TTest的私有成员,形如 S:= Test.FVar1;,是可以编译通过的,只有在TTest声明以外单元中调用私有成员才会出错。2:implementation 指示字,是用来分割 接口声明部分(interface)和实现部分(implementation)。
    这里说的接口声明部分interface,和接口interface,虽然关键字相同,但表示的意义不同。我虽然不知当初Anderson 为什么把delphi设计成这样,但是我感到这样设计至少有两个好处,第一,类似于C中的函数前向声明,第二,加快编译速度,由于只需要将Unit中interface部分先预编译了,就使得在使用代码提示时,不必等待很长时间。接口声明interface中声明的所有类型type 变量var 常量 const 都可以被本单元unit和其他单元引用(只需要外部单元在uses中添加单元引用即可)实现部分 implementation
    本意是指 声明的 类中函数 以及 静态函数的 函数体实现部分,但,其实implementation起到一个命名空间的隔绝作用,也就是说在implementation部分中声明的类型和变量只可以被本单元unit的函数访问。如果是声明变量
    implementationvar
      s: string; // s只能从声明的地方起,一直到单元结束end. 之间的函数可以访问如果是声明类型
    1:public和private中声明的成员,一定需要通过类来引用
    例如
    TTest = class
    private
      FVar1: string;
      function GetVar1(): string;
    public
      FVar2: string;
    end;引用FVar2需要按照以下的方式,实例化对象,再引用对象成员。注意,FVar2一定是通过对象Test来引用的,不可以在外部直接引用。如果是在TTest内部引用,self可以省略。
    var
      Test: TTest;
      S: string;
    begin
      Test:= TTest.create;
      S:= Test.FVar2;
      S:= Test.FVar1; // 这一行出错,私有变量不能被外部引用,只能在内部通过Self来引用,Self可以省略
    end;这里有个小技巧,如果你是在TTest声明所在的单元内部,调用TTest的私有成员,形如 S:= Test.FVar1;,是可以编译通过的,只有在TTest声明以外单元中调用私有成员才会出错。2:implementation 指示字,是用来分割 接口声明部分(interface)和实现部分(implementation)。
    这里说的接口声明部分interface,和接口interface,虽然关键字相同,但表示的意义不同。我虽然不知当初Anderson 为什么把delphi设计成这样,但是我感到这样设计至少有两个好处,第一,类似于C中的函数前向声明,第二,加快编译速度,由于只需要将Unit中interface部分先预编译了,就使得在使用代码提示时,不必等待很长时间。接口声明interface中声明的所有类型type 变量var 常量 const 都可以被本单元unit和其他单元引用(只需要外部单元在uses中添加单元引用即可)实现部分 implementation
    本意是指 在声明部分interface中声明的 类函数 以及 静态函数 的函数体实现部分,但,其实implementation起到一个命名空间的隔绝作用,也就是说在implementation部分中也可以声明类型type,变量var,常量const,单元引用uses,这些声明的类型和变量只可以被本单元unit的函数访问。特别之处,在implementation中声明的类型type,变量var,常量const不一定要写在紧跟着implementation之后,而是可以写在任何部分,其作用域是从声明的地方起,至单元结束end.止。在implementation中引用列表uses还有一种特殊用途,是用来解决单元间循环引用的问题,例如,如果两个单元需要互相引用对方,如果都写在 interface部分的uses中,就会引起编译器报错:循环引用单元。解决方法是,在一个单元用的引用写在interface的uses中,在另一个单元中的引用写在implementation的uses中。最后再多罗嗦一句,在楼主的示例中 {$R *.dfm} 这个编译指示字表示的是在单元所在目录下搜索和单元同名的dfm文件,找到后将其编译进resource中。
      

  9.   

    楼上可以删除,我的编辑有问题。以下为准1:public和private中声明的成员,一定需要通过类来引用
    例如
    TTest = class
    private
      FVar1: string;
      function GetVar1(): string;
    public
      FVar2: string;
    end;引用FVar2需要按照以下的方式,实例化对象,再引用对象成员。注意,FVar2一定是通过对象Test来引用的,不可以在外部直接引用。如果是在TTest内部引用,self可以省略。
    var
      Test: TTest;
      S: string;
    begin
      Test:= TTest.create;
      S:= Test.FVar2;
      S:= Test.FVar1; // 这一行出错,私有变量不能被外部引用,只能在内部通过Self来引用,Self可以省略
    end;这里有个小技巧,如果你是在TTest声明所在的单元内部,调用TTest的私有成员,形如 S:= Test.FVar1;,是可以编译通过的,只有在TTest声明以外单元中调用私有成员才会出错。2:implementation 指示字,是用来分割 接口声明部分(interface)和实现部分(implementation)。
    这里说的接口声明部分interface,和接口interface,虽然关键字相同,但表示的意义不同。我虽然不知当初Anderson 为什么把delphi设计成这样,但是我感到这样设计至少有两个好处,第一,类似于C中的函数前向声明,第二,加快编译速度,由于只需要将Unit中interface部分先预编译了,就使得在使用代码提示时,不必等待很长时间。接口声明interface中声明的所有类型type 变量var 常量 const 都可以被本单元unit和其他单元引用(只需要外部单元在uses中添加单元引用即可),接口声明部分不能实现函数。实现部分 implementation
    本意是指 在声明部分interface中声明的 类函数 以及 静态函数 的函数体实现部分,但,其实implementation起到一个命名空间的隔绝作用,也就是说在implementation部分中也可以声明类型type,变量var,常量const,单元引用uses,这些声明的类型和变量只可以被本单元unit的函数访问。特别指处,在implementation中声明的类型type,变量var,常量const不一定要写在紧跟着implementation之后,而是可以写在任何部分,其作用域是从声明的地方起,至单元结束end.止。在implementation中引用列表uses还有一种特殊用途,是用来解决单元间循环引用的问题,例如,如果两个单元需要互相引用对方,如果都写在 interface部分的uses中,就会引起编译器报错:循环引用单元。解决方法是,在一个单元用的引用写在interface的uses中,在另一个单元中的引用写在implementation的uses中。最后再多罗嗦一句,在楼主的示例中 {$R *.dfm} 这个编译指示字表示的是在单元所在目录下搜索和单元同名的dfm文件,找到后将其编译进resource中。