执行的时候就变成了黑板一块,如果我设计期加进去的话,设计期可以看到效果,但是运行的时候也是变成黑板一块。请高手帮忙解决。
控件代码如下:
unit DigitsPanel;interfaceuses
Windows, Messages, SysUtils, Classes, Controls,Graphics,Forms,Dialogs,ExtCtrls;type
TDigitsLength=1..8;
TDigitsPanel = class(TGraphicControl)
private
FDigits:TBitMap;
FDigitWidth,FDigitHeight:Word;
FBevelOuter:TPanelBevel;
FBevelInner:TPanelBevel;
FBevelWidth:Byte;
FColor:TColor;
FLength:TDigitsLength;
FMargin:Byte;
FValue:Longint;
{ Private declarations }
protected
procedure SetDigits(Value:TBitMap);
procedure SetBevelOuter(Value:TPanelBevel);
procedure SetBevelInner(Value:TPanelBevel);
procedure SetBevelWidth(Value:Byte);
procedure SetColor(Value:TColor);
procedure SetLength(Value:TDigitsLength);
procedure SetMargin(Value:Byte);
procedure SetValue(Value:Longint);
procedure SetBounds(ALeft,ATop,AWidth,AHeigth:Integer);override;
procedure Paint;override;
{ Protected declarations }
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
{ Public declarations }
published
property Digits:TBitMap Read FDigits Write SetDigits;
property BevelOuter:TPanelBevel Read FbevelOuter Write SetBevelOuter default bvRaised;
property BevelInner:TPanelBevel Read FbevelInner Write SetBevelInner default bvLowered;
property BevelWidth:Byte Read FBevelWidth Write SetBevelWidth default 2;
property Color:TColor Read FColor Write SetColor default clBlack;
property Length:TDigitsLength Read FLength Write SetLength default 4;
property Margin:Byte Read FMargin Write SetMargin default 2;
property Value:Longint Read FValue Write SetValue default 0;
{ Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TDigitsPanel]);
end;constructor TDigitsPanel.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
ControlStyle:=ControlStyle+[csOpaque,csReplicatable];
Width:=100;
Height:=20;
FDigits:=TBitMap.Create ;
FBevelOuter:=bvRaised;
FBevelInner:=bvLowered;
FBevelWidth:=2;
FColor:=clBlack;
FLength:=4;
FMargin:=2;
FValue:=0;
end;destructor TDigitsPanel.Destroy ;
begin
FDigits.Free ;
inherited Destroy;
end;procedure TDigitsPanel.SetDigits(Value:TBitMap);
begin
if Value<>nil then
begin
FDigits.Assign(Value);
FDigitWidth:=Trunc(FDigits.Width/10);
FDigitHeight:=FDigits.Height ;
SetBounds(Left,Top,0,0);
end;
end;procedure TDigitsPanel.SetBevelOuter(Value:TPanelBevel);
begin
FBevelOuter:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBevelInner(Value:TPanelBevel);
begin
FBevelInner:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBevelWidth(Value:Byte);
begin
FBevelWidth:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetColor(Value:TColor);
begin
FColor:=Value;
Invalidate;
end;procedure TDigitsPanel.SetLength(Value:TDigitsLength);
begin
FLength:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetMargin(Value:Byte);
begin
FMargin:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetValue(Value:Longint);
begin
FValue:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBounds(ALeft,ATop,AWidth,AHeigth:Integer);
var
Factor:Integer;
begin
Factor:=Integer(BevelOuter<>bvNone)+Integer(BevelInner<>bvNone);
inherited SetBounds(ALeft,ATop,
FBevelWidth*Factor*2+FMargin+FLength*(FDigitWidth+FMargin),
FBevelWidth*Factor*2+FMargin+(FDigitHeight+FMargin));
end;procedure TDigitsPanel.Paint ;
var
TmpRect:TRect;
TopColor,BottomColor:TColor;
ValueString:String;
Digit:Integer;
procedure AdjustColors(Bevel:TPanelBevel);
begin
TopColor:=clBtnHighlight;
if Bevel=bvLowered then TopColor:=clBtnShadow;
BottomColor:=clBtnShadow;
if Bevel=bvLowered then BottomColor:=clBtnHighlight;
end;
begin
inherited paint;
TmpRect:=ClientRect;
if BevelOuter<>bvNone then
begin
AdjustColors(BevelOuter);
Frame3D(Canvas,TmpRect,TopColor,BottomColor,BevelWidth);
end;
if BevelInner<>bvNone then
begin
AdjustColors(BevelInner);
Frame3D(Canvas,TmpRect,TopColor,BottomColor,BevelWidth);
end;
with Canvas do
begin
Brush.Color :=Color;
FillRect(TmpRect);
end;
if FDigits<>nil then
begin
ValueString:=Format('%*d',[FLength,FValue]);
with TmpRect do
begin
Inc(Left,FMargin);
Right:=Left+FDigitWidth;
inc(Top,FMargin);
Bottom:=Top+FDigitHeight;
end;
for Digit:=1 to FLength do
begin
Case ValueString[Digit] of
'0'..'9':
Canvas.CopyRect(TmpRect,FDigits.Canvas,
Rect((Ord(ValueString[Digit])-48)*FDigitWidth,0,
(Ord(ValueString[Digit])-47)*
FDigitWidth,FDigitHeight));
else
Canvas.CopyRect(TmpRect,FDigits.Canvas,
Rect(10*FDigitWidth,0,10*FDigitWidth,FDigitHeight));
end;
with TmpRect do
begin
Left:=Right+FMargin;
Right:=Left+FDigitWidth;
end;
end;
end;
end;
end.调用代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DigitsPanel, StdCtrls, Spin;type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
DigitsPanel1:TDigitsPanel;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
DigitsPanel1.Value :=Random(Trunc(Exp(DigitsPanel1.Length *Ln(10))));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DigitsPanel1:=TDigitsPanel.Create(self);
with DigitsPanel1 do
begin
Parent :=self;
Top :=10;
Left :=20;
BevelWidth:=2;
Margin:=8;
Length:=8;
Digits.LoadFromFile('E:\Documents and Settings\Administrator\My Documents\My Pictures\10.bmp');
end;end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DigitsPanel1.Free ;
end;end.
控件代码如下:
unit DigitsPanel;interfaceuses
Windows, Messages, SysUtils, Classes, Controls,Graphics,Forms,Dialogs,ExtCtrls;type
TDigitsLength=1..8;
TDigitsPanel = class(TGraphicControl)
private
FDigits:TBitMap;
FDigitWidth,FDigitHeight:Word;
FBevelOuter:TPanelBevel;
FBevelInner:TPanelBevel;
FBevelWidth:Byte;
FColor:TColor;
FLength:TDigitsLength;
FMargin:Byte;
FValue:Longint;
{ Private declarations }
protected
procedure SetDigits(Value:TBitMap);
procedure SetBevelOuter(Value:TPanelBevel);
procedure SetBevelInner(Value:TPanelBevel);
procedure SetBevelWidth(Value:Byte);
procedure SetColor(Value:TColor);
procedure SetLength(Value:TDigitsLength);
procedure SetMargin(Value:Byte);
procedure SetValue(Value:Longint);
procedure SetBounds(ALeft,ATop,AWidth,AHeigth:Integer);override;
procedure Paint;override;
{ Protected declarations }
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
{ Public declarations }
published
property Digits:TBitMap Read FDigits Write SetDigits;
property BevelOuter:TPanelBevel Read FbevelOuter Write SetBevelOuter default bvRaised;
property BevelInner:TPanelBevel Read FbevelInner Write SetBevelInner default bvLowered;
property BevelWidth:Byte Read FBevelWidth Write SetBevelWidth default 2;
property Color:TColor Read FColor Write SetColor default clBlack;
property Length:TDigitsLength Read FLength Write SetLength default 4;
property Margin:Byte Read FMargin Write SetMargin default 2;
property Value:Longint Read FValue Write SetValue default 0;
{ Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TDigitsPanel]);
end;constructor TDigitsPanel.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
ControlStyle:=ControlStyle+[csOpaque,csReplicatable];
Width:=100;
Height:=20;
FDigits:=TBitMap.Create ;
FBevelOuter:=bvRaised;
FBevelInner:=bvLowered;
FBevelWidth:=2;
FColor:=clBlack;
FLength:=4;
FMargin:=2;
FValue:=0;
end;destructor TDigitsPanel.Destroy ;
begin
FDigits.Free ;
inherited Destroy;
end;procedure TDigitsPanel.SetDigits(Value:TBitMap);
begin
if Value<>nil then
begin
FDigits.Assign(Value);
FDigitWidth:=Trunc(FDigits.Width/10);
FDigitHeight:=FDigits.Height ;
SetBounds(Left,Top,0,0);
end;
end;procedure TDigitsPanel.SetBevelOuter(Value:TPanelBevel);
begin
FBevelOuter:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBevelInner(Value:TPanelBevel);
begin
FBevelInner:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBevelWidth(Value:Byte);
begin
FBevelWidth:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetColor(Value:TColor);
begin
FColor:=Value;
Invalidate;
end;procedure TDigitsPanel.SetLength(Value:TDigitsLength);
begin
FLength:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetMargin(Value:Byte);
begin
FMargin:=Value;
SetBounds(Left,Top,0,0);
end;procedure TDigitsPanel.SetValue(Value:Longint);
begin
FValue:=Value;
Invalidate;
end;procedure TDigitsPanel.SetBounds(ALeft,ATop,AWidth,AHeigth:Integer);
var
Factor:Integer;
begin
Factor:=Integer(BevelOuter<>bvNone)+Integer(BevelInner<>bvNone);
inherited SetBounds(ALeft,ATop,
FBevelWidth*Factor*2+FMargin+FLength*(FDigitWidth+FMargin),
FBevelWidth*Factor*2+FMargin+(FDigitHeight+FMargin));
end;procedure TDigitsPanel.Paint ;
var
TmpRect:TRect;
TopColor,BottomColor:TColor;
ValueString:String;
Digit:Integer;
procedure AdjustColors(Bevel:TPanelBevel);
begin
TopColor:=clBtnHighlight;
if Bevel=bvLowered then TopColor:=clBtnShadow;
BottomColor:=clBtnShadow;
if Bevel=bvLowered then BottomColor:=clBtnHighlight;
end;
begin
inherited paint;
TmpRect:=ClientRect;
if BevelOuter<>bvNone then
begin
AdjustColors(BevelOuter);
Frame3D(Canvas,TmpRect,TopColor,BottomColor,BevelWidth);
end;
if BevelInner<>bvNone then
begin
AdjustColors(BevelInner);
Frame3D(Canvas,TmpRect,TopColor,BottomColor,BevelWidth);
end;
with Canvas do
begin
Brush.Color :=Color;
FillRect(TmpRect);
end;
if FDigits<>nil then
begin
ValueString:=Format('%*d',[FLength,FValue]);
with TmpRect do
begin
Inc(Left,FMargin);
Right:=Left+FDigitWidth;
inc(Top,FMargin);
Bottom:=Top+FDigitHeight;
end;
for Digit:=1 to FLength do
begin
Case ValueString[Digit] of
'0'..'9':
Canvas.CopyRect(TmpRect,FDigits.Canvas,
Rect((Ord(ValueString[Digit])-48)*FDigitWidth,0,
(Ord(ValueString[Digit])-47)*
FDigitWidth,FDigitHeight));
else
Canvas.CopyRect(TmpRect,FDigits.Canvas,
Rect(10*FDigitWidth,0,10*FDigitWidth,FDigitHeight));
end;
with TmpRect do
begin
Left:=Right+FMargin;
Right:=Left+FDigitWidth;
end;
end;
end;
end;
end.调用代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DigitsPanel, StdCtrls, Spin;type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
DigitsPanel1:TDigitsPanel;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
DigitsPanel1.Value :=Random(Trunc(Exp(DigitsPanel1.Length *Ln(10))));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DigitsPanel1:=TDigitsPanel.Create(self);
with DigitsPanel1 do
begin
Parent :=self;
Top :=10;
Left :=20;
BevelWidth:=2;
Margin:=8;
Length:=8;
Digits.LoadFromFile('E:\Documents and Settings\Administrator\My Documents\My Pictures\10.bmp');
end;end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DigitsPanel1.Free ;
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货