关于怎样把一个对象传递给DLL中的窗体?请高手相助!欢迎讨论! (200分)

  • 主题发起人 主题发起人 沧海
  • 开始时间 开始时间

沧海

Unregistered / Unconfirmed
GUEST, unregistred user!
因为前面的问题没人回答,那我修改一下问题把。
问题:

1。怎样把DLL中的窗体放在一个 Panel 上?
2。DLL中的窗体上有个 ScrollBox 并且有 滚动条,怎样在实现 1 的效果上,
让 ScrollBox 的滚动条出现?

-------以下为-修改前
由于系统有很多的界面,我想把界面都放在DLL中。
可是由于很多界面都用到一个全局对象(用来和服务器通讯)。

问题:
1。在不同的DLL中怎样使用这个对象?
2。因为所有的DLL中需要引用这个对象所在的单元,但是这个对象在 initialization 中
就 Create 了。那么在不同的DLL中会不会都存在 一个自己的 拷贝?如果是这样,有没
有办法统一这拷贝--让所有的DLL实际上使用的是主程序中的那个 实例?
3。我在出程序中应该怎样使用DLL中的窗体才能达到以上效果?

 
1.不要在Dll的initialization中Create这个对象
2.在Dll中定义此对象,但是不要Create
3.在Dll提供的函数或过程中传递此对象,并赋值给Dll定义的此对象
4.必须在调用Dll中其他的函数或过程之前调用3中定义的函数或过程
5.全局变量必须在调用Dll中任何函数之前Create
如:
Dll中定义对象:
YourObject : TYourClass;
并提供函数:
function DllInit(Value : TYourClass):Boolean;
begin
Result := true;
YourObject := nil;
if Assigned(Value) then
YourObject := Value
else
Result := false

end;
主程序中在调用Dll之前先创建全局对象:
MainObject : TYourClass;
..
MainObject := TYourClass.Create;
然后初始化Dll;
DllInit(MainObject);
..其他的Dll初始化函数
..
调用Dll中的功能
 
A Class is a Pointer,
TObject = Pointer
 
dll 中的代码
function ShowMyForms(AHandle:TWinControl):integer;stdcall;
var
form1:Tform1;
begin
Result:=0;
form1:=Tform1.Create(nil)
try
form1.Parent :=AHandle
//注意这句话,加上了就有问题
form1.Show
except
Result:=-1;
end;
end;

exports ShowMyForms;

测试调用代码
function ShowMyForms(AHandle:TWinControl):integer;stdcall;External'mydll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMyForms(panel1);
end;


问题:为什么我看不到 我要的效果呀(窗体放在 Panel)
请各位多多指点。
 
有没有人知道呀?
 

1、关于“form1.Parent :=AHandle
//注意这句话,加上了就有问题”的答复:
如果AHandle(如 Panel.handle)是在Form1上,则运行时会出现溢出错误,
那是因为两个对象的 Parent 互相嵌套了,所以出现堆栈溢出错误,如果AHandle
是在另一个Form上,则不会出错,但form1不会出现在AHandle上。

2、关于“怎样把DLL中的窗体放在一个 Panel 上?”的答复:
在Delphi的类系中,TForm 是一种特殊的窗口,它不可附着在象TPanel之类的容
器控件上,虽然在程序中你可以设置它的 parent,设置后还可以返回它的新值,
但在外观上不会起任何作用的。
解决的办法:你在Form1上放置一个panel1,把form1上所有的其它控件全放在panel1
上,然后令form1.panel1.Parent :=AHandle 即可。
3、ScrollBox 中的内容超过了其可视的范围,滚动条自然就会出现。
 
to blueboy

>ScrollBox 中的内容超过了其可视的范围,滚动条自然就会出现。
绝对超过了其可视范围,因为我加了一些代码
var
aa:TButton;
begin
aa:=TButton.create(nil);
aa.Parent:=ScrollBox1;
aa.Left:=1000;
aa.Top:=1000;
end;
可是还是没有反应!
 
to BuleBoy

2、关于“怎样把DLL中的窗体放在一个 Panel 上?”的答复:
在Delphi的类系中,TForm 是一种特殊的窗口,它不可附着在象TPanel之类的容
器控件上,虽然在程序中你可以设置它的 parent,设置后还可以返回它的新值,
但在外观上不会起任何作用的。
解决的办法:你在Form1上放置一个panel1,把form1上所有的其它控件全放在panel1
上,然后令form1.panel1.Parent :=AHandle 即可。

我试了,好像还没反映也!
function ShowMyForms(AHandle:TWinControl):integer;stdcall;
var
form1:Tform1;
begin
Result:=0;
form1:=Tform1.Create(nil)
try
form1.ScrollBox1.Parent :=AHandle
/////////////
form1.Show
except
Result:=-1;
end;
end;

exports ShowMyForms;

测试调用代码
function ShowMyForms(AHandle:TWinControl):integer;stdcall;External'mydll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMyForms(panel1);
end;
 
是不是没有设置 HorzScrollBar.visible:=true 或 VertScrollBar.visible:=true ?
 
to BlueBoy

我在设计状态就可以出滚动条呀,难道他会自己变掉?
 
我没有在DLL中试过,但是在同一个APP中的两个不同FORM之间试了,是可以的。
 
看HELP中的这段说明:

Use ParentWindow with windowed controls that are packaged in a DLL so that they may be used by a VB, OWL or MFC application.

A TWinControl object can have either a Parent property or a ParentWindow property, but not both. If the Parent property of a control is not nil, the value of ParentWindow is ignored.

你再用 ParentWindow 试一下。
 
>绝对超过了其可视范围,因为我加了一些代码
>var
> aa:TButton;
>begin
> aa:=TButton.create(nil);
> aa.Parent:=ScrollBox1;
> aa.Left:=1000;
> aa.Top:=1000;
>end;
>
> 可是还是没有反应!


呵呵,问题找到了。你说的没反应是说看不到 buttom 吧?
仔细看了一下,原来你是动态生成TButton!问题出在
> aa:=TButton.create(nil);
这句上!动态生成的控件除了要设置它的parent之外,还要设置它的 Owner。
这句应改成:
aa:=TButton.create(ScrollBox1);
否则它是看不见的。我刚开始用动态生成的时候也犯了这个错误。
 
兄台下午好![:)]
你也一块来做做这个练习题吧!
 
其实我那 按钮出来就是为了 测试 ScrollBox的滚动条的问题,
看不看的见到是次要的,只要 滚动条出来就好了。
我用了你的代码
aa:=TButton.create(ScrollBox1);
滚动条还是没有呀,可是如果我不指定Left和Top不用你的代码我也看的到Button呀

好了,我们不讨论Button的事情了,帮我再想想看。为什么滚动条没了!
谢谢你了!
 
滚动条.....目前掌握到的信息还判断不出什么原因。真是对不起,看来要靠自己奋斗了。
 
后退
顶部