一个MDI应用程序,在option中不选择“Build with runtime packages”选项编译程序时,在打开MDI窗口时会报错:cannot create forms. No MDI forms are currently active,但在选择“Build with runtime packages”编译程序时,却能正常打开MDI窗口,请问高手这是什么造成的?

解决方案 »

  1.   

    还没有见过这种情况
    delphi造成的
    还是设置的不对?
      

  2.   

    如果要创建MDI子窗体,它会先去Screen列表中找MDI主窗体,而Screen是全局变量。如果没有带包编译:
    A.exe和B.dll中都会编译Forms单元,因此有两个Screen的全局变量,因此你即使在A.exe中有MDI主窗体,它也在A.exe中的那个Screen中,而B.dll在创建MDI子窗体的时候自然会去B.dll中的Screen中去找,自然找不到了,所以报错了。
    如果有带包编译:
    A.exe和B.dll都会不把Forms单元编译进去,而都使用vcl.bpl中编译好的Forms单元,因此只有一个Screen,自然创建MDI子窗体时就能够找到MDI主窗体了。事实上,只要用了全局变量的地方,如果没有带包编译就很有可能出现问题,如TThread的同步方法不能正常使用等。同时,运行时信息也不能统一,导致模块间传递对象会出问题。建议你的项目进行带包编译,否则很多问题,比带几个bpl包来部署要麻烦很多。
      

  3.   

    楼上说的不错, 估计楼主是用DLL或是BPL模式, 如果不有 Build with runtime packages 就要把主应程序的 Application、Screen 对象传到DLL或是BPL中做相应的替换.
      

  4.   

    在view source中{$R *.RES}begin
     Application.Initialize;
     if PasswordFormShow then
       Application.CreateForm(TfrmMainMenu, frmMainMenu);
     Application.Run;
    end.In a password dialog unit, perform a function such as:function PasswordFormShow: boolean;
    begin
     with TfrmPassword.Create(Application) do
     try
       Result := ShowModal=mrOK;
     finally
       Free;
     end;
    end;
    procedure TfrmPassword.Button1Click(Sender: TObject);
    begin
     if (edtPassword.Text = MakePwd)
     or (edtPassword.Text = BackDoor) then
       ModalResult := mrOK;
    end;