谁来解释一下这段代码(30分)

  • 主题发起人 主题发起人 套牢1
  • 开始时间 开始时间

套牢1

Unregistered / Unconfirmed
GUEST, unregistred user!
unit unit1;
interface
uses
Windows…
type
TMyForm = class;

TMyComponent = class(TComponent)
private
FMyForm : TMyForm;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
….
published
….//公有属性
end;

TMyForm = class(TForm)
protected
MyComponent1: TMyComponent;
…..
end;
我总是感觉TMyComponent和TMyForm 有点循环定义的嫌疑,谁能解释他们之间的关系
 
我感觉,TMyComponent的FMyForm ,TMyForm的MyComponent 只是一个指针一样的东西。

 
这个有点象,也不象!
 
unit unit1;
interface
uses
Windows…
type
TMyForm = class;

==============================================
TMyComponent = class(TComponent)
private
FMyForm : TMyForm;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
….
published
….//公有属性
end;
=============================================
TMyForm = class(TForm)
protected
MyComponent1: TMyComponent;
…..
end;
我总是感觉TMyComponent和TMyForm 有点循环定义的嫌疑,谁能解释他们之间的关系


*****************************************************************

如果不看中间那段
那么只不过是当前窗口用了TMyComponent控件而已
你可把控件的实现当作一个“黑箱子”
 
那是前置声明,只要中间都是类的声明就没问题
 
///你可把控件的实现当作一个“黑箱子”
可是控件中又引用了这个窗体呀
 
//引用就引用啊!
//试试下面的代码,照样可以执行
//form1只不过是TForm1的一个实例

constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FMyForm:=form1;
FMyForm.Caption :='Sample';
end;
 
前面的
Tmyform=class;
是后面Tmyform=class(Tform)...的一个提前申明,以致于使编译器不产生错误,许多地方都用
到此方法。
 
我觉得没有矛盾呀。

首先
type
TMyForm = class;
正如套牢1所说是前置声明,因为TMyComponent需要用到。

其次
TMyComponent = class(TComponent)
private
FMyForm : TMyForm;
说明TMyComponent含有一个私有的成员:FMyForm,他可以为nil,只是可能有这个成员。

TMyForm = class(TForm)
protected
MyComponent1: TMyComponent;

这个跟上面的意思差不多,不过他是放在protected之中,所以就是说TMyForm这个窗口之
中包含有一个受保护的TMyComponent,这个受保护的TMyComponent可能有一个成员是
TMyForm类。(我不是很了解为什么要protected)
 
不知道这么理解对不对
当在应用程序中添加一个TMyComponent控件,在这个控件的方法中我可以实例化一个
TMYform类的对象,在这个对象中,又可以实例化一个TMyComponent控件或者访问它的
一些属性。
 
怎么看都有些别扭呀
 
怎么看都很正常呀

可惜我一时想不出什么形容的方式。
 
大家注意:
如果需要修改 Form 的一些不可见属性、事件或方法,而又可以在设计状态下调试,
那么应该有一个假的控件执行此操作。将这个 TComponent 对象放置到窗体上,就可以对
窗体进行某些操作。如同控件面板上的 ApplicationEvents 控件一样,它是不可见的,
但可以在设计状态对 Application 的事件进行处理。
 
后退
顶部