Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi pmXOR-Grafikproblem (https://www.delphipraxis.net/142893-pmxor-grafikproblem.html)

Mysterio08 5. Nov 2009 15:40


pmXOR-Grafikproblem
 
Guten Tag Programmierer,
beim Programmieren von Grafiken ist gerade ein Problem mit dem Pen.Mode := pmXOR aufgetaucht. Zuerst erstelle ich eine Ellipse auf dem Image:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with Image1.Canvas do
  begin
    Brush.Color := clRed;
    Ellipse(200, 50, 400, 200)
  end
end;
Nun möchte ich langsam einen Kreis über das Image wandern lassen, von links nach rechts. Zuerst lege ich Anfangskoordinaten fest:
Delphi-Quellcode:
x1: SmallInt = 10;
y1: SmallInt = 100;
x2: SmallInt = 60;
y2: SmallInt = 150;
Mit einem Timer bewege ich den Kreis nun über die Fläche, was auch soweit funktioniert. Der Kreis "zerstört" die Ellipse auch nicht, sondern der Hintergrund des Kreises wird, wie gewünscht, schwarz. Das einzige Problem ist die Anfangsdarstellung des Kreises, es sieht aus, als ob ein Kreis aus einen anderen Kreis schlüpft, aber hier der Code:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Canvas.Pen.Mode := pmXOR;
  Image1.Canvas.Ellipse(x1, y1, x2, y2);
  Inc(x1, 5);
  Inc(x2, 5);
  Image1.Canvas.Ellipse(x1, y1, x2, y2)
end;
Hier auch nochmal ein Bild meines Problem: Bild
Wie kann ich das umgehen?
mfg.

alleinherrscher 5. Nov 2009 15:46

Re: pmXOR-Grafikproblem
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Canvas.Pen.Mode := pmXOR;
  Image1.Canvas.Ellipse(x1, y1, x2, y2);
  Inc(x1, 5);
  Inc(x2, 5);
  Image1.Canvas.Ellipse(x1, y1, x2, y2)
end;
Also der erste Ellipse Befehl wird dir den alten Kreis löschen, der zweite Ellipse Befehl zeichnet dir versetzt einen neuen. Soweit so gut, aber im ersten Timerschritt gibt es wohl keinen Kreis zum löschen, d.h. da würde der zweite Ellipse Befehl ausreichen.

Ich würde da, wo du das Programm initialisierst und auch den roten Kreis zeichnest (auf jedenfall bevor der Timer startet), einfach einmal mit pmXOR den ersten Ellipse-Befehl ausführen, sodass schonmal 1 Kreis da ist, der im ersten Timerschritt gelöscht werden kann :)

//edit: Ich würde übrigens den roten Kreis nicht beim Formcreate Ereignis zeichnen lassen. Theoretisch kann es sein, dass eine Komponente wie das Image noch nicht erstellt worden sind und dann gibts ne unschöne AV. Nimm besser das Ereignis FormShow.

Grüße

Mysterio08 5. Nov 2009 15:56

Re: pmXOR-Grafikproblem
 
Vielen Dank, ich habe es hinbekommen:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  with Image1.Canvas do
  begin
    Brush.Color := clRed;
    Ellipse(200, 50, 400, 200);
    Image1.Canvas.Pen.Mode := pmXOR;
    Ellipse(x1, y1, x2, y2);
  end
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Canvas.Ellipse(x1, y1, x2, y2);
  Inc(x1, 5);
  Inc(x2, 5);
  Image1.Canvas.Ellipse(x1, y1, x2, y2)
end;
Wie man erkennt, habe ich auch das Ereignis, wie vorgeschlagen, gewechselt.
mfg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz