元件的各属性的初值是怎么怎么得到的?(100分)

  • 主题发起人 主题发起人 j5203
  • 开始时间 开始时间
名字是IDE起的,IDE负责为每个新创建的控件创建一个全局唯一的名字。
btw:都别妈妈的
 
IFormDesigner有一个方法uniquename就是用来获得唯一控件Name的
 
缺省值都是在create里显式设置的.不断的向上分析控件的祖先类就可找到.
 
再发:
又看了你上面的问题,才知道我也离题万里了。都被你引入歧途啦。
你说在 TControl 类中没有看到建立高和宽,这就对了。就因为它定义了类成员,
又没有显式地赋值,所以高和宽还是定义时的默认值。各处的引用只证明这两个
类成员确实被用作了控件的高和宽的代表。
 
就因为它定义了类成员,又没有显式地赋值,所以高和宽还是定义时的默认值?
又没有显式地赋值??--那就是隐式的赋值了,在什么地方?
所以高和宽还是定义时的默认值--0?可是我发现Height是41,width是100。
 
我也试了试,用代码动态创建TNewTest,height,width都=0
 
To 小雨哥:
我想,你用的是Delphi5吧。请你换成Delphi6试一试。

本人水平是不怎么样,但我也不想你想象的那样蠢!
你也不是什么救世主!
你要有什么话就直说,没必要拐弯抹角的!
对于你多次的回答,多谢!
 
to j5203
不好意思,说得有点过了。还是谈 Delphi 吧。
D6 我还没使用,我试了以后再个别回答。
 
在Delphi6里面
TControl类的父类是TComponent,TComponent没有Fwidth和FHeight,所以初值不可能是从
继承的create方法得来的。难道说TControl类的Fwidth和FHeight也是由IDE指
定的吗--TControl类的Create过程里可没有对Fwidth和FHeight赋值的语句。
那还有什么类的什么属性是IDE指定的--Create过程里没赋值的属性就是由IDE指定的?
 
在create中都有赋值的,如果本身没有,就在他的祖先类中,
一般的,不是通过在代码中赋值就是设置了defalut值了
看动态增加控件
button_name:= TButton.Create(self);
可见name是在create时生成的。
 

我重复了你的源代码,可是,它就是一个 0 的高和宽值。
 
to j5203
是,搞了半天,我也没明白,估计是 IDE API 接口函数在捣鬼。
D6 显示 Width:100,Height:41。D5 就没这现象。
 
To j5203
constructor TCustomControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create; // 去查这句!!!!
TControlCanvas(FCanvas).Control := Self;
end;
中的 TControlCanvas 再去看一看。
 
TO j5203
如果你继承自 TWinControl 或 TCustomControl ,不显式地在创建过程中定义高或宽的值,
你会得到一个高或宽为 0 的控件外观。
这是因为:
TWinControl 类使用 API 画出外观(类似于 IntersectClipRect)。
TCustomControl 类使用 TControlCanvas 画出外观(就象 TControlCanvas.Create)。
怎么定义的?
首先在 initialization 段定义 InitControls ,在这个过程中引入 CanvasList ,
然后在 TControlCanvas 中取得对它的引用。由于 VCL 单继承,所以在使用前必须将它
先归入成为类成员。在控件中,只有 TWinControl 类可以承载别的控件,所以在
TControl 中将 Parent 引入时,指定它必是 TWinControl 类。TCustomControl 类
继承自 TWinControl 类,但实际上又做了新的封装,它具有全部的控件要素。
但是,高和宽是定义在 TControl 中的,TControl 类并没有给它赋值,那它的默认值
就只能是 0 了。
说起来,有很多很多要说的,只能建议你自己查源代码了。好了,你的两个问题我都
回答了,给分吧。呵呵....
 
写到这里,我想把我在大富翁的感受一起告诉你:
我来大富翁时间不长,完全是慕名而来.......(以
下废话全部删除,有冒犯的地方,只好请大家多多
包涵,小雨决心严以律己。) 2001.12.30
 
to j5203
你说的width和height是在tcontrol定义的!而我们把控件放到form上就有长短了!这是因为
width和height在各自的子类中赋值的!如tform是在tcustomform中的createnew赋值的,而tbutton是在
tbutton的create中定义的!
 
TCustomControl类的Create并没有指定Width和Height,
但你随便找一个TCustomControl的子类的Create来看看就知道,
Width和Height是在子类的Create中设置的,例(StdCtrls.pas):

constructor TCustomEdit.Create(AOwner: TComponent);
const
EditStyle = [csClickEvents, csSetCaption, csDoubleClicks, csFixedHeight];
begin
inherited Create(AOwner);
if NewStyleControls then
ControlStyle := EditStyle else
ControlStyle := EditStyle + [csFramed];
Width := 121;
Height := 25;
TabStop := True;
ParentColor := False;
FBorderStyle := bsSingle;
FAutoSize := True;
FAutoSelect := True;
FHideSelection := True;
AdjustHeight;
end;

至于Name属性,是由Delphi IDE在设计时创建了构件后再为其命名的,
不同版本的Delphi实现方式也不一样。这不属于构件作者需要关心的
范畴。如果你在运行时动态创建一个控件,你会发现它的Name属性为空。
另外控件的ClassName是由Delphi的RTTI机制构造的,在TObject类中实现。
例:

procedure TForm1.Button1Click(Sender: TObject);
var
MyEdit: TEdit;
begin
MyEdit:=TEdit.Create(Self);
ShowMessage(
Format('ClassName: %s'#13#10'Component Name: %s'#13#10'Control.Width: %d'#13#10'Control.Height %d',
[MyEdit.ClassName,MyEdit.Name,MyEdit.Width,MyEdit.Height]));
end;

 
两位哥们儿,要是我的类直接从TControl继承呢?
先看看前面的内容再说话好不好,多谢。
 
那你就要给它(width,height)进行初使!
 
后退
顶部