2011-01-23 68 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

它根本不起作用,yo正在檢查Random(High(LongWord))= 0。同樣,ShowMessage的邏輯爲borked。 – 2011-01-23 09:43:06

+2

蠕蟲的神祕評論指的是您正在測試未初始化的局部變量並且其值未定義的事實。令人遺憾的是,蠕蟲以這種無益的方式陳述它。 – 2011-01-23 09:58:24

回答

10

這是因爲您聲明a作爲局部變量。每次輸入TForm1.Button1Click時,即使可能仍有Form2,此變量仍將是全新的並且未初始化。這意味着檢查零將不會工作。

你應該:(?你的主要形式)

  • a一個全球性的(如窗體2全球你當你第一次創建一個表單)
  • 讓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

最簡單的解決問題的方法是使用全局變量,而不是一個局部變量,或讓你的變量場(一個實例變量)。

TForm2類型的全局變量會自動初始化爲nil,但正如您在上面發現的那樣,位於名爲「堆棧」的東西的局部變量不是。

您應該閱讀並瞭解本地和全局變量作用域以及堆棧和堆是什麼。這些是幾乎適用於任何不完全「管理」的編程語言的一般概念。換句話說,你必須在C和C++以及Pascal中考慮這一點。

這樣的事情(未初始化的局部變量和訪問衝突)是某些語言(C#和Java)在某種程度上保護您的東西。