代码之家  ›  专栏  ›  技术社区  ›  J...

Delphi单元局部变量-如何使每个实例唯一?

  •  1
  • J...  · 技术社区  · 16 年前

    在下面的单元中,我有一个在实现部分中声明的变量-该单元的本地变量。我还有一个过程,在type部分中声明,它接受一个参数并将该参数赋给相关的局部变量。此tframe的每个实例都通过 passMeTheVar .

    我要它做的是让框架的每个实例保持它自己的变量版本,与其他变量不同,并使用该版本定义它的操作方式。然而,似乎正在发生的是,所有实例都使用相同的值,即使我显式地将不同的变量传递给每个实例。

    IE:

    Unit FlexibleUnit;
    interface
    uses
    //the uses stuff
    type
    TFlexibleUnit=class(TFrame)
       //declarations including
       procedure makeThisInstanceX(passMeTheVar:integer);
    private
    //
    public
    //
    end;
    
    implementation
    uses //the uses
    var myLocalVar;
    
    procedure makeThisInstanceX(passMeTheVar:integer);
    begin
    myLocalVar:=passMeTheVar;
    end;
    
    //other procedures using myLocalVar 
    //etc to the 
    end;
    

    现在在另一个窗体中的某个位置,我将此框架放到了设计窗格中,有时其中两个框架位于一个窗体上,并在适当的位置声明它,等等。每个框架都是唯一的:

    ThisFlexibleUnit : TFlexibleUnit;
    ThatFlexibleUnit : TFlexibleUnit;
    

    当我做一个:

    ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
    ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"
    

    它们似乎都共享同一个变量“mylocalvar”。

    原则上,我这样做是错误的吗?如果这是正确的方法,那就是调试我拥有的东西(这太大了,无法发布),但是如果原则上这是不正确的,那么有没有一种方法可以按照我的建议来做呢?

    编辑:

    好的,这里学到的教训是,类的定义就是这样的。许多类可以放在一个单元中,并且 Type 共享单元的实施部分。

    3 回复  |  直到 13 年前
        1
  •  8
  •   jasonpenny    16 年前

    mylocalvar是一个全局变量,但仅在单元内可见。

    局部变量应该在过程/函数中,比如

    procedure makeThisInstanceX(passMeTheVar: integer);
    var
      myLocalVar: Integer;
    begin
      myLocalVar := passMeTheVar;
    end;
    

    如果需要实例变量,即每个帧都有自己的副本,请将其放入类中:

    type
      TFlexibleUnit = class(TFrame)
         procedure makeThisInstanceX(passMeTheVar:integer);
      private
        myLocalVar: Integer;
      ...
      end;
    
        2
  •  1
  •   David M    16 年前

    你在打电话给 makeThisInstanceX 方法作为类(静态)方法,而不是创建类的实例并将其作为对象方法调用。看看这个参考文献:

    http://oreilly.com/catalog/delphi/chapter/ch02.html

        3
  •  -2
  •   Pete R.    16 年前

    框架/单元/等级/控制

    我赞赏你为完善密码所作的英勇努力。但是,从你的问题和评论来看,我很遗憾地通知你,你的理解是非常有限的。

    框架不是非类的单元。框架是一个类,但不是每个类都是框架。框架是控件,但并非每个控件都是框架。单元有接口和实现(以及初始化和终结)部分。类具有私有和公共(以及受保护和发布的)部分。

    我没有把最后一段放在试图教,而是让你衡量你的理解水平。Delphi开发人员应该对段落没有问题。我不是想让你难过,也不是想炫耀——只是想帮你。也许此时堆栈溢出不是适合您的工具。

    作为第一次学习Delphi的人,我可能会被一些看似多余的特性所迷惑。但是这个产品有着悠久的历史,每一次添加都是有意义的。当你只需要一次学习一个片段时,学习起来也比较容易。