【问题标题】:Delphi Unit local variables - how to make each instance unique?Delphi Unit局部变量-如何使每个实例唯一?
【发布时间】:2011-02-18 19:26:45
【问题描述】:

在下面的单元中,我在 IMPLEMENTATION 部分声明了一个变量 - 单元的本地变量。我还有一个过程,在 TYPE 部分中声明,它接受一个参数并将该参数分配给相关的局部变量。此 TFrame 的每个实例都通过 passMeTheVar 传递一个唯一变量。

我希望它为框架的每个实例保留自己的变量版本,与其他变量不同,并使用它来定义它的操作方式。然而,似乎正在发生的是所有实例都使用相同的值,即使我明确地为每个实例传递了不同的变量。

即:

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 部分中所有类的所有实例共享该单元的实现部分。

【问题讨论】:

    标签: delphi variables local instances delphi-units


    【解决方案1】:

    您将makeThisInstanceX 方法作为类(静态)方法调用,而不是创建类的实例并将其作为对象方法调用。看看这个参考:

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

    【讨论】:

      【解决方案2】:

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

      局部变量将在过程/函数中,例如

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

      如果你想要一个实例变量,即每帧都有自己的副本,把它放在类中:

      type
        TFlexibleUnit = class(TFrame)
           procedure makeThisInstanceX(passMeTheVar:integer);
        private
          myLocalVar: Integer;
        ...
        end;
      

      【讨论】:

      • 贾斯汀,请注意,在单元范围内声明的变量与在单元范围内声明的绝对没有任何关系。您可能会对 Java 感到困惑,因为 Java 中的一切都属于一个类,并且每个源文件只有一个类。在 Delphi 中,这些都不是真的。
      • 实现部分的变量对于 unit 是本地的,但对于单元内的所有代码都是全局的。它与类或实例无关,因为 Delphi 不是“纯”面向对象的语言。
      【解决方案3】:

      框架/单元/类/控件

      我赞赏您为改进代码所做的英勇尝试。但是,从您的问题和 cmets 来看,我很遗憾地通知您,您的理解非常有限。

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

      我放最后一段不是为了教,而是让你衡量你的理解水平。 Delphi 开发人员应该对该段落没有任何问题。我不是想让你感觉不好或炫耀——只是想帮助你。也许 Stack Overflow 目前不适合您。

      作为第一次学习 Delphi 的人,我可能会对一些看似多余的功能感到困惑。但该产品历史悠久,每次添加在添加时都是有意义的。当您一次只需要学习一块时,它也更容易学习。

      【讨论】:

      • 对于遇到任何类型的编程问题的每个人来说,SO 都是正确的地方。我不喜欢投反对票,但我看不出让 OP 离开这个网站对任何人都有多大的帮助,抱歉。
      • -1 因为它不是答案,原因与上层相同。冷静点!
      • 很抱歉,我给人的印象是被动攻击。我向你保证,这不是我的意图。由于你听不到我的声音,更不用说看到我的脸和肢体语言,你只能从我的书面文字中评估我的情绪。 (也许我应该尝试一些表情符号。)然而,我比以往任何时候都更加确信 SO 是一个有限的工具。它确实允许信息交换,但正如 cmets 所示,它并不总是能正确传达情感。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多