执行的时候就变成了黑板一块,如果我设计期加进去的话,设计期可以看到效果,但是运行的时候也是变成黑板一块。请高手帮忙解决。
控件代码如下:
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.