如何创建复合控件(100分)

  • 主题发起人 主题发起人 zj_cat
  • 开始时间 开始时间
Z

zj_cat

Unregistered / Unconfirmed
GUEST, unregistred user!
我想创建一个控件,其主要要求如下:
1 有一个Label和一个Shape组成;
2 Shape是一个stCircle;
3 Label位于Shape上方,叠在一起,底色为Shape的颜色 ;
4 可根据鼠标的动作变换颜色;
5 可获得焦点,有TabOrder值
6 Label的Caption在实例被创建时,自动生成为该控件的TabOrder值
我看书写了一个最基本的代码,我觉得好像没有什么地方不对,最少可以
显示一个样子,却不被机器认可,总是出错,为表示感谢,提供100分

unit Tube;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,stdCtrls,ExtCtrls;

type
TTube = class(TCustomControl)
private
FLbl:TLabel;
FShape:Tshape;
{ Procedure ChangeColor(Const Value: TColor ); 暂未实现}
protected
public
constructor Create(AOwner:Tcomponent);override;
published
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('MyTube', [TTube]);
end;

{ TTube }

constructor TTube.Create(AOwner: Tcomponent);
begin
inherited Create(AOwner);
Width:=18;
Height:=18;

FShape.Create(Self);
FShape.Parent:=self;
FShape.Brush.Color:=clBlue;
FShape.Pen.Color:=clNone;
FShape.Pen.Mode:=pmCopy;
FShape.Height:=18;
FShape.Width:=18;
FShape.Visible:=True;
FShape.Shape:=stCircle;
FShape.Top:=0;
FShape.Left:=0;

FLbl:=TLabel.Create(self);
FLbl.Parent:=Self;
FLbl.Font.Name:='宋体';
Flbl.Font.Color:=clRed;
FLbl.Font.Size:=16;
FLbl.Caption:=TRim(inttostr(AOwner.Tag));
FLbl.Color:=clBlue;
FLbl.Alignment:=taCenter;
FLbl.Height:=18;
FLbl.Width:=18;
FLbl.Top:=0;
FLbl.Left:=0;
FLbl.Visible:=True;
end;
end.
 
把从tcustomcontrol继承改成从tpanel继承.
 
我的要求是两个控件一定要叠加在一起
 
看这里,写的不全,释放资源的没写

unit mypanel;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls,stdctrls;

type
Tmypanel = class(Tpanel)
private
myshape:TShape;
mylabel:tlabel;
protected
{ Protected declarations }
public
constructor Create(Aowner:Tcomponent);override;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [Tmypanel]);
end;

constructor TMypanel.Create(Aowner:Tcomponent);
begin
inherited create(aowner);
myshape:=tshape.Create(self);
myshape.parent:=self;
myshape.Align:=alclient;
myshape.Shape:=stcircle;
mylabel:=tlabel.Create(self);
mylabel.Align:=altop;
mylabel.parent:=self;
mylabel.Caption:=TRim(inttostr(AOwner.Tag));


end;

end.
 
customcontrol 你还有很多东西要做,
建议从最后开始,panel 不错。但没有焦点。
但我想不出你这个控件要焦点做什么。
 
前几天看到一个方法,用Canvas.TextOut直接画上去,但不太会用,不如直接用Label;我的这个控件,没有太多实际意义,只是代表一根有标号管子,我需要直接点击它已控制我的程序中的当前管子的标号,状态等
 
试过了www的方法,可能我太笨了,不能将Bevel.Inner和outer消掉。Pannel的
Caption也无法在程序中直接取消。
 
说得更加明确一些,我实际是要生成一个圆形的Label。
 
什么意思? 是 label 的内容按圆形排列吗?
 
不,每一个Label的形状是圆的而不是一般的方形
 
板主,我的问题无人回答,这100分怎么办?
 
我给你一个可生成圆形 Label 的控件(带源码),你研究一下应该就明白了,如何?
 
rope:我也想看看,谢谢拉 tingweb@wx88.net
 
rope 同志,多谢,若能提供,这100分归您了。本人Email: zj_cat@cn99.com
 
你的语句试试 Create(aOWNER);
LABEL.PAREN := oWNER;
没理由不行啊。。只是你可以这样,从label下继承,然后
画个TSharp ,也就是调过来就行了。
 
多人接受答案了。
 

Similar threads

后退
顶部