关于Dll中的窗体中弹出窗体的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 happycyp
  • 开始时间 开始时间
H

happycyp

Unregistered / Unconfirmed
GUEST, unregistred user!
在弹出的MDI子窗体(在Dll中创建的MDI窗体)中,又弹出一个模态窗体(也在Dll中),如果让模态窗体成为主程序的弹出窗体?
有如下效果:
(1)不在任务栏该窗体显示按钮。(我用SetWindowLong处理过了)
(2)在最上面显示。
(3)切换到其他界面,该窗体看不到,再切换到主程序,该窗体仍然在最上面显示。
现在遇到的问题就是切换回来后,主程序总是挡住这个模态窗体,即跑到这个模态窗体的前面了,导致什么操作都不能进行了。
请高手指教。看似简单,俺没有实现。
 
这个问题以前有帖子深入研究过,仔细搜下。
 
Windows下没有什么做不到的。
利用消息拦截然后show出窗体。拦截主窗口激活消息。
然后处理就是了。
今年差不多都是用VC了。Delphi也没安装。看到了你的QQ帖子才来冒个泡。
 
完了,DFW上都没人回答问题了。我顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
 
搜一下吧,你得在DLL的加载事件里面,把Exe的Application和Screen对象传进Dll里面,因为dll也有一份同样的对象,因为这两个对象是Forms里面生成的,所以同时编译了两分(除非你用bpl包编译,否则dll和exe就会有两分Application和Screen)。这样的代码DFW有很多,你只要用dll + Application或者dll+App搜一下就找到了。
 
正常的Delphi的DLL中不支持MDI窗体。
 
dll部分:
procedure dllform(app:Thandle); export; stdcall;
begin
application.Handle:=app;
if assigned(dllform)=false then
begin
dllform:=Tdllform.Create(application);
dllform.FormStyle:=fsMDIChild;
end;
dllform.Show;
end;
exports
dllform;

exe部分:
用静态
procedure dllform(app:Thandle);stdcall;
external 'dllform.dll'

{$R *.dfm}

dllform(application.Handle);

这样就可以调用dll的窗体了,并成为子窗体.exe的frmmain要是parent!!
 
你题的问题不是showmodal的问题 还好解决~用到后真是惨啊~希望楼主有解决的办法了给我点意见 谢谢!!
 
怎么不是ShowModal,晕
模态窗体就是SHowModal.
MDI窗体显示我这里是没有问题
在模态窗体显示时,把Screen和Application都传进去了,还是不行.比较晕
 
帮你顶~~~~谁来解决我也给分!!!!!谢谢!!!!!![:)][:)]
 
我写了一个例子
大概是先打开MDI窗体 在这个MDI子窗体上再打开一个模态窗体

因为楼主的原意我不是很理解
所以请楼主发个邮箱地址 我把代码传给你 看看是不是已经解决
如果不能解决再想想办法 OK?
 
Avalon,
我的邮箱: happycyp@163.com
QQ: 402859388
 
收到请回复
 
收到,就是这个效果,谢谢.
请附源码!
 
收到请回复
 
收到,可能是我说的不太清楚,模态窗体和MDI子窗体在同一个DLL中.
谢谢你的代码,我参考一下.
非常感谢你的热心帮助.
 
模态窗体和MDI子窗体在是否在同一个DLL中不是主要问题
关键是导入参数的问题 其他都好说
 
有没有聊天工具加上你交流一下.[:D]
 
dll封装业务早在2年前就开始做过
业务模块不管可见还是不可见的也都写过
感觉还是用包封装业务吧 事情少 标准dll小问题实在是太多
 
不知道为什么我像这样用就报错:
function StockCompact(AOwner: TApplication; AParent: TForm; D_Hint: THintWindowClass;
UI: TUserInfo; SendScreen: TScreen): TFmStockCompact; stdcall;
var
ptr: PLongInt;
begin
try
//ptr := @(Application.MainForm );
//ptr^ := LongInt(AParent); //传入Application,使dll窗体能成为主程序的MDI子窗体
Application := AOwner;
if SendScreen <> nil then
Screen := SendScreen; //传入Screen对象以使主程序的MDIChild正常增加
HintWindowClass := D_Hint;

Application.ProcessMessages;
Result := FmStockCompact ;
if not Assigned(Result) then
Result := TFmStockCompact.Create(AOwner);
Result.UserInfo := UI;
Result.IsMaintenance := False;
Result.FormStyle := fsMDIChild;
Result.WindowState := wsMaximized;
Result.Show;
except on E : Exception do
begin
if Assigned(FmStockCompact) then FmStockCompact.Free ;
Application.MessageBox (PChar(E.Message),'出错',MB_OK + MB_ICONERROR);
Result := nil;
end;
end;
end;
上面的代码是MDI子窗体的
把注释掉的代码加上就不报错.我是带包编译的
在这个窗体里加一个按钮, 再弹出本Dll的一个模态窗体,还是会出现原来的情况.
希望和你的交流一下.
我的MSN: happycyp@hotmail.com
 
后退
顶部