开发者

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

开发者 https://www.devze.com 2023-02-03 07:10 出处:网络
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?

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开发者_JS百科;
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.


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.


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.


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.
0

精彩评论

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