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