转载请指明出处来源。
2.双简合璧
2.1.带有T[x]Label的T[x]Edit组件
请允许我用[x]的书写方式来表示不同的对象。因为随后将大量提及TLabeledEdit与TTntLabeledEdit、TCustomLabeledEdit与TTntCustomLabeledEdit这样及其雷同的类。
2.2.分析T[x]LabeledEdit组件结构
现在要设计一个类似TLabeledEdit的组件,查看ExtCtrls的TLabeledEdit定义如下:
TLabeledEdit = class(TCustomLabeledEdit)
TLabeledEdit从TCustomLabeledEdit继承并开放属性,TCustomLabeledEdit部分定义如下:
TCustomLabeledEdit = class(TCustomEdit)
private
FEditLabel: TBoundLabel;
Public
property EditLabel: TBoundLabel read FEditLabel;
可以看出来,TCustomLabeledEdit继承自TCustomEdit,并构造了一个TBoundLabel对象。
TBoundLabel对象定义如下:
TBoundLabel = class(TCustomLabel)
TBoundLabel与TLabel都是从TCustomLabel继承,两者溯本逐源,是兄弟关系。
TLabeledEdit的源头是TCustomEdit和TCustomLabel,而TTntLabeledEdit的源头是TTntCustomEdit和TTntCustomLabel。T[x]CustomEdit和T[x]CustomLabel结合而形成了T[x]CustomLabeledEdit。
在这里,T[x]CustomEdit和T[x]CustomLabel如同夫妻,两者与T[x]CustomLabeledEdit如同父(母)子关系。
上一章设计的TGcxCustomEdit和TGcxCustomIntEdit可以替代T[x]CustomEdit,现在我们需要一个新的T[x]BoundLabel对象。
2.3.设计TGcxCustomLabel和TGcxBoundLabel
2.3.1.设计TGcxCustomLabel
为了求简单,我们先简化TGcxCustomLabel设计,直接从TTntCustomLabel派生,不做任何修改。
TGcxCustomLabel = class(TTntCustomLabel)
end;
2.3.2.从TBoundLabel、TTntBoundLabel到TGcxBoundLabel
TBoundLabel的部分定义:
TBoundLabel = class(TCustomLabel)
private
function GetTop: Integer;
function GetLeft: Integer;
function GetWidth: Integer;
function GetHeight: Integer;
procedure SetHeight(const Value: Integer);
procedure SetWidth(const Value: Integer);
protected
procedure AdjustBounds; override;
public
constructor Create(AOwner: TComponent); override;
TTntBoundLabel的部分定义:
TTntBoundLabel