自定义仪表无法在运行时绘制

时间:2012-04-29 19:54:41

标签: delphi components

FPercentDone0,将其值分配给错误的地方。添加UpdatePercent过程并在值更改时调用它来修复它并绘制所有内容。

愚蠢的错误,抱歉浪费你的时间。


首先,这是我第一次尝试编写任何类型的组件。属性,方法等是一个简单的部分,但是我已经在墙上画了画布。我确信这是一个新手的错误,但我根本看不到它。我盯着delphi附带的TGauge因为我正在尝试类似但更简单的东西,它仍然只是一个单杠。我无法在运行时绘制进度,这对我来说是最奇怪的部分,我可以在设计时看到它工作但是当我运行它时...至少得到背景颜色,但没有进度条。

没有任何代码粘贴,因为它无论如何都类似于TGauge。我有两个TBitmap's,一个用于背景,另一个用于进度条本身,我用背景颜色填充一个,将其绘制到组件画布,如果有边框偏移第二个的原点并减小其矩形,用进展颜色绘制它并将其绘制到画布上......对我来说这似乎很简单,但我做错了什么?

相关代码:

type
  TCustomGaugeComp = class(TGraphicControl)
  private
    FMaxValue, FMinValue, FCurValue: DWord;
    FFillBackColor, FFillForeColor: TColor;
    FPercentDone: Real;
    FBorderStyle: TBorderStyle;
    FBorderWidth: Integer;
    procedure SetMaxValue(Value: DWord);
    procedure SetMinValue(Value: DWord);
    procedure SetProgress(Value: DWord);
    procedure SetFillBackColor(Value: TColor);
    procedure SetFillForeColor(Value: TColor);
    procedure SetBorderStyle(Value: TBorderStyle);
    function GetPercentDone: String;
    procedure SetBorderWidth(Value: integer);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Align;
    property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
    property BorderWidth: Integer read FBorderWidth write SetBorderWidth default 1;
    property Constraints;
    property Enabled;
    property Font;
    property FillForeColor: TColor read FFillForeColor write SetFillForeColor default clBlack;
    property FillBackColor: TColor read FFillBackColor write SetFillBackColor default clWhite;
    property MinValue: DWord read FMinValue write SetMinValue default 0;
    property MaxValue: DWord read FMaxValue write SetMaxValue default 100;
    property Progress: DWord read FCurValue write SetProgress default 0;
    property PercentDone: String read GetPercentDone;
    property Visible;
  end;


procedure TCustomGaugeComp.Paint;
var
  Background, Progress: TBitMap;
begin
  with Canvas do
  begin
    Background := TBitMap.Create;
    try
      Background.Height := Height;
      Background.Width := Width;
      Background.Canvas.Brush.Color := FFillBackColor;
      Background.Canvas.Brush.Style := bsSolid;
      Background.Canvas.FillRect(ClientRect);
      Progress := TBitMap.Create;
      try
        Progress.Height := Height;
        Progress.Width := Width;
        if FBorderStyle = bsSingle then
        begin
          Progress.Height := Progress.Height - BorderWidth*2;
          Progress.Width := Progress.Width - BorderWidth*2;
        end;
        Progress.Width := trunc(Progress.Width*FPercentDone/100);
        Progress.Canvas.Brush.Color := FFillForeColor;
        Progress.Canvas.FillRect(Rect(0,0,Progress.Width,Progress.Height));
        Background.Canvas.Draw(BorderWidth,BorderWidth,Progress);
      finally
        Progress.Free;
      end;
      Draw(0,0,Background);
    finally
      Background.Free;
    end;
  end;
end;
只要值发生变化,就会调用

重新绘制(或刷新):min / max / position / borderwidth。

事实上它在设计时也没有完美表现,取得了进展,有时甚至根本没有绘制,直到我只是 OPEN 对象检查器,只需用鼠标去那里。 。TGauge过度使用CopyMode,我刚开始这个,我还没有真正理解CopyMode值或它的正确用法,因此复制粘贴和调整代码是不会的。< / p>

1 个答案:

答案 0 :(得分:1)

FPercentDone0,将其值分配给错误的地方。添加UpdatePercent过程并在值更改时调用它来修复它并绘制所有内容。

愚蠢的错误,抱歉浪费你的时间。