dll中的form问题(100分)

  • 主题发起人 主题发起人 jianl
  • 开始时间 开始时间
J

jianl

Unregistered / Unconfirmed
GUEST, unregistred user!
我在dll中的窗口显示在exe的panel中,出现了两个问题:
1、焦点在dll的form时,exe窗口的标题栏变灰。
2、当有其他应用程序的窗口压在上面时,点击dll的form不会将此自己的程序显示在前面,
依然在其他应用程序的下面。

如果dll窗口是mdichild没有上面的问题,但是有别的问题:
1、mdichild中tab键没有作用。
2、如果在onclose中加上caAction = free则,无法free,报错。
 
请发表一下高见吧。
 
还好没做呢,学习一下吧~
 
showmodal?整个程序都不响应了!
 
是不是dll中的form在建立时它的parent没有设置好或者没有将主application的handle传过去,
导致消息传递出错?
 
看看吧:
dll:
library dldf;

uses
SysUtils,
Classes,
forms,
windows,
dllformInput in '../继承表单/dllformInput.pas' {dllFormInputForm},
dllformInPanel in '../继承表单/dllformInPanel.pas' {dllformInPanelForm},
quceList in 'quceList.pas' {quceListForm},
dm in 'dm.pas' {clientdm: TDataModule},
resourcestringunit in '../resourcestringunit.pas',
dllformInPanelSecondUnit in '../继承表单/dllformInPanelSecondUnit.pas' {dllformInPanelSecondForm},
zichangguanliunit in 'zichangguanliunit.pas' {zichanGuanliForm},
biandianzhanUnit in 'biandianzhanUnit.pas' {biandianzhanForm},

{$R *.res}
var
DLLApp: TApplication;

procedure DLLUnloadProc(Reason : Integer);
begin
if Reason = DLL_PROCESS_DETACH then Application := DLLApp;//恢复
end;

exports
initdldf,
getquceListForm,
getzichanGuanliForm;

begin

DLLApp := Application; //保存 DLL 中初始的 Application 对象
DLLProc := @DLLUnloadProc; //保证 DLL 卸载时恢复原来的 Application


end.


initdldf 在dm中
procedure initdldf(AConnection: TADOConnection;app:TApplication); stdcall;
var
i:integer;
begin
application := app;
clientdm := tClientdm.Create(nil);
for i:=0 to clientdm.componentcount-1 do
begin
if clientdm.components is TCustomADODataSet then
(clientdm.components as TCustomADODataSet).connection:=AConnection;
end;
end;

getquceListForm在dll窗口中:
function getzichanGuanliForm:TForm ;StdCall;
begin
// if quceListForm = nil then
begin
zichanGuanliForm := tzichanGuanliForm.Create(nil);
end;
result := zichanGuanliForm;
end;

应用程序调用:
initdldf(adoconnection1,application);
currentPanelform := getzichanGuanliForm;
windows.SetParent(currentPanelform.Handle,panel1.Handle);
currentPanelform.Show;

请看看是什么问题。
 
getquceListForm在dll窗口中:
function getzichanGuanliForm(parent:TComponent,app:Tappilcation):TForm ;StdCall;
begin
application:=app;
// if quceListForm = nil then
begin
zichanGuanliForm := tzichanGuanliForm.Create(parent);
end;
result := zichanGuanliForm;
end;

应用程序调用:
currentPanelform := getzichanGuanliForm(panel1,application)
另外就将windows.SetParent(currentPanelform.Handle,panel1.Handle);去掉吧!

试试看以上行不行。
 
接受答案了.
 
后退
顶部