全局变量不是全局变量还是不包含我希望它包含的值?

  • 本文关键字:全局变量 包含 我希望 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;

在另一个称为"对话框"的单元中:

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;

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

编辑2:

我觉得每个答案都说了不同的东西,我很困惑。

编辑3:这就是在表单1中操纵"cas"的方式

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

找到了!

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

在你最初的问题中,你在一个对象中声明了一个字段,你认为它是一个全局的,也许?

unit unit1;
interface 
uses Stuff;
type 
 TForm1 = class(TForm)
   public
     THisIsAFieldInAnObject:Integer;
 end
var
  ThisIsAGlobal:Integer;
implementation
uses OtherStuff;
...

请注意你把全局变量放在上面的位置。全局变量不是类中的字段。你放东西的地方,当你写代码时被称为"你所处的上下文"。在类声明中,类似于 public 的东西作为可见性说明符是有意义的。它不会使事物全局化,而是使它们对类的用户可见。

要访问全局,请将其作为 unitName.VariableName 访问,并且不要忘记将"使用 unitName"添加到另一个单元。

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

您有一个全局变量: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 是指字段。

Label10.Caption:=IntToStr(kolecka.cas);上,你实际上是在读取单位koleckacas全局变量,而不是Form1的全局变量。

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

更新您似乎正在操纵单位的cas变量,而不是表单的变量。我完全不知道德尔福是如何处理这个案子的。但是,最好明确指出您正在操作哪个cas实例。使用此代码:

self.cas := self.cas + 1;

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

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

最新更新