vFormClass: TFormClass;
vForm: TForm;
------------------------------------
if tbcMain.DockClientCount > 0 then
for i := 0 to tbcMain.DockClientCount - 1 do
tbcMain.DockClients[i].Free;
if tbcMain.DockClientCount = 0 then
try
vForm := vFormClass.Create(Self);
vForm.Align := alClient;
vForm.Dock(tbcMain, BoundsRect);
vForm.Show;
except
vForm.Free;
end;//end of try
---------------------------------------
问题:vFormClass是从某个DLL中获得的Form类(类似TForm1),如果去掉Dock语句,Form也能Show出来而且运行正常,加上Dock就没反映了,步进跟踪时发现Form创建了就是没显现出来.
另外,如果vFormClass是本Project中的Form类,Form也可以被正确的Dock,运行正常。
怎么解决这个问题,实现Dock DLL's Form?
---------------------------------------
要分可以再加,我的可用分还有好多!!!!!
10 个解决方案
#1
你是这个意思吗?
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.Parent := Panel1;
Form2.Align := alClient;
Form2.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.Parent := Panel1;
Form2.Align := alClient;
Form2.Show;
end;
#2
不是,要的问题的关键是直接使用Project中的Form可以实现Dock,利用调用Dll函数中传过来的TFormClass类型的变量来创建Form时,不能实现Dock功能
关键:Dock Dll's Form!!!!
---------------------------------
请楼下的不要再走偏了,谢谢!!!!
关键:Dock Dll's Form!!!!
---------------------------------
请楼下的不要再走偏了,谢谢!!!!
#3
borland的包括delphi、C++Builder制作出的包含窗体和其他可视VCL组件dll文件工作起来都有一些不可克服的问题:焦点获得和转移、停靠、主控程序和DLL中VCL组件的互操作等,原因非常复杂,解决起来难度大,主要原因是主控程序和DLL中均有一个Application、Screen对象,虽然在调用时用主Application、Screen替代dll中相关对象可解决部分问题,但总体上基本上没有好办法可用。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。
#4
可以的,比较麻烦而已
#5
to aiirii(ari-淘金坑)
怎么实现?????
怎么实现?????
#6
传递Application, Screen的址址到Dll中应该就可以实现的,因为我实现过DLL+MDI
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.
***********************************
高级群号:16497064欢迎编程高手加入.
***********************************
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.
***********************************
高级群号:16497064欢迎编程高手加入.
***********************************
#7
sharemem了没?
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。
#8
看来,我只好帮大家顶顶了
#9
>>怎么实现?????
印象 <<delphi 深度探索>>II 就有谈到
印象 <<delphi 深度探索>>II 就有谈到
#10
我放弃了,还是改用MDI实现,结贴
#1
你是这个意思吗?
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.Parent := Panel1;
Form2.Align := alClient;
Form2.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.Parent := Panel1;
Form2.Align := alClient;
Form2.Show;
end;
#2
不是,要的问题的关键是直接使用Project中的Form可以实现Dock,利用调用Dll函数中传过来的TFormClass类型的变量来创建Form时,不能实现Dock功能
关键:Dock Dll's Form!!!!
---------------------------------
请楼下的不要再走偏了,谢谢!!!!
关键:Dock Dll's Form!!!!
---------------------------------
请楼下的不要再走偏了,谢谢!!!!
#3
borland的包括delphi、C++Builder制作出的包含窗体和其他可视VCL组件dll文件工作起来都有一些不可克服的问题:焦点获得和转移、停靠、主控程序和DLL中VCL组件的互操作等,原因非常复杂,解决起来难度大,主要原因是主控程序和DLL中均有一个Application、Screen对象,虽然在调用时用主Application、Screen替代dll中相关对象可解决部分问题,但总体上基本上没有好办法可用。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。
#4
可以的,比较麻烦而已
#5
to aiirii(ari-淘金坑)
怎么实现?????
怎么实现?????
#6
传递Application, Screen的址址到Dll中应该就可以实现的,因为我实现过DLL+MDI
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.
***********************************
高级群号:16497064欢迎编程高手加入.
***********************************
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.
***********************************
高级群号:16497064欢迎编程高手加入.
***********************************
#7
sharemem了没?
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。
#8
看来,我只好帮大家顶顶了
#9
>>怎么实现?????
印象 <<delphi 深度探索>>II 就有谈到
印象 <<delphi 深度探索>>II 就有谈到
#10
我放弃了,还是改用MDI实现,结贴