2017-03-29 5 views
0

アナログVUメーターに書き込もうとしています。私は、VUメーターのビットマップを使用し、ビットマップに針を描画します。私はトラックバーを使用していますし、それがメーターをテストするためのonChangeイベントです:フォームがアクティブになったときに、私のpaintboxイメージが表示されない

procedure TForm1.TrackBar1Change(Sender: TObject); 
var 
    angle : integer; 
    x,y : integer; 
    Peaked : boolean; 
begin 
    Angle := 120 - Round(sTrackBar1.Position/sTrackBar1.Max * 100)+20; 
    Peaked := Angle < PeakVol; 
    if Peaked then 
    Buffer.Picture := VUImagePeaked.Picture 
    else 
    buffer.picture := VUImage.Picture; 
    buffer.Picture.Bitmap.Canvas.Pen.Color := clSilver; 
    buffer.Picture.Bitmap.Canvas.Pen.Width:=2; 
    buffer.Canvas.MoveTo(pivot.x,Pivot.y); 
    x := 150 + Round(Cos(DegToRad(Angle)) * NeedleLen); 
    y := PaintBox1.Height - Round(Sin(DegToRad(Angle)) *NeedleLen); 
    buffer.Canvas.LineTo(x,y); 
    PaintBox1.Canvas.Draw(0,0,buffer.Picture.Bitmap) 
end; 

が動作しているようですが、私は得ることができないと、プログラムの起動時メートルのビットマップを表示することです。私は上記のコードをForm.CreateとForm.Activateの両方のイベントハンドラにコピーすることに頼っていますが、喜びはありません。私はボタンを作成し、トラックバーのonChangeイベントハンドラをトリガするために次のコードを追加しました。これが動作し、メーターが表示されます。

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    TrackBar1.Position := 1; 
end; 

これをForm.Activateハンドラにコピーしても、それはしません。誰でも私が間違っていることを教えてもらえますか?私はデルファイベルリンスターター版を使用しています。ありがとう

+0

'PaintBox1.Canvas.Draw(0,0、buffer.Picture.Bitmap)' - これは 'TPaintBox.OnPaint'イベントに移動する必要があります。 –

答えて

4

TPaintBoxは、OnPaintイベントを使用して描画する必要があります。このイベントは、Windowsがコントロールを再描画する必要があるたびに発生します。次回制御が再描画されたときに描画されるだけなので、いつでもコントロールのCanvasに描画することはできません。

具体的なケースでは、コードブロック全体をOnPaintイベントハンドラに移動する必要はありません。代わりに、あなたが必要なのは、次のとおりです。

procedure TForm1.PaintBox1Paint(Sender: TObject); 
begin 
    PaintBox1.Canvas.Draw(0,0,buffer.Picture.Bitmap) 
end; 
+0

すぐに私に戻ってくれている皆さん、ありがとう。 onPaintイベントを使用しました。 – BrianHig

関連する問題