开发者

Show message when Tform2 is created?

开发者 https://www.devze.com 2023-02-06 11:31 出处:网络
I want to when Tform2 is created then show a message to user. I use this code, but not work well. procedure TForm1.Button1Click(Sender: TObject);

I want to when Tform2 is created then show a message to user. I use this code, but not work well.

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;


That's because you declare a as a local variable. Each time you enter TForm1.Button1Click this variable will be brand new and uninitialized even though there might still be a Form2. That means that the check for nil won't even work.

You should either:

  • Make a a global (like the Form2 global you get when you first create a form)
  • Make a part of the declaration of Form1 (you main form?) or a datamodule of other class that lives throughout your entire program.
  • Don't use a variable at all, but check Screen.Forms to see if you got a Form2 in there.

[edit]

Like this:

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;


The simplest possible solution to your problem is to use a global variable instead of a local variable, or to make your variable a field (an instance variable) in your class.

A global variable of type TForm2 is initialized automatically to nil, but as you found out above, the local variable, which is located on something called the "stack" is not.

You should read and learn about local and global variable scopes, and what the stack and the heap are. These are general concepts that apply in almost any programming language that is not completely "managed". In other words, you have to think about this in C and C++ as well as in Pascal.

Such things (uninitialized local variables, and access violations) are something that some languages (C# and java) protect you from, to some degree.

0

精彩评论

暂无评论...
验证码 换一张
取 消