有个程序主窗体是MDI类型的,我想实现个登陆的普通窗体调用它,调用倒是实现了,但是出现在进入主界面后,在的那几菜单调用其他的子窗体时老是提示  cannot create form .no MDI forms are currently active  其中调用的每个子窗体都是动态创建的  只有程序的主操作界面窗体和登陆窗体不是自动创建。
很棘手的问题,因为很少用到MDI窗体,一直没有解决,请教高手指点 啊!!

解决方案 »

  1.   

    1. 如果是exe(MDI主窗体)调用dll(MDI子窗体),需要在 project菜单下勾选 runtime选项。
    2。如果是合着一个exe,那么子窗体创建时要执行父窗体。
      

  2.   

    给你说一下原因:
    1、MDI主窗体不能动态创建,并且必须把MDI设为主窗体
    2、登陆窗口需要另外设计
    我是这样设计的,看代码:program ZJCMS;uses
      Forms,
      login in 'login.pas' {Flogin},
      main in 'main.pas' {Fmain},
      xueji in 'xueji.pas' {Fxueji},
      dm in 'dm.pas' {Fdm: TDataModule},
      chaxun in 'chaxun.pas' {Fchaxun},
      xjxg in 'xjxg.pas' {Fxjxg},
      xjzj in 'xjzj.pas' {Fxjzj},
      yearmonth in 'yearmonth.pas' {Fyearmonth},
      PublicProcedure in 'PublicProcedure.pas',
      setzhuanye in 'setzhuanye.pas' {Fsetzhuanye},
      setclass in 'setclass.pas' {Fsetclass},
      rili in 'rili.pas' {Frili},
      weiji in 'weiji.pas' {Fweiji},
      liangcao in 'liangcao.pas' {Fliangcao},
      bedroom in 'bedroom.pas' {Fbedroom},
      fanxiao in 'fanxiao.pas' {FFanxiao},
      plxg in 'plxg.pas' {Fplxg},
      plzj in 'plzj.pas' {Fplzj},
      bed in 'bed.pas' {Fbed},
      dormitory in 'dormitory.pas' {Fdormitory},
      inroom in 'inroom.pas' {Finroom};{$R *.res}begin
      Application.Initialize;
      Flogin:=TFlogin.Create(application);
      flogin.ShowModal;
      flogin.Update;
      if not flogin.ok then
      application.Terminate
      else begin
      Application.Title := '于2006年9月设计';
      Application.CreateForm(TFmain, Fmain);
      Application.CreateForm(TFdm, Fdm);
      Application.CreateForm(TFlogin, Flogin);
      Application.CreateForm(TFinroom, Finroom);
      Application.Run;
      end;
    end.login.pas单元
    unit login;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, bsSkinBoxCtrls, bsSkinCtrls, bsSkinData,
      BusinessSkinForm, DB, DBTables, bsMessages,Inifiles;type
      TFlogin = class(TForm)
        bsSkinButton1: TbsSkinButton;
        bsSkinButton2: TbsSkinButton;
        bsSkinLabel1: TbsSkinLabel;
        bsSkinLabel2: TbsSkinLabel;
        bsSkinPasswordEdit1: TbsSkinPasswordEdit;
        bsSkinComboBox1: TbsSkinComboBox;
        bsSkinData1: TbsSkinData;
        bsCompressedStoredSkin1: TbsCompressedStoredSkin;
        bsBusinessSkinForm1: TbsBusinessSkinForm;
        Table1: TTable;
        bsSkinMessage1: TbsSkinMessage;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure bsSkinButton1Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure bsSkinButton2Click(Sender: TObject);
        procedure bsSkinPasswordEdit1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
        ok:boolean;
        cuser:string;
      end;var
      Flogin: TFlogin;implementation{$R *.dfm}
    uses
    dm;
    procedure TFlogin.FormCreate(Sender: TObject);
    begin
    ok:=false;
    end;procedure TFlogin.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if not ok then
    application.Terminate;
    end;procedure TFlogin.bsSkinButton1Click(Sender: TObject);
    var
    myini:Tinifile;
    begin
    table1.Open;
    if table1.Locate('user',self.bsSkinComboBox1.Text,[]) then
    begin
    if self.Table1.FieldValues['Pasword']=self.bsSkinPasswordEdit1.Text then
    begin
    ok:=true;
    cuser:=self.bsSkinComboBox1.Text;
    myini:=tinifile.Create(extractfilepath(paramstr(0))+'init.ini');
    myini.WriteString('当前登陆用户','cuser',cuser);
    self.Close;
    end else
    self.bsSkinMessage1.MessageDlg('密码错误!',mtWarning,[mbok],0);
    end else
    begin
    self.bsSkinMessage1.MessageDlg('非法用户!',mtWarning,[mbok],0);
    end;
    end;procedure TFlogin.FormShow(Sender: TObject);
    var
    i:integer;
    begin
    self.Table1.Open;
    self.Table1.First;
    self.bsSkinComboBox1.Items.Clear;
    for i:=0 to table1.RecordCount-1 do
    begin
    self.bsSkinComboBox1.Items.Add(self.Table1.FieldValues['User']);
    self.Table1.Next;
    end;
    self.bsSkinComboBox1.ItemIndex:=0;
    self.Table1.Close;
    self.bsskinpasswordedit1.SetFocus;
    end;procedure TFlogin.bsSkinButton2Click(Sender: TObject);
    begin
    self.close;
    end;procedure TFlogin.bsSkinPasswordEdit1KeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
    if key=13 then
    self.bsSkinButton1Click(self);
    end;end.
      

  3.   

    我的说的情况就是程序的主操作界面窗体属性是fsmdiform ,其它的都是调用的动态创建的子窗体。
    我只是加了一个普通登陆窗体form以便进入主操作界面,就出现上面的问题了,可以进入,但是问题就是我反映的那样,其中登陆窗体我设置成了主窗体,我就是想达到一个这样简单的效果,
      

  4.   

    问题解决了,谢谢楼上的指点 啊,我正是按照你的思想做的,
    但是又出现了个小问题,因为登录窗体设计一个sql查询  组件是adoquery  当我正常登录时没有问题,但是用户想退出登录窗体不想登录时点击窗体的关闭按钮确老是提示  
    access violation at address 00405f3e in module' ',read of address 012e0ee8我把adoquery1 屏蔽了进行测试是成功的。问题可能出现在这个地方怎么解决?? 是要添加将adoquery1的链接释放掉代码吗??
    我试过其cancel方法的,不行求救 啊 !