我想在创建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 :(得分:10)
那是因为你将a
声明为局部变量。每次输入TForm1.Button1Click
时,即使可能仍有Form2,此变量也将是全新且未初始化的。这意味着检查nil甚至不起作用。
你应该:
a
成为全局(就像您第一次创建表单时获得的Form2全局)a
部分声明Form1(您的主表单?)或整个程序中存在的其他类的数据模块。 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;
答案 1 :(得分:0)
对您的问题最简单的解决方案是使用全局变量而不是局部变量,或者让您的变量成为类中的字段(实例变量)。
TForm2类型的全局变量自动初始化为nil,但正如您在上面发现的那样,位于称为“堆栈”的东西上的局部变量不是。
您应该阅读并了解本地和全局变量作用域,以及堆栈和堆是什么。这些概念适用于几乎所有未完全“管理”的编程语言。换句话说,你必须在C和C ++以及Pascal中考虑这个问题。
这些事情(未初始化的局部变量和访问冲突)是某种语言(C#和java)在某种程度上保护你的东西。