线程,dll,ShowModal(150分)

  • 主题发起人 主题发起人 autofish
  • 开始时间 开始时间
A

autofish

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个动态连接库里有一个函数,这个函数主要是创建一个提示窗口和一个工作线程。
如下:
function MyFunc(Param: TMyParam): boolean;
begin
MyForm := TMyForm.CreateParented(Param.ParentHwnd);
TMyThread.Create(Param);
// MyForm.Show;
// Result:=true;
Result:=(MyForm.ShowModal=1);
end;
假如我用ShowModal方法,我的MyForm窗体根本无法接收到我的输入(鼠标,键盘的输入),
我用Show方法,可以接收到我的输入,但我想在完成后台工作前不容许用户再进行其他操作,
有什么办法解决这个问题,150分送上。
 
为何要用线程创建窗体?创建窗体很非时间吗??很费时间吗?
建议,去掉线程:
function MyFunc(hHandle:THandle;Param: TMyParam): boolean;
begin
//MyForm := TMyForm.CreateParented(Param.ParentHwnd);
//TMyThread.Create(Param);
// MyForm.Show;
// Result:=true;
//Result:=(MyForm.ShowModal=1);
Result:=True;
try
Application.Handle := hHandle;
Application.CreateForm(TMyForm , MyForm );
MyForm .ShowModal;
MyForm .Free;
except
Result:=False;
end;
 
看清楚了,我并不是在线程中创建窗体。
TMyThread.Create(Param)是创建工作线程。
 
MyForm.ShowModal
然后在myform中开启线程。
如果主form还用响应界面事件,那么改为myform.show其风格是alway on top的。
不许操作的地方enable属性设位false
 
to crane:不行阿,还是老样子。
 
把Application对象传入DLL,然后用
Application.CreateForm来建立你的窗体。
 
我也试过这种方法,用Application.CreateForm方法和
MyForm := TMyForm.Create(owner);的效果是一样的,都是在任务栏上多了一个窗体。
还有没有更好的方法呢?
没有就送分了!!!
 
或者可以这样,DLL中的Application对象的Handle 设为应用程序中的Application对象的Handle.
在DLL中生成窗体前,
Application.Handle := APP.Handle;//APP是传入的Application.
 
我的例子力不是写了吗
Application.Handle := hHandle;
能防止任务兰多一个窗体
 
把Application对象传入DLL
在DLL中保存它赋自己的Application对象:DLLAPP := Application
再赋值 : Application := EXEAPP;//这时传入的对象
再建立你的窗体ShowModal
离开DLL时记得还原原来的Application对象: Application := DLLAPP;
 
后退
顶部