2

FPercentDoneだっ0た、間違った場所にその値を割り当てていました。プロシージャを追加UpdatePercentし、値が変更されたときに呼び出すと、プロシージャが修正され、すべてが描画されます。

ばかげた間違い、あなたの時間を無駄にしてすみません。


まず第一に、これはあらゆる種類のコンポーネントを書くための私の最初の試みです。プロパティや方法などは簡単な部分でしたが、キャンバスに描画して壁にぶつかりました。これは新人の間違いだと思いますが、私にはわかりません。似ているがもっと単純なものを試しているので、デルファイに含まれているものを見つめましたTGauge。それはまだ単なる鉄棒です。実行時に進行状況を描画することに失敗しています。これは、とにかく、デザイン時には機能しているのに、実行時には機能していないことを確認できる最も奇妙な部分です...少なくとも背景色は正しく表示されます。 、ただしプログレスバーはありません。

TGaugeとにかく似ているので、コードの貼り付けなし。2つありますTBitmap's。1つは背景用、もう1つはプログレスバー自体用です。1つを背景色で塗りつぶし、それをコンポーネントキャンバスに描画します。境界線がある場合は、2つ目の原点をオフセットし、長方形を減らして、進行状況をペイントします。色を塗ってキャンバスに描きます...私にはこれは簡単に思えましたが、何が間違っているのでしょうか。

関連コード:

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;

RePaint(またはRefresh)は、値が変更されるたびに呼び出されます:min / max / position/borderwidth。

実際、設計時に完全に機能しているわけではなく、進行状況が表示されることもありますが、オブジェクトインスペクターを開いて、そこにマウスを置いていくまでまったく描画されないこともあります。まだ値やその適切な使用法を実際には理解していないため、コードをコピーして貼り付けたり微調整したりしてもうまくいきません。TGaugeCopyModeCopyMode

4

1 に答える 1

1

FPercentDoneだっ0た、間違った場所にその値を割り当てていました。プロシージャを追加UpdatePercentし、値が変更されたときに呼び出すと、プロシージャが修正され、すべてが描画されます。

ばかげた間違い、あなたの時間を無駄にしてすみません。

于 2012-05-01T11:05:51.700 に答える