我想在创建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;

最佳答案

那是因为您将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;

10-04 18:10