我的程序是这样的:建立了一个form1窗口,通过form1的create事件,把另外一个窗口form2的调出来,form2是封装在dll内部的(为了保密)。form1的作用就是把form2调出来,主要功能全部在form2上,但是程序运行时,在任务栏上出现2个图标,怎么只显示一个图标,或则让另外一个图标在托盘显示上,并且在form2窗口退出时,让form1也自动退出,(form2结束时使程序自动结束,form2在dll内)。请高手帮忙。谢谢!!

解决方案 »

  1.   

    只能用于楼主所说的情况:procedure TForm2.FormCreate(Sender: TObject);
    begin
      //不在任务栏显示
      SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      //关闭程序
      SendMessage(Application.Handle,wm_close,0,0);
    end;
      

  2.   

    在调用Form2结束后,可不可以用Close关闭Form1
      

  3.   

    第一种方法:Exe跟DLL共享RTL.bpl、VCL.bpl,这样只有一个Application,达到搂主的目的;
    第二中方法:Exe提供给DLL一个参数:Application.Handle,DLL接受到参数后,将DLL中的Applicaiton.Handle替换为传入的参数,并在DLL结束时将DLL中的Applicaiton.Handle复原。
      

  4.   

    在dll中创建窗口的语句如下:
    procedure OpenForm(mainForm:TForm);stdcall;
    var Form1:TfrmCreateDB;
        ptr:PLongInt;
    begin
      ptr:=@(Application.MainForm);
      ptr^:=LongInt(mainForm);
      Form1:=TfrmCreateDB.Create(mainForm);
      Form1.ShowModal;
    end;
    sdzeng(大头鸟)说的这种方法不在dll的窗口中可以,但是在dll的窗口中好像不行了;
    budded(System is bussy!) 能否详细说一下这两种方法。谢谢各位回复。
      

  5.   

    楼主可以去看看《Delphi 5开发人员指南》
    第9章,9.4.2 显示Dll中的模式窗体Dll中的Application对象和和调用它的exe中的Application是分离的
    为使Dll中窗体真正成为应用程序模式窗体,必须将应用程序的句柄赋给
    Dll的Application.Handle属性建议楼主把代码改成这样,
    还需要注意的是,Form1创建以后要手动释放或用caFree,
    否则只能等到程序终止才能释放procedure OpenForm(AHandle:THandle);stdcall;
    var Form1:TfrmCreateDB;
    begin
      Application.Handle := AHandle;
      Form1:=TfrmCreateDB.Create(Application);
      Form1.ShowModal;
    end;
      

  6.   

    谢谢sdzeng(大头鸟),问题解决了。
    procedure ShowForm(AHandle:THandle);Stdcall;
    var Form1:TfrmCreateDB;
    begin
    Application.Handle:=AHandle;
    Form1:=TfrmCreateDB.Create(Application);
    try
       Form1.ShowModal;
       SendMessage(Application.handle,wm_close,0,0);
    finally
      Form1.Free;
    end;
    这样就可以完全达到我的要求。
    谢谢,各位。