我的程序是这样的:建立了一个form1窗口,通过form1的create事件,把另外一个窗口form2的调出来,form2是封装在dll内部的(为了保密)。form1的作用就是把form2调出来,主要功能全部在form2上,但是程序运行时,在任务栏上出现2个图标,怎么只显示一个图标,或则让另外一个图标在托盘显示上,并且在form2窗口退出时,让form1也自动退出,(form2结束时使程序自动结束,form2在dll内)。请高手帮忙。谢谢!!
调试欢乐多
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;
第二中方法:Exe提供给DLL一个参数:Application.Handle,DLL接受到参数后,将DLL中的Applicaiton.Handle替换为传入的参数,并在DLL结束时将DLL中的Applicaiton.Handle复原。
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!) 能否详细说一下这两种方法。谢谢各位回复。
第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;
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;
这样就可以完全达到我的要求。
谢谢,各位。