2011-01-23 89 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)在某种程度上保护您的东西。