Delphi Unit局部变量 - 如何使每个实例都是唯一的?

时间:2010-05-12 19:30:38

标签: delphi variables local instances delphi-units

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

3 个答案:

答案 0 :(得分:8)

myLocalVar是一个全局变量,但只能在单位内看到。

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-2)

frame / unit / class / control

我赞赏你的英勇尝试,以改善代码。但是,根据您的问题和评论判断,我很遗憾地告诉您,您的理解非常有限。

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

我没有把最后一段用于尝试教学,但允许你衡量你的理解水平。 Delphi开发人员应该对该段没有任何问题。我不是想让你感觉不好或炫耀 - 只是想帮助。也许Stack Overflow目前不适合您。

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