我写了个程序,Form1(主),Form2,unit1,unit2,unit3
程序开始运行后就隐藏form1和form2,工程文件代码program Project2;uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas';{$R *.res}begin
  Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
  //Form2.Show;
  Application.ShowMainForm:=false;
  Application.Run;End.1.都隐藏后通过一些条件判断显示哪个FORM,我把判断条件写在了Form.Create中,伪码:
procedure TForm1.FormCreate(Sender: TObject);
if 条件=真  显示Form1(主),毁掉Form2,         //这里不知道该怎么写
if条件=假   显示 Form2,(把Form1隐藏),这里我是这样写的:Form2:=TForm2.Create(Application);
                                                  Form2.show;
2.Form2里面:
  有二个按钮btn1,btn2:
           btn1:  通过条件判断:  if 条件为真 显示Form1(主),毁掉Form2,//这里不知道该怎么写
                                if条件为假  只showmessage
           btn2:  直接显示Form1,毁掉Form2                         //这里不知道该怎么写
   Form2close事件:如果Form2被用户点关闭了,则同时也关闭FORM1,程序结束    //这里不知道该怎么写烦请各位达人指教下:程序这样是否规范,是否有需要注意的地方
            

解决方案 »

  1.   

    整体上感觉有些混乱,不妨简单分析一下1、第1条示意代码如下procedure TForm1.FormCreate(Sender: TObject);
    begin
      if True then
    //  if False then
      begin
        Form1.Show;
        Form2.Free;
      end
      else
      begin
        Form2 := TForm2.Create(Application);
        Form2.Show;
        Form2.Caption := 'Form2 in TForm1.FormCreate';
      end;
    end;当条件为真时,Form1显示,但Form2.Free实际上是不起作用的,因为此时Form2还没有创建,Form2=nil
    当条件为假时,创建并显示Form2,但这里的Form2和之后Application.CreateForm创建的Form2并不是同一个实例
    另外,由于Application首先创建的是Form1,它也就是程序的主窗体,而Form2不是,因此不能通过关闭Form2窗体结束Application。而主窗体Form1又被隐藏了,无非由用户关闭。这时就需要在其他地方显式的采用Application.Terminate或Form1.Close来结束Application2、第2条示意代码如下procedure TForm2.Button1Click(Sender: TObject);
    begin
      if True then
    //  if False then
      begin
        Form1.Show;
        ShowMessage(Form2.Caption);
        Form2.Free;
      end
      else
      begin
        ShowMessage('False in TForm2.Button1Click');
      end;
    end;procedure TForm2.Button2Click(Sender: TObject);
    begin
      Form1.Show;
      ShowMessage(Form2.Caption);
      Form2.Free;
    end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Form1.Close;
    end;btn1事件函数中条件为假时显示提示没有问题,条件为真时显示Form1可以,但下面一句Form2.Free时释放的却是Application.CreateForm所创建的Form2
    btn2事件函数同样
    FormClose事件函数没有问题,可通过Form1即主窗体的关闭结束整个程序
      

  2.   

    为使逻辑上清晰,也使代码更可读,更便于查错
    这样的窗口显示控制应当直接在Project单元或同一个窗体单元(如主窗体)中实现
    尽量避免单元的交叉引用,尽管Delphi允许这样做