0

Form1 に次のコードがあります。

public
  { Public declarations }
  cas: integer;
end;

次に、変数を操作し、 Form2.ShowModal;On 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;

しかし、それはまだ機能しません..まだゼロを示しています。

EDIT2:

私はすべての答えが異なることを言っているように感じ、私は非常に混乱しています..

EDIT3: これは Form1 で「cas」を操作する方法です

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

それを見つけた!

うーん。どこに問題があるかがわかりました。
Show ではなく Form2 Create でラベル キャプションを割り当てていたので、もちろん 0 >.> でした。

4

4 に答える 4

1

Label10.Caption:=IntToStr(kolecka.cas);では、実際には unit のグローバル変数ではなく、 unit のグローバル変数を読み取っていcasます。koleckaForm1

Form1.cas最初のケースでは、呼び出し後に操作しようとしている可能性がありますForm2.ShowModal。ShowModal 呼び出しに続くコードは、 で示されているフォームを閉じるまで実行されないことに注意してくださいShowModal

更新casフォームの変数ではなく、 ユニットの変数を操作しているようです。Delphi がこのケースをどのように扱っているかは正確にはわかりません。casただし、操作しているインスタンスを明示的に示すことをお勧めします。次のコードを使用します。

self.cas := self.cas + 1;
于 2012-04-12T15:29:54.570 に答える
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

元の質問では、オブジェクトのフィールドを宣言しましたが、それはおそらくグローバルだと思いましたか?

unit unit1;

interface 

uses Stuff;

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

var
  ThisIsAGlobal:Integer;

implementation

uses OtherStuff;

...

上記のグローバルを配置した場所に注意してください。グローバル変数は、クラス内のフィールドではありません。何かを置く場所、コードを書くときのことを「現在のコンテキスト」と呼びます。クラス宣言内では、可視性指定子のようなものpublicが理にかなっています。物事をグローバルにするのではなく、クラスのユーザーに見えるようにします。

グローバルにアクセスするには、unitName.VariableName としてアクセスし、「Uses unitName」を他のユニットに追加することを忘れないでください。

更新グローバル変数に正しくアクセスできるようになりましたが、期待した値が含まれていません。ここからデバッグを開始します。変数を設定した場所と、変数が 0 に戻された場所にブレークポイントを設定します。次に、変数を読み取る場所にブレークポイントを設定します。変数の書き込みが実際に発生した場合、および異なる値を含む同じ場所への後続の書き込みによって上書きされていない場合、変数の書き込みがより適切に機能することがわかりました。変数は、数字が入った箱のようなものです。ゼロの書き込み (呼び出されたと思っていたコードが呼び出されなかった) または 2 つの書き込み (そこにあるはずなのに、2 番目の書き込みが最初の値をザッピングしたために存在しない) は、あなたの種類の一般的なソースです。混乱の。

于 2012-04-12T15:11:09.667 に答える
0

最初に確認することは、Form1 という名前の変数が 1 つしかないかどうかです。

私の最善の推測では、 unit Unit1( TForm1 が宣言されている場所) に 1 、 unitKoleckaに 1 があると思いますが、それは単なる仮定です。

于 2012-04-12T20:25:58.523 に答える