改题了,原题的问题自己解决了,因此换一个问题,谁能提供可用的DEVEXPRESS ExpressQuantumGrid 下载,要高于4.11的版本! (200分

  • 主题发起人 主题发起人 keepyea
  • 开始时间 开始时间
K

keepyea

Unregistered / Unconfirmed
GUEST, unregistred user!
改题了,原题的问题自己解决了,因此换一个问题,谁能提供可用的DEVEXPRESS ExpressQuantumGrid 下载,要高于4.11的版本! (200分)<br />如题,可用则立刻给分!!谢谢!!


原题:

问题如下:
DLL中有一FORM(非模态),我想在宿主程序中指定它的PARENT(假定是一个PANEL),然后ALIGN=Alcient。
请问,如何实现。即:交DLL中的FORM嵌入到宿主程序中来。DLL是使用DELPHI编写的,宿主程序也是!
请高手测试后告诉我!

不胜感激!
 
和普通窗体一样,只不过要设置dll的application
先把dll的application保存起来,然后,把主程序的appplication 付给dll的(当然,你要把
主程序的application 用参数传进来),当释放dll时恢复即可
 
1、你写的函数应该放在窗体里,这样可以保证窗体的独立性,没有必要放在工程文件中,
只要在工程文件中exports这个函数就行了;
2、改写一下你的函数,至少应该有一个try..finally,这样比较可靠一些;
例如:
function showes(AHandle:THandle):integer;stdcall;
var
form:TForm1;
begin
Application.Handle := AHandle;//去掉状态栏上的窗体图标
form:=tform1.Create (appliction);
try
result:=form.ShowModal ;
finally
form.free;
end;
end;
函数调用方法:showes(appliction.Handle);
3、DLL中的窗体和普通窗体没什么区别,但在调用时会在windows的状态栏上多出
一个程序图标,想去掉它,还需要做些小工作,上面的例子代码已经做了处理,有
注释。这样做还有一个好处,就是DLL中窗体的图标也变成应用程序的图标了:)
 
都搞错了人家的意思了,不是问如何建立一个DLL窗体,而是如何将DLL中的窗体显示在Panel
中。我没有做过,先写个大概的代码,你试试效果,看做得出来吗?
---------------------------------------
将显示的部分函数改一下,由组件建立:
function FormCreate(var app:tcomponent):boolean;stdcall;
var
Form1: TForm1;
begin
try
form1.Create(app);
result:=true;
finally
result:=false;
messagebox('你要显示的错误信息');
end;
在主窗体中调用它:
procedure TForm1.Button1Click(Sender: TObject);
var app:tcomponent;
begin
app:=panel1.Owner;
if formcreate(app) then
messagebox(信息);
end;
一个想法,自己还没有做过!
 
MyForm := TMyForm.create(self);
MyForm.ManualDock(TabSheet1,nil,alClient);
MyForm.Show;
 
你现在有的是什么,是窗口的句柄,类名,还是实例??????????
 
在DLL中:
procedure ShowCalendar(AppHwnd, AParentHwnd: THandle; ACaption: string); stdcall;

implementation

procedure ShowCalendar(AppHwnd, AParentHwnd: THandle; ACaption: string);
var
DLLForm: TDLLForm;
begin
Application.Handle := AppHwnd;
DLLForm := TDLLForm.Create(nil);
try
SetParent(DLLForm.Handle, AParentHwnd);
DLLForm.Align := alClient;
DLLForm.Caption := ACaption;
DLLForm.Show;
finally
//DLLForm.Free; 在DLLForm的OnClose事件设置 Action := caFree
end;
end;

exports
ShowCalendar,


然后在EXE中调用:
procedure TMainForm.Button2Click(Sender: TObject);
var
ShowCalendar: procedure (AppHwnd, AParentHwnd: THandle; ACaption: string); stdcall;
begin
//LibHandle是预先Load进来的Dll handle
@ShowCalendar := GetProcAddress(LibHandle, 'ShowCalendar');
if @ShowCalendar &lt;&gt; nil then
begin
ShowCalendar(Application.Handle, Panel1.Handle, 'Test Form');
end;
end;
 
楼上的
DLLForm: TDLLForm;
是不是应改成全局变量。
 
不用,就是不要那个变量也是一样的:
procedure ShowCalendar(AppHwnd, AParentHwnd: THandle; ACaption: string);
begin
Application.Handle := AppHwnd;
with TDLLForm.Create(nil) do
begin
SetParent(Handle, AParentHwnd);
Align := alClient;
Caption := ACaption;
Show;
end;
end;
 
问题的关键在这里,因为DLL里面的FORM虽然设置了PARENT,但宿主程序却不理会他的,
Align := alClient;
并不能得到真正意义上的执行。在宿主程序的PANEL的CONTROLCOUNT里面根本就为零。换句话说,DLL里的FORM收不到由PANEL发来的RESIZE消息,同样,他也不知道它的这个PARENT有多大。因此ALIGN=ALCIENT是没有意义的。
何解?!
再请教高手!
 
我已经成功的做过了这个问题。
象现在这种做法都不行,什么 application 什么 parent/owner 都是小问题
后面的难点是宿主程序和 DLL 程序运行在一个进程中,
而 DLL 的 Form 若想嵌入主 Form,则它的 VCL 类必须不能和主窗体冲突。
但是,由于双方各自有一份 VCL 代码,即便名字都叫 "TForm" 也不行,
宿主 Form 会拒绝嵌入的。。。除非。。。
 
[:)]高手快出手啊!
 
这个问题放了几个月了,就没有一个人可以解决吗?还是高手都去睡觉了??[
 
经过摸索,现在已经知道,其实用包编译的方式就可以了,把DLLFORM的TFORMCLASS传到主程序中,动态创建它就可以。
 
在我看来,由于VCL设计上的问题,
使用运行期包的场合:
1.多个模块同时使用同一数据库
2.整个项目比较大
3.不需要其他编程语言写的程序调用
否则,还是使用DLL比较好
 
http://www.playicq.com/
 
后退
顶部