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

孤者浪人 提交于 2020-02-02 11:55:11

问题


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.

回答1:


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.



回答2:


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.




回答3:


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.


来源:https://stackoverflow.com/questions/4629916/how-can-i-display-a-form-for-set-configuration-before-the-main-form

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!