ich habe gerade Verständnisprobleme mit der PaintBox-Komponente. Hier habe ich mal einen ziemlich simplen Code, um meine Probleme zu verdeutlichen:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
procedure draw;
end;
var
Form1: TForm1;
positionX: Integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.draw;
var
x: Integer;
y: Integer;
size: Integer;
BrushColorOld: TColor;
BrushStyleOld: TBrushStyle;
PenColorOld: TColor;
PenStyleOld: TPenStyle;
begin
positionX := positionX + 1;
x := positionX;
y := Round(PaintBox1.Height/2);
size := 5;
// Save old settings
BrushColorOld := PaintBox1.Canvas.Brush.Color;
BrushStyleOld := PaintBox1.Canvas.Brush.Style;
PenColorOld := PaintBox1.Canvas.Pen.Color;
PenStyleOld := PaintBox1.Canvas.Pen.Style;
// Remove old ellipse at (x-1, y)
// current drawing colors/styles should draw ellipse with color = clDefault
// which is the current background color of PaintBox1 --> remove ellipse drawn in black
PaintBox1.Canvas.Ellipse(x-1-size, y-size, x-1+size, y+size);
// Draw new Ellipse at (x, y) filled with black and with black line
PaintBox1.Canvas.Brush.Color := clBlack;
PaintBox1.Canvas.Pen.Color := clBlack;
PaintBox1.Canvas.Ellipse(x-size, y-size, x+size, y+size);
// load old drawing colors
PaintBox1.Canvas.Brush.Color := BrushColorOld;
PaintBox1.Canvas.Pen.Color := PenCOlorOld;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
draw;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
positionX := Round(PaintBox1.Width/2);
// set Brush and Pen properties
PaintBox1.Canvas.Brush.Color := clDefault;
PaintBox1.Canvas.Brush.Style := bsSolid;
PaintBox1.Canvas.Pen.Color := clDefault;
PaintBox1.Canvas.Pen.Style := psSolid;
end;
end.
Mein Ziel für dieses Beispielprogramm ist es, einen Kreis zu zeichnen, der sich Pixel für Pixel nach rechts bewegt.
1. FormCreate-Prozedur: Hier habe ich erst einmal die Properties Color/Style von Brush und Pen gesetzt. Nach meinem Verständnis ist clDefault die Farbe, die die PaintBox schon am Anfang als Hintergrundfarbe hat. Zur Variable positionX komme ich gleich noch.
2. Timer: Der Timer ruft ganz einfach die draw-Prozedur auf, die ich im folgenden erkläre.
3. draw-Prozedur: Auch wenn beim ersten Aufruf noch kein Kreis gezeichnet wurde, gehe ich vom allgemeinen Fall aus, dass schon ein Kreis gezeichnet wurde (wenn noch keiner gezeichnet wurde, ist es auch egal). Zuerst inkrementiere ich die x-Position des Mittelpunktes (positionX) des Kreises, den ich zeichnen möchte. Den Startwert habe ich schon auf die Mitte der Paintbox festgelegt (im OnFormCreate-Event). Den y-Wert stelle ich auch auf die Mitte der Paintbox ein. Dieser Wert bleibt immer gleich. Anschließend lege ich noch die Größe des Kreises fest (size := 5). Bevor ich irgendetwas zeichne speichere ich mir zunächst die Properties von Pen und Brush (auch wenn es nicht unebdingt notwendig wäre). Nun zeichne ich einen Kreis an die Position in der Paintbox, bevor der x-Wert inkrementiert wurde (ich ziehe vom x-wert einfach wieder 1 ab). Diesen Kreis zeichne ich mit der Farbe clDefault (für Brush und Pen). Daher erwarte ich, dass der Kreis wieder die Hintergrundfarbe der PaintBox hat, also verschwindet.
Nun möchte ich an der neuen Position (ein Pixel in x-Richtung weiter) einen neuen Kreis in schwarz zeichnen. Also setze ich die Farben von Brush und Pen auf clBlack und zeichne wieder einen Kreis. Zum Schluss setze ich die Farben von Pen und Brush wieder auf die ursprünglichen Werte zurück.
Ich erwarte also, dass der Kreis in jedem Schritt um einen Pixel weiter nach rechts "wandert". Stattdessen wird aber der vorige Kreis nie gelöscht und bleibt immer schwarz. Ich denke daher, dass es mit der Farbe "clDefault" zu tun hat. Wenn ich nämlich z. B. clWhite wähle, dann werden mir an den "gelöschten" Positionen weiße Kreise gezeichnet, so wie erwartet.
Meine Frage nun: Warum funktioniert es mit clDefault nicht? Wie ist die clDefault-Farbe (die Farbe des Formulars bzw. der PaintBox im Ursprungszustand) ausgedrückt im RGB-Modell? Dann könnte ich "clDefault" durch diesen Wert ersetzen, was zum gewünschten Ergebnis führen sollte. Im Internet habe ich leider nirgendwo einen Wert gefunden.