return
return

Reputation: 1049

How can I display a form for set configuration before the main form?

in my project i have two form's(form1,form2), form1 is configuration form.

i want to show Form1 and when we click Button1 then show Form2 and free(Release) Form1. how can to i do this?

i use this code. but this project start and then exit automatically.A Friend said because the application message loop never start, and application terminates because main form does not exist. how i can to solve this problem?

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Release;
end;

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Form1:= TForm1.Create(Application);
  Application.Run;
end.

Upvotes: 2

Views: 5312

Answers (3)

Rob Kennedy
Rob Kennedy

Reputation: 163357

Do exactly what you asked in the question title: Create and show the configuration form, and then create and show the main form. The trick is in how you create them. Only use Application.CreateForm for the one form that you want to be your main form. Use the ordinary object creation technique for all other forms.

Modify your DPR file like so:

var
  ConfigForm: TConfigForm;
begin
  Application.Initialize;

  ConfigForm := TConfigForm.Create(nil);
  try
    if ConfigForm.ShowModal <> mrOK then
      exit;
  finally
    ConfigForm.Free;
  end;

  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

Upvotes: 7

Uwe Raabe
Uwe Raabe

Reputation: 47819

You can prohibit Form1 to be shown by setting ShowMainForm to false. Leave the code in the DPR just as the IDE creates it:

uses
  Forms,
  Unit2 in 'Unit2.pas' {Form2},
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

In the FormCreate event of Form2 just set ShowMainForm to false and call Show to make Form2 visible:

procedure TForm2.FormCreate(Sender: TObject);
begin
  Application.ShowMainForm := False;
  Show;
end;

and in the ButtonClick event of Form2 show Form1 and close Form2:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Show;
  Close;
end;

This keeps all necessary changes inside unit2.

Edit Some remarks that came to mind after sleeping a night over it:

  1. Form2 should be the last one auto-created, i.e. the one directly before the Application.Run statement.
  2. The Form1.Show statement in the ButtonClick event should be moved to the FormClose event. Thus the user can close the form with the Windows close button or whatever he likes best.
  3. If for some reason Form1 should never be shown, some code must be added to close the application. A Halt may serve here.

Upvotes: 0

David Heffernan
David Heffernan

Reputation: 613511

You need to create Form2 first and this will be your main form. You want it to start hidden and be shown after Form1 has done its job. Something like this:

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Release;
end;

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Form2.Hide;
  Form1 := TForm1.Create(Application);
  Form1.Show;
  Application.Run;
end.

The reason is that the app terminates when your main form closes. And your main form is typically the first one that you create.

Upvotes: 0

Related Questions