Application.MainForm是一个只读属性。

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
时,由于Application.CreateForm的作用,始终将第一个Form设置为MainForm
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  。。
  if (FMainForm = nil) and (Instance is TForm) then
  begin
    TForm(Instance).HandleNeeded;
    FMainForm := TForm(Instance);
  end;
end;问题是,有什么办法来改变FMainForm,大家帮忙想想看吗?

解决方案 »

  1.   

    d6里,project->options选一下就行了
      

  2.   

    菜单Projects->Options 弹出对话框,其中有选择的。
      

  3.   

    会指针吗?
    以下就可以达到运行可以改变:
    首先建一个Appliction,建两个Form
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P: Pointer;
    begin
      P := @Application.MainForm;
      TForm(P^) := Form2;
      Application.MainForm.Show;//这个时候就是Form2了
    end;
    注: 
    以上可能有一安全的因素,楼主考虑再去用吧
      

  4.   

    想问一下,你改变Application.MainForm有什么用处?
      

  5.   

    "以上可能有不安全的因素"
    我解释如下:
    看D中对Application.mainform定义就知道了:
      TApplication = class(TComponent)
     .......
      public
      .......
        property MainForm: TForm read FMainForm;
      .......
      end;
    这里可以看出MainForm是读取FMainForm这个私有变量,以上的方法当然可以了。
    但如果D中将来这样的定义MainForm属性的话:
      TApplication = class(TComponent)
     .......
      public
      .......
        property MainForm: TForm read GetMainForm;//通过一个访问函数
      .......
      end;
    那么P := @Application.MainForm中是返回GetMainForm地址,那么你改变就是改变这个函数的地址,那么下次你访问Application.MainForm,就可能要出错,而且更重要的是,指针已经让内存混乱了
      

  6.   

    当然,D中改变MainForm的读取方法的可能不是很大了。:)
      

  7.   

    是啊!
    你这么一说道是很有道理的!!!高我想了想你说的“指针已经让内存混乱了”
    我想,如果我管理得当,应该不会出什么大漏子吧!下面是我想到的处理过程:
    前提:Form1为最初的mainformprocedure TForm1.Button1Click(Sender: TObject);
    var
      P: Pointer;
    begin
      P := @Application.MainForm;
      TForm2(P^) := Form2;
      Application.MainForm.ShowModal;
      P := nil; 
    end;
    当Form2关闭时:
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      P: Pointer;
    begin
      P := @Application.MainForm;
      TForm1(P^) := Form1;
      Application.MainForm.BringToFront;
      P := nil; 
    end;
    这样,应该不会有什么问题了吧!对了,随便说一下,我这个问题的提出是由于我的Form2是MDIForm的,它有MDIChild子窗体;同时它又是在Form1的处理之后Show出来的。我在调试初期,MDIChild子窗体老是说没有MDIForm的主窗体,所以才想到要动态改变Application的MainForm。  
    不知道除了此法,谁还有高见!