全局变量不是全局变量,或者不包含我期望它包含的值?

时间:2012-04-12 15:01:27

标签: delphi

我在Form1中有以下代码。

public
  { Public declarations }
  cas: integer;
end;

然后我使用变量,然后我用Form2.ShowModal;在Form2上调用另一个表单我尝试执行以下操作:Label9.Caption:=Format('%ds',[Form1.cas]);。但无论我做什么,在Form1'cas'中都分配了适当的值,但在Form2中它总是显示“0”。为什么会这样?

编辑:

现在我在第一个名为'kolecka'的单位

var
  Form1: TForm1;
  barvy: array[1..6] of TColor;
  kola: array[1..22] of TShape;
  valid: integer;
  bezi: boolean;
  presnost: real;
  skore: integer;
  chyb: integer;
  kliku: integer;
  cas: integer;

这在另一个名为'dialog'的单元中:

implementation

uses
  kolecka;

{$R *.dfm}

procedure Statistiky();
begin
  With Form2 do begin
    Label8.Caption:=IntToStr(kolecka.skore);
    Label9.Caption:=Format('%ds',[kolecka.cas]);
    Label10.Caption:=IntToStr(kolecka.cas);
    Label11.Caption:=IntToStr(skore);
    Label12.Caption:=Format('%.2f%%',[presnost]);
  end;
end;

但它仍然不起作用..仍显示零。

EDIT2:

我觉得每个答案都说不同,我很困惑......

EDIT3:这就是在Form1中操纵'cas'的方式

procedure TForm1.Timer3Timer(Sender: TObject);
begin
  cas:=cas+1;
  Form1.Label5.Caption:=IntToStr(cas);
end;

发现它!

咩。我想出问题出在哪里 我在Form2 Create而不是Show上分配标签标题,所以当然它们在0>。>

4 个答案:

答案 0 :(得分:1)

在您的原始问题中,您在对象中声明了一个字段,并且您认为它是全局的,也许?

unit unit1;

interface 

uses Stuff;

type 
 TForm1 = class(TForm)
   public
     THisIsAFieldInAnObject:Integer;
 end

var
  ThisIsAGlobal:Integer;

implementation

uses OtherStuff;

...

注意上面放置全局变量的位置。全局变量不是类中的字段。你把东西放在哪里,当你编写代码时称为“你所处的上下文”。在类声明中,像public这样的东西作为可见性说明符是有意义的。它不会使事物变得全局,它使它们对类的用户可见。

要访问全局,请将其作为unitName.VariableName访问,并且不要忘记将“使用unitName”添加到其他单元。

更新您现在正在正确访问全局变量,但它不包含您期望的值。这就是我们开始调试的地方。在设置变量的位置以及将其更改回的任何其他位置设置断点。现在在读取变量的位置设置断点。我发现变量写入在实际发生时效果更好,并且当它们没有被后续写入相同位置的过度写入时,包含不同的值。变量就像一个包含数字的盒子。写入它的零件(你认为被调用的代码没有被调用)或写入它的两件事(你认为应该存在的东西但不存在因为第二个写入第一个值)是你的排序的常见来源混乱。

答案 1 :(得分:1)

您有一个全局变量:kolecka.cas和一个字段kolecka.Form1.cas。那些是不同的。

public
  { Public declarations }
  cas: integer;//This is the field
end;

var
  Form1: TForm1;
  cas: integer;//This is the global variable

Label9.Caption:=Format('%ds',[kolecka.cas]);访问全局变量。

cas的实例方法中的

TForm1引用该字段。

答案 2 :(得分:1)

Label10.Caption:=IntToStr(kolecka.cas);上,您实际上正在阅读单位cas的{​​{1}}全局变量,而不是kolecka的变量。

在第一种情况下,您可能会在调用Form1后尝试操纵Form1.cas。请注意,在您关闭显示为Form2.ShowModal的表单之前,不会执行ShowModal调用后的代码。

<强>更新 看来你正在操纵单位的ShowModal变量,而不是形式的变量。我完全不知道Delphi如何处理这个案子。但明确指出您正在操纵哪个cas实例是一个好习惯。使用此代码:

cas

答案 3 :(得分:0)

我要检查的第一件事是你是否只有一个名为Form1的变量。

我最好的猜测是你有1个单位Unit1(声明TForm1)和单位Kolecka中的1个,但这只是一个假设。