2013-02-10 39 views
-3

I#米调用一个类别的不同形式的一个函数,这个类这两个类之间共享作为第二类的属性访问来自不同类的类/组件程序/作为属性

TMyClass = class 
private 

public 
procedure onconnect (...); 

end; 


TFormA = class(TForm) 

MYCLASS : TMyClass; 

procedure StartFormB(...) 

end; 


TFormA.procedure StartFormB(...) 
begin 

    bForm.MYCLASS := MyClass; 

    bForm.Show; 

end; 


TFormB = class(TForm) 
private 
.... 
FMYCLASS : TMyClass; 
public 
...... 
..... 
property MYCLASS : TMyClass read FMYCLASS write FMYCLASS; 

end; 

假设TMyClass就像是一个Indy TCP服务器,如何调用bForm中的类事件过程onconnect(..)或onexecute(..)函数只需通过属性访问共享类实例?

这是很容易

aForm : TMyForm; 


aForm.onconnect(...); 

此过程被链接到类事件过程 但 bForm.FMyClass.onconnect(...)

不行,我不能建立ALINK来类事件过程...

+3

'MyClass.XXX'调用一个名为'XXX'的方法。这很明显,它不可能是答案。所以我认为你需要改善这个问题。 – 2013-02-10 21:38:57

+2

另外,请不要调用对象'MyClass'。你必须学习一个类和一个对象之间的区别。一个对象是一个类的实例。在你的代码中,'MYCLASS'和'FMYCLASS'不是类。它们是实例或对象。相应地命名它们。 – 2013-02-10 21:43:05

+0

'OnConnect()'相同。对于事件属性,“On”前缀是_reserved_,将其重命名为Connect()。 – NGLN 2013-02-10 21:45:42

回答

3

如果问题是如何能够从另一个单元的类的对象属性中调用方法,那么答案是:

  • 确保对象属性声明公共发表
  • 确保该方法被声明公共

调用,则该方法是通过完成:

begin 
    FormA.MyClass.OnConnect(); 

从编辑可以理解的,你实际上并没有试图调用财产但私人背后。这是故意不起作用的。物业设计保护其背后的实际价值。在你的情况下,读取属性的访问说明符将编译器直接重定向到专用字段,但它也可能是一个函数。

因此:致电属性(MyClass),而不是字段(FMyClass)。

+0

我改变了上面的问题文字; bForm.FMyClass.OnConnect();这不会像我调用FormA.MyClass.OnConnect(); – user1769184 2013-02-10 21:57:25