主窗体不变,将子窗体封装在com对象中...........?有一个问题不知道怎样解决(200分)

  • 主题发起人 主题发起人 looyo
  • 开始时间 开始时间
L

looyo

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个接口
Imytaskcom = interface
['{36D28881-E03D-4A49-8343-54F3E02E5110}']
functiondo
action(p1:tcomponent):HRESULT;
end;

我实现一个com对象如下
use unit1,...........;{unit1中定义了一个窗体}
Tmytask = class(TTypedComObject, Imytaskcom)
public
functiondo
action(p1:tcomponent):HRESULT;
end;

fuction tmytask.doaction(p1:tcomponent):HRESULT;
var mycom:Imytaskcom;
mytaskform:tform1;{tform1在unit1中定义}
begin
mytaskform:=tform1.create(p1);{p1作为这个窗体的父窗体}
mytaskform.show;
end;

我的客户程序这样调用
mycom:Imytaskcom
mycom:=createcomobject(class_mytask) as Imytaskcom;{class_mytask是com对象的guid}
mycom.doaction(form1);{form1为客户程序的主窗体}

以上com对象和客户程序都可以编译成功。
关键是运行mycom.doaction(form1);这一步出错EAccessViolation
好像是不能将tcomponent作为参数传递。
谁能解决这个问题我的要求是客户程序不变,通过
mycom:=createcomobject(class_mytask) as Imytaskcom中class_mytask的值的变动
来调用不同com对象中的窗体
 
fuction tmytask.doaction:HRESULT;
var mycom:Imytaskcom;
mytaskform:tform1;{tform1在unit1中定义}
begin
mytaskform:=tform1.create(Self);
mytaskform.show;
end;
 
Cut.fei:
我的com对象是封装在dll中的,你的self是什么意思啊。
 
类的本身。
 
to cut.fei
而那儿要求的参数是Tcomponent类型的啊
 
把mytaskform定义时全局的,或者在这个类中可在其它地方访问的--比如private里。
然后覆盖Destroy方法,在里面检查mytaskform是不是空,不是的话就Free它
用mytaskform:=tform1.create(nil);就可以生成实例了。
 
fuction tmytask.doaction(p1:tcomponent):HRESULT;
不要定义参数。使用过程。
 
谁能解决这个问题我的要求是客户程序不变,通过
mycom:=createcomobject(class_mytask) as Imytaskcom中class_mytask的值的变动
来调用不同com对象中的窗体

fuction tmytask.doaction(p1:tcomponent):HRESULT;
var mycom:Imytaskcom;
mytaskform:tform1;{tform1在unit1中定义}
begin
mytaskform:=tform1.create(p1);{p1作为这个窗体的父窗体}
mytaskform.show;
end;
//这里创建的都是Tfrom1的实例,跟你的要求好像不太一致吧
 
COM当然不能传递tcomponent对象的。你可以传递对象的指针地址。
fuction tmytask.doaction(p1:Integer):HRESULT;
var
Owner:tcomponent;
mycom:Imytaskcom;
mytaskform:tform1;{tform1在unit1中定义}
begin
Owner:=tcomponent(P1);
mytaskform:=tform1.create(Owner);{Owner作为这个窗体的拥有者}
mytaskform.show;
end;
//
调用时
XXX.doaction(Integer(某某tcomponent对象));
 
applyupdate(0);
 
晕倒,什么时候Com 能支持TComponent参数了,要是能支持
那还能跨语言调用了吗?
 
TO xeen
我也觉得有问题,但是你能给出一个好的解决方案吗
 
not necessary to pass the parent form, just use application
mytaskform:=tform1.create(Application);
 
后退
顶部