2011-01-23 6 views
2

Tform2が作成された後、ユーザーにメッセージを表示したいとき。 私はこのコードを使用しますが、うまく機能しません。Tform2の作成時にメッセージを表示しますか?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a:TForm2; 
begin 

if a=nil then 
begin 
    a := TForm2.Create(Self); 
    a.Show; 
end 
else 
begin 
    showmessage('TForm2 is created'); 
end; 

end; 
+0

これは全くうまくいかず、ランダム(High(LongWord))= 0をチェックしています。また、ShowMessageのロジックはボルケー。 –

+2

ワームの潜在的なコメントは、初期化されていないローカル変数をテストしていて、値が未定義であるという事実を指します。ワームがそれほど役に立たない方法でそれを述べたのは残念です。 –

+0

@GolezTrol:なぜですか? – User

答えて

10

aをローカル変数として宣言したからです。 TForm1.Button1Clickと入力するたびに、この変数は新しいものになり、まだForm2が残っていても初期化されません。つまり、nilのチェックは機能しません。

あなたがすべきです:(?あなたのメインフォーム)

  • aグローバル(あなたが最初のフォームを作成するときにForm2をグローバルようにあなたが得る)
  • Form1の宣言のa一部を作成するかを確認しますあなたのプログラム全体を通して生きる他のクラスのデータモジュール。
  • 変数をまったく使用しないでください。Screen.Formsをチェックして、そこにForm2があるかどうか確認してください。

[編集]

このように:

var 
    i: Integer; 
begin 
    // Check 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    // Could use the 'is' operator too, but this checks the exact class instead 
    // of descendants as well. And opposed to ClassNameIs, it will force you 
    // to change the name here too if you decide to rename TForm2 to a more 
    // useful name. 
    if Screen.Forms[i].ClassType = TForm2 then 
    begin 
     ShowMessage('Form2 already exists'); 
     Exit; 
    end; 
    end; 

    // Create and show. 
    TForm2.Create(Self).Show; 
end; 
+0

コードサンプルは動作しますが、このようなコードを実際に書くべきではないことをお勧めします。もう一つの選択肢は、グローバルがはるかに優れています。 –

+0

私は良いオプションは、あなたのためにこのものを管理するシングルトンとして使用されている中央アプリケーションコントローラクラスだと思うが、これは、この時点では少し複雑すぎるかもしれないと思う。できるだけグローバル変数としての使用を制限するべきだと思いますが、なぜこのようなコードを書かないのがいいのか、なぜグローバルな方が良いのかを説明するのは大変ですか? – GolezTrol

0

あなたの問題への最も簡単な解決策は、ローカル変数の代わりにグローバル変数を使用する、または(あなたの変数フィールドを作ることですインスタンス変数)をクラスに追加します。

TForm2型のグローバル変数は自動的にnilに初期化されますが、上記のように、「スタック」と呼ばれるものにあるローカル変数は自動的には初期化されません。

ローカル変数とグローバル変数スコープ、およびスタックとヒープの内容を読んで理解する必要があります。これらは、完全に管理されていないほぼすべてのプログラミング言語に適用される一般的な概念です。言い換えれば、CとC++とPascalで考える必要があります。

これらのもの(初期化されていないローカル変数やアクセス違反)は、ある言語(C#とjava)があなたをある程度保護するものです。

関連する問題