1

在下面的单元中,我在 IMPLEMENTATION 部分中声明了一个变量 - 单元本地。我还有一个过程,在 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部分中所有类的所有实例共享该单元的实现部分。

4

3 回答 3

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;
于 2010-05-12T19:43:25.693 回答
1

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

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

于 2010-05-12T19:34:27.417 回答
-2

框架/单元/类/控制

我为您改善代码的英勇尝试表示赞赏。但是,从您的问题和评论来看,我很遗憾地通知您,您的理解非常有限。

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

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

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

于 2010-05-12T20:43:03.900 回答