user1291092
user1291092

Reputation: 113

FormShow in Delphi

I would like to know where is the formshow in delphi 2010 as when I can only see a formcreate in my project.

The reason I am asking is because I need to add Randomize in the FormShow event handler, as shown below:

procedure TfrmWinnaSpree.FormShow(Sender: TObject);
begin
  Randomize;
end;

Upvotes: 0

Views: 7480

Answers (2)

Ken White
Ken White

Reputation: 125729

You create the event handler the same way you create almost every event handler in Delphi, by double-clicking the method in the Events tab of the Object Inspector.

Click on the form itself (not any control on the form), then switch to the Object Inspector. Click on the Events tab, and then scroll down to the OnShow event. Double-click in the right half next to the event name, and the IDE will create a new, empty event handler and put the cursor in the right place to start writing code.

Object Inspector OnShow image

procedure TForm3.FormShow(Sender: TObject);
begin
  |
end;

However, FormShow is the wrong place to call Randomize, because FormShow executes every time your form is shown, and that can happen more than once. Here's an example (it assumes two forms, Form1 and Form2, autocreated as usual in the .dpr file with the default variable names, which of course is a bad idea - this is to demonstrate a problem with your question's purpose):

procedure TForm2.FormShow(Sender: TObject);
begin
  ShowMessage('In FormShow');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Visible := not Form2.Visible;
end;

Run the program and click TForm1.Button1 multiple times; you'll see the In FormShow message every other time you do so.

The proper places for a call to Randomize are:

  • in your main form's FormCreate
  • in an initialization section of your main form's unit

    unit uMainForm;
    
    interface
    
      ...
    
    implementation
    
      ...
    
    initialization 
    
    Randomize;
    
    end.
    
  • in your project source (.dpr) file

    program MyGreatApp;
    
    uses
      Math,
      Vcl.Forms,
      uMainForm in 'uMainForm.pas' {Form1};
    
      {$R *.RES}
    
    begin
      Randomize;
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.Title := 'My Super App';
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    

Upvotes: 12

az01
az01

Reputation: 2028

Alternatively you can also override the protected method TForm.DoShow:

type
  TForm = class(Forms.TForm)
  protected 
    procedure DoShow; override;
  end;

implementation

procedure TForm.DoShow;
begin.
  // custom show code
  inherited;
  // custom show code
end;

The advantage over the event-based approach is that you can put your custom code before or after the inherited call.

Upvotes: 2

Related Questions