关于TControl 和TWinControl求助; (10分)

  • 主题发起人 主题发起人 陈晨
  • 开始时间 开始时间

陈晨

Unregistered / Unconfirmed
GUEST, unregistred user!
TControl = class(TComponent)
private
FParent: TWinControl;
此调用前只是TWinControl= class

TWinControl = class(TControl)
哪位大侠给解释解释?????
我考虑不过去了
来源于
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2441371
parent 是容器,但是,他为什么会对所包容的东西产生影响。都有哪些影响。为什么
会有这些影响。
 
TWinControl= class;是个类的声明,这样就可以被其他的类引用
TWinControl = class(TControl)这才是类真正的定义
 
也就是说只要类声明了就可以引用了,而不管是否有定义。
这两个好像是个循环呀
 
TWinControl= class
---仅仅是在告诉编译器它是个类,编译器只需要把它作为类处理就行了

TWinControl = class(TControl) ---是在真正定义一个类,前面的申明只告诉编译器,TControl是个类,TWinControl类从TControl继承

当真正要使用TControl中的东东时,就必须要uses它所在的单元,编译器才知道如何调用。
 
TControl 再TwinControl定义前已经引用了。
他这时候引用的是什么呢?
private
FParent: TWinControl;

还有一个问题就是parent 对他所含内容的影响,比如说form.parent:=panel;
这个panel对form的属性等有什么影响???

 
还记得那个“forward”申明么,跟它的意思差不多。
 
详细解释一下好吗?
 
form.parent:=panel;
对Form没什么影响,只是将它自动加入到Panel中,成为子控件,归Panel管理。
在界面上看来,Form显示到了Panel中。
 
Type
TA=class
//-----------------> 1
TB=Class(XXX)
private
A:TA;//由于TA的实现在TB之后,如果没有 1 那句声明的话就会找不到TA这个类
end;
TA=Calss
.....
end;
 
A:TA;//由于TA的实现在TB之后,如果没有 1 那句声明的话就会找不到TA这个类
---------------------------------------------------------------------------
如果你不在之前申明一下,编译器怎么绑你找?
或者你写成:
TA=Calss
.....
end


TB=calss
private
A:TA;
end;
就不用先申明。

个人认为:这些简单的问题,楼主可以找些书看,自己多动手试试。
一些问题大家可以帮你,但不是总能帮了你。
 
Type
TA=class
//-----------------> 1
TB=Class(XXX)
private
A:TA;// end;
TA=Calss(TB)//这里不是任意的而是继承TB来的
.....
end


还有就是parent的问题。

书我也看了不少了。可是这种实现中相互包含的类的实现。没有见到那个书里有,
而且,即使有,我也看不明白。如果编译器找到TA , 而tA的实现由于继承自TB 哪么
他们就会没完没了的找下去了!

parent的问题,如apw所说但是
form.parent:=panel;
对Form没什么影响,只是将它自动加入到Panel中,成为子控件,归Panel管理。
在界面上看来,Form显示到了Panel中。
有影响呀。而且影响到我不明白的地步
具体请看http://www.delphibbs.com/delphibbs/dispq.asp?lid=2441371

 
因为Delphi要先声明再使用,所以刚才那样定义的向前声明的意思。
 
procedure TControl.SetParent(AParent: TWinControl);
begin
if FParent <> AParent then
begin
if AParent = Self then
raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
if FParent <> nil then
FParent.RemoveControl(Self);
if AParent <> nil then
begin
AParent.InsertControl(Self);
UpdateAnchorRules;
end;
end;
end;
 
form.parent:=panel;
-----------------------------
实际上是form调用panel中的方法,将自己加到它的子控件列表中。
看看VCL源码就清楚了:
procedure TControl.SetParent(AParent: TWinControl);
begin
if FParent <> AParent then
begin
if AParent = Self then // 不允许自己成为自己的Parent
raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);

// 设Parent则从FParent的列表中删除自己
if FParent <> nil then
FParent.RemoveControl(Self);

// 将自己添加到FParent的子控件列表中
if AParent <> nil then
begin
AParent.InsertControl(Self);
UpdateAnchorRules;
end;
end;
end;

// TWinControl中的过程
procedure TWinControl.InsertControl(AControl: TControl);
begin
AControl.ValidateContainer(Self);
Perform(CM_CONTROLLISTCHANGE, Integer(AControl), Integer(True));
// 加到列表中
Insert(AControl);
// 如果当前不是在“正在读取”状态
if not (csReading in AControl.ComponentState) then
begin
// 让控件重新显示
AControl.Perform(CM_PARENTCOLORCHANGED, 0, 0)
// 颜色变化
AControl.Perform(CM_PARENTFONTCHANGED, 0, 0)
// 字体变化
AControl.Perform(CM_PARENTSHOWHINTCHANGED, 0, 0)
// 提示信息变化
AControl.Perform(CM_PARENTBIDIMODECHANGED, 0, 0)
// 文字显示方式变化
// 让控件重新进行显示
if AControl is TWinControl then
begin
AControl.Perform(CM_PARENTCTL3DCHANGED, 0, 0);
UpdateControlState;
end else
if HandleAllocated then AControl.Invalidate;

// 应用子控件的Align属性
AlignControl(AControl);
end;
Perform(CM_CONTROLCHANGE, Integer(AControl), Integer(True));
end;
 
重新画了控件我在此方法之后用的,alpha属性为什么不可以实现半透明呢???
千万别嫌我麻烦,帮忙帮到底,谢谢了各位
 
我来说一下,TWinControl= class 是TWinControl= class(Tobject)的省略形式,Tobject是一切类的父类,也就是祖先类,其它的类都是由这个类继承来的,也就是这个类的子孙; 另外你的不透明的问题,可能是还有有一个关于是否实现半透明的属性没有设置,你可以查看一下相关的书籍
 
重新画了控件我在此方法之后用的?
--------------------------------------
什么意思? 有代码没?
 
具体相关问题参见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2441371
谢谢各位,
 
其实这是delphi的语法了,要先定义,后引用,delphi中就有好多这样的例子哦。
 
用的多了也就明白了,结束了分数分配希望不要介意
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
748
import
I
I
回复
0
查看
696
import
I
后退
顶部