0

我在 Form1 中有以下代码。

public
  { Public declarations }
  cas: integer;
end;

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

编辑:

现在我在第一个名为“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:

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

EDIT3:这就是在 Form1 中操作“cas”的方式

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

找到了!

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

4

4 回答 4

1

在您最初的问题中,您在对象中声明了一个字段,并且您认为它可能是全局的?

unit unit1;

interface 

uses Stuff;

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

var
  ThisIsAGlobal:Integer;

implementation

uses OtherStuff;

...

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

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

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

于 2012-04-12T15:11:09.667 回答
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引用字段。

于 2012-04-12T15:22:20.133 回答
1

在 上Label10.Caption:=IntToStr(kolecka.cas);,您实际上是在读取casunit 的全局变量kolecka,而不是Form1's 。

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

更新 看来您正在操纵单元的cas变量,而不是表单的变量。我完全不知道德尔福是如何处理这种情况的。但明确指出cas您正在操作的实例是一个好习惯。使用此代码:

self.cas := self.cas + 1;
于 2012-04-12T15:29:54.570 回答
0

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

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

于 2012-04-12T20:25:58.523 回答