关于显示DLL封装FORM的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 xt2002xt
  • 开始时间 开始时间
X

xt2002xt

Unregistered / Unconfirmed
GUEST, unregistred user!
通过传递PANEL的句柄,可以将DLL里的FORM创建到PANEL里,但是却不能对其中的EDIT等控件进行操作,有chenybin兄(好象应该可能是叫兄吧!嘿嘿)告诉我将该DLL里FORM的BORDERSTYLE改为bsNone就可以了,我也实现了,但为什么不能在BORDERSTYLE为bsSizeable的情况下去操作里面的EDIT控件呢?请高手回答
 
通过传递PANEL的句柄,可以将DLL里的FORM创建到PANEL里,但是却不能对其中的EDIT等控件进行操作,有chenybin兄(好象应该可能是叫兄吧!嘿嘿)告诉我将该DLL里FORM的BORDERSTYLE改为bsNone就可以了,我也实现了,但为什么不能在BORDERSTYLE为bsSizeable的情况下去操作里面的EDIT控件呢?请高手回答
 
原因不知道,解决办法倒是知道有两个,给你原因还是给解决办法才放分?
 
嘿嘿!要原因,变通的处理方法已经想到了.只是觉得不知道不爽.不过你将两个方法给出也可以,一个月的时间,没人告原因就将分给你,即使有人告原因,也给你一部分,成不?
 
主程序<br>function showform(AHandle: THandle; AParent: TWinControl): DWORD; stdcall;external 'project2.dll'; &nbsp; &nbsp;//显示窗体<br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.FormShow(Sender: TObject);<br>begin<br> &nbsp;showform(Application.Handle,Panel1);<br>end;<br><br>dll窗体<br>library Project2;<br><br>uses<br> &nbsp;SysUtils,<br> &nbsp;Classes,<br> &nbsp;Unit2 in 'Unit2.pas' {Form2};<br><br>{$R *.res}<br><br>exports showform;<br>begin<br>end.<br>unit Unit2;<br><br>interface<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs, StdCtrls;<br><br>type<br> &nbsp;TForm2 = class(TForm)<br> &nbsp; &nbsp;Edit1: TEdit;<br> &nbsp;private<br> &nbsp; &nbsp;{ Private declarations }<br> &nbsp;public<br> &nbsp; &nbsp;{ Public declarations }<br> &nbsp;end;<br><br>var<br> &nbsp;Form2: TForm2;<br><br>function showform(AHandle: THandle; AParent: TWinControl): DWORD; stdcall; &nbsp; &nbsp; //显示窗体<br><br>implementation<br><br>{$R *.dfm}<br><br>function showform(AHandle: THandle; AParent: TWinControl): DWORD; stdcall; &nbsp; &nbsp; //显示窗体<br>var<br> &nbsp;aform: TForm2;<br>begin<br> &nbsp;Application.Handle := AHandle;<br> &nbsp;AForm := TForm2.Create(Application);<br> &nbsp;try<br> &nbsp; &nbsp;Form2 := AForm;<br> &nbsp; &nbsp;if Assigned(AParent) then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;AForm.BorderStyle := bsSizeable;<br> &nbsp; &nbsp; &nbsp;SetParent(AForm.Handle,AParent.Handle);<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;AForm.Show;<br> &nbsp;finally<br><br> &nbsp;end;<br>end;<br><br>end.<br><br>没有遇到你说的问题<br>偶刚刚开发完成的项目中全部都是由dll窗体构成的,没有遇到楼主的情况,楼主运气不好
 
把分给别人吧<br>在dll窗口的Show里面写<br>SendMessage(Handle, WM_NCACTIVATE, 1, 0);<br>或者在exe里面写<br>SendMessage(dllform.Handle, WM_NCACTIVATE, 1, 0);<br>dllform是从dll传回来的dll窗口。<br><br>不过最好不要这样写程序,主流软件很少这样做的,表面上看很成功,但有些隐患很难发<br>现,例如有些控件会造成资源漏失,要补救恐怕要修改控件,还有一些系统性的东西混乱,<br>程序运行时间越长越糟糕,最可怕是一些控件功能会导致莫名其妙的致命错误,一时没有<br>发现,交客户之后就出来了,想改就难了。
 
谢谢skyblue7080的答案,我也找出了我自己错误的地方,我只传了个TWinControl对象,并在DLL里以这个对象的Handle来CreateParented窗口才引发这样的问题的,谢谢,谢谢
 
后退
顶部