读书人

是高手的就进来看看为什么DLL里的FO

发布时间: 2012-02-05 12:07:15 作者: rapoo

是高手的就进来看看,为什么DLL里的FORM不支持停靠操作???
在同一个PRJECT项目中的FORM,可以通过简单设置“DragKind”、“DragModel”即可支持停靠功能,但如果是一个从DLL里显示出的窗体确不支持这样设置,哪位高手知道是什么原因?该如何处理呢?相信你们一定知道在EXE中的FORM左上角的小图标DELPHI默认的图标,而从DLL里显示出的FORM左上角的小图标是一个空白样式的图标,感觉应该是句柄的问题,请帮助解决,谢谢,急,可别让我失望啊!!!!!!

[解决办法]
呵呵,好像是。。。
没试过,帮兄弟你顶
[解决办法]
==从DLL里显示出的FORM左上角的小图标是一个空白样式的图标
以前也见过这个问题
[解决办法]
设置成MIDI 是可以实现停靠的,如果不是MIDI模式的话要用代码实现,具体怎么实现我忘了,原来也研究过这方面的问题。
建议楼主可以去查查 大富翁离线论坛!
[解决办法]
用单窗口模式确实是有这样的问题,建议自己用程序来实现最小化的功能,或用MIDI模式.
我以前就是这样写的. 调用DLL的问题还真不少. 我还发现 Application.MainForm.MDIChildCount 也有问题.
[解决办法]
不能用MIDI模式,晚点我发段代码给你。

主体功能是将 dll 中的form 显示在 指定 的父窗体上。
[解决办法]
dll 里创建窗体时这样写!
myForm :=TForm.create(nil);
myform.parent.handle:= panel1.handle; //窗体容器
myform.top:=0;
myform.leftl:=0;
....
myform.show;


窗体容器panel.handle作为参数, 即:

showDLLFrom(panel.handle)作为接口


搞定要给 500 分哦!


[解决办法]
dll 接口函数申明
function CreateFormEx(App: TApplication; Aparent: TWinControl;
var Ahandle: Thandle): boolean; stdcall; export;


实现
function CreateFormEx(App: TApplication;Aparent: TWinControl;
var Ahandle: Thandle; var WordOptions: TWordOptions): boolean; stdcall; export;
begin
Application.Handle := App.Handle;
with TFrmNorTend.Create(App) do
begin
Result := true;
Windows.SetParent(Handle, Aparent.Handle);
Ahandle := Handle;
Show;
end;
end;


var
CurWinhandle: THandle;

调用:(动态调用)
procedure TFrmMain.loadDllForm(pointers: string);
var
DLL: THandle;
CreateFormEx: TCreateFormEx;
oldHandle: THandle;
begin
DLL := StrToInt64(pointers);
@CreateFormEx := GetProcAddress(DLL, 'CreateFormEx');
if @CreateFormEx <> nil then
begin
oldHandle := CurWinhandle;
CreateFormEx(Application, Panel1(要显示dll窗口的panel), CurWinhandle);
closelastHand(oldHandle);
end;
end;

[解决办法]
这个是我以前写的,给dll_form加图标,FApplication是调用处传入的Application对象。

var
LS:TStream;
begin
LS := TMemoryStream.Create;
try
FApplication.Icon.SaveToStream(LS);
LS.Seek(0, soFromBeginning);
Frm_dllform.Icon.LoadFromStream(LS);
finally
LS.Free;
end;
end;
[解决办法]
这个是我以前用的,绝对可以,昨晚看碟后才想起来。贴了一部分代码,今晚回去给你贴个完整的。
[解决办法]
FORM可以支持停靠,停靠后还会移动这个窗口吗?
[解决办法]
也就是说要将Dll的form 嵌入 主窗体里,然后还要求可以通过选中标题栏移动这个窗体是吗?

这样的要求可能不好实现,我没弄过,我原来实现的只是将Dll中的窗口显示在主窗体指定的panel 上面,这样显示后窗体是不支持移动的。

公司规定上班不能上qq的,只能上指定的一些网站,有空帮你研究一下。 我的qq : 32689553。 有机会多交流。
[解决办法]
把controls.pas拷贝到你的代码目录下,找到InitControls方法
然后修改
ControlAtomString := Format('ControlOfs%.8X%.8X', [HInstance, GetCurrentThreadID]);

ControlAtomString := Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetCurrentThreadID]);


成不成我也不知道,试下吧。
[解决办法]
如果你的DLL和EXE不是带运行时库的包运行,DLL和EXE中的TFORM都不是同一个类.仅仅是名字相同而已.
[解决办法]
hao
[解决办法]
DLL 和 EXE 属于两个应用程序。
如果你想将 DLL 里面的 FORM 像EXE那样处理的话,只需要将他们的 主线程设成一致,即相当于你只处理了一个应用程序。

具体的要考虑两个方面:

1 Application
2 Screen
[解决办法]
补充一下:

DLL中定义
DllApp : TApplication;
DllScreen : TScreen;

{给DLL的APPLICATION和SCREEN赋值}
DllApp := Application;
DllScreen := Screen;

{最后要还原}
Application := TempApp;
Screen := TempScreen;
即:释放对象的时候
procedure MyDllProc(Reason: Integer);
begin
case Reason of
DLL_PROCESS_DETACH:
begin
Application := DllApp;
Screen := DllScreen;
end;
end;
end;


读书人网 >.NET

热点推荐