com接口函数参数类型能不能是delphi的控件类型? ( 积分: 100 )

  • 主题发起人 主题发起人 dulao5
  • 开始时间 开始时间
D

dulao5

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把窗体包含到com中,客户端通过com使用窗体,现在已经做到了。
问题是客户端无法设置和读取窗体的各种属性。
往类型库编辑器中增加接口函数时,函数参数类型不能是“类型下拉列表”以外的元素。
手工更改tlb文件,比如增加uses的单元,delphi会立即强制改回来
所以导致我无法在com中定义数据类型是TForm/TWinControl的属性

请问大家应该怎么办?
 
我想把窗体包含到com中,客户端通过com使用窗体,现在已经做到了。
问题是客户端无法设置和读取窗体的各种属性。
往类型库编辑器中增加接口函数时,函数参数类型不能是“类型下拉列表”以外的元素。
手工更改tlb文件,比如增加uses的单元,delphi会立即强制改回来
所以导致我无法在com中定义数据类型是TForm/TWinControl的属性

请问大家应该怎么办?
 
搜索到一些帖子,有如下认识:

com只能使用标准的数据类型,对于编程中其他类型只能通过间接的类型转换来实现

1) 对于某些控件对象(Tform类型和TwinContrl类型等)delphi数据类型,可以使用int类型与指针类型进行类型转换来实现,([red]必须在同一个进程内,否则指针无法这个能取映射[/red]),例如下面的实现:
接口方法:
代码:
  ITLogin = interface(IPlug)
    ['{06B82963-EE63-49B6-8989-8D3021928447}']
    procedure ShowSub(POwner: SYSUINT; ParentHand: SYSUINT); safecall;
    // POwner在com接口中参数类型是整形,在实现中当作指针来用
    // ParentHand在com接口中参数类型是整形,在实现中当作HWND类型来用
Com的接口实现:
代码:
procedure TTLogin.ShowSub(POwner: SYSUINT; ParentHand: SYSUINT);
type
  PComp=^TComponent;
begin
  if SubForm=nil then
    SubForm:= TSubForm.Create(PComp(POwner)^); 
//利用强制类型转换,先还原成^Tcomponent的指针类型,然后解除指针参照
  subform.ParentWindow:=ParentHand;//直接赋值,隐式类型转换
  subform.Show;
end;
客户端
代码:
var
loginCom:ITLogin;
begin
    if loginCom=nil then
       loginCom:=CreateComObject(CLASS_TLogin) as ITLogin;
    LoginCom.ShowSub(cardinal(@self),self.Panel1.Handle); 
// cardinal(@self)   先取地址,再显式类型转换
// self.Panel1.Handle 隐式类型转换
End;

[blue]2)我想问,如果参考ADO的接口和对象组织方式,需要定义大量的数据类型和接口,这样函数参数类型就可以是它定义的任意类型了。所以如果用com做界面的封装,必须用com的基础数据类型(int、long、BStr等)定义大量的自定义数据类型,对吗?是不是工作量太大了?[/blue]
 
我的意思,是不是应该这么做:
写一个IForm接口
写一个TBaseForm类实现IForm接口
然后com组件中的窗体都用这个类做基类
在com的接口定义中,函数参数类型使用IForm返回给客户端
 
并不需这样,使用OLEVARIANT几付可以应付所有数据类型,通过它进行部分转换就可以了。比如TDataSet,TList等都可以通过其转换。
 
TO:HongYuan
我这么做不行啊,请问应该怎么做:
function TTLogin.ShowSubForm(POwner, ParentHand: SYSUINT): OleVariant;
begin
if SubForm=nil then
SubForm:= TSubForm.Create(PComp(POwner)^);
...
result:=subform;//提示编译错误
end;
编译错误:[red]Incompatible types: 'OleVariant' and 'TSubForm'[/red]
 
后退
顶部