Problem mit canvas.pen.color

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Problem mit canvas.pen.color

Beitrag von alpinus »

Hallo zusammen
ich habe das Problem, dass die Farbe des Stiftes nicht angewendet wird. Anzumerken ist, dass ich dabei in ein vorher geladenes Bild hineinzeichen möchte, und zwar eine Kreis an der Stelle, wo ich mit der Maus clicke. Es funktioniert alles, nur die Farbe des Stiftes wird nicht geändert, sondern bleibt immer weiß.

Was mache ich falsch? Unten mal mein Code mit meinen Kommentaren dazu...

Gruß und Danke für Hinweise,
Alpinus

Code: Alles auswählen

 
procedure TfmMain.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Zeichnen:=True;                      //jetzt wird gezeichnet
     x0:=X; y0:=X;                        //Mittelpunkt des Kreises
     Image3.Canvas.MoveTo(X,Y);
end;
 
procedure TfmMain.Image3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Zeichnen:=False;
     with Image3.Canvas do begin
          Pen.Color:=clRed;                  // funkioniert nicht
          Pen.Style:=psSolid;                // funkioniert
          Pen.Width:=5;                      // funkioniert
          Brush.Style:=bsClear;              // funkioniert
          Ellipse(x0-25,y0-25,x0+25, y0+25); // wird in weiß gezeichnet, müsste aber rot sein
          Pen.Color:=clBlack;                // funkioniert nicht
          Brush.Style:=bsSolid;              // funkioniert
          Brush.Color:=clBlack;              // funkioniert nicht
          Ellipse(x0-1,y0-1,x0+1, y0+1);     // wird in weiß gezeichnet, müsste aber schwarz sein
     end;
     SpeedButton39.Visible:=true;
     SpeedButton38.Visible:=true;
end;
 

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit canvas.pen.color

Beitrag von wp_xyz »

Welches Betriebssystem/Widgetset ist das? Unter Windows funktioniert es (bis auf den Schreibfehler im Mousedown, wo die aktuelle X-Koordinate an Y0 übergeben wird).

alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Re: Problem mit canvas.pen.color

Beitrag von alpinus »

Den Schreibfehler hatte ich schon gemerkt - ist aber nicht die Ursache- Ich arbeite mit Windows 10 in der Version 1909. Soll ggf. auch auf Linux portiert werden.

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit canvas.pen.color

Beitrag von wp_xyz »

Win 10/1909 habe ich auch. Laz trunk/FPC 3.0.4, aber auch Laz 2.0.6/FPC 3.0.4, beide 32 bit, aber auch 64bit. Deine Laz/FPC-Version?

Bitte poste ein kleines kompilierbares Projekt, an dem man den Fehler nachvollziehen kann. Es muss da irgendwo noch mehr passieren als man an den zwei Code-Schnipsel im vorigen Post erkennen kann. Die Beschreibung erinnert mich an Probleme mit dem Alpha-Kanal früher.

alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Re: Problem mit canvas.pen.color

Beitrag von alpinus »

Laz 2.0.6/FPC 3.0.4, 64bit.
Das Ganze ist in einem größeren Datenbankprojekt, wo ich eine Grafik (aus einem DBImage über das Clipboard in eben das TImage lade, dann den Kreis male und anschl. das Ganze zurück in die Datenbank schreibe. Ich schau in den nächsten Tagen, dass ich ein Miniprogramm schreibe. Das mit dem Alpha-Kanal habe ich auch schon befürchtet...
Im Übrigen, wenn ich Image3 nicht vorher befülle, dann ändert das programm die Farben wie gewünscht, allerdings auf schwarzem Hintergrund...

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Problem mit canvas.pen.color

Beitrag von Warf »

Was für nen Pen-Mode benutzt du denn? es gibt z.b. pmBlack und pmWhite, die ignorieren die Farbe

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit canvas.pen.color

Beitrag von wp_xyz »

alpinus hat geschrieben:Im Übrigen, wenn ich Image3 nicht vorher befülle, dann ändert das programm die Farben wie gewünscht, allerdings auf schwarzem Hintergrund...

Genauso ist es bei mir auch. Aber auch, wenn ich vorher den Lazarus-Cheetah ins Image lade, die die transparente Lazarus-Tatze.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Problem mit canvas.pen.color

Beitrag von Winni »

Hi!

Der pen wird nicht rot, weil als erstes der style auf psSolid gesetzt werden muss. Danach auf rot setzen.

Transparenter Hintergrund:

Setze im Object Inspector für Image3 die property transparent auf true.

Bevor Du Cheetah in Image3 lädst , setze

Code: Alles auswählen

Image3.Picture.Bitmap.transparent := true;
 Image3.Picture.Bitmap.transparentColor := clFuchsia;
Image3.Picture.PNG.LoadfromFile ('Cheetah .png');
 
 
Winni

alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Re: Problem mit canvas.pen.color

Beitrag von alpinus »

Leider bringen weder die Änderung der Reihenfolge der Befehle (Vorschlag von Winni, danke dennoch) noch ein anderer PenMode (Vorschlag von Warf, danke dennoch) irgendeine Änderung.

Thanks all.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Problem mit canvas.pen.color

Beitrag von fliegermichl »

TImage hält eine Kopie der Grafik. Deine Schreibereien währen doch spätestens nach einem erneuten Paint der Komponente weg.
Lade deine Grafik in eine TBitmap. TBitmap hat auch einen Canvas. Dann kannst du das ganze mit Image3.Picture.Assign(Bitmap) sichtbar machen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Problem mit canvas.pen.color

Beitrag von Winni »

fliegermichl hat geschrieben:TImage hält eine Kopie der Grafik. Deine Schreibereien währen doch spätestens nach einem erneuten Paint der Komponente weg.
Lade deine Grafik in eine TBitmap. TBitmap hat auch einen Canvas. Dann kannst du das ganze mit Image3.Picture.Assign(Bitmap) sichtbar machen.



Hi!

Das ist nicht richtig. TImage zeichnet sich selbst und alle Änderungen sind persistent. Man benötigt also keine OnPaint procedure.

Zweitens darf man - Ausnahme! - hier auch außerhalb des onPaint events malen / zeichnen. TImage regelt das.

Das TImage muss erst initialisiert werden, bevor es was zeigt. Am einfachsten geht das mit:

Code: Alles auswählen

Image.Canvas.Brush.Color := clLime;
Image.Canvas.FillRect(0,0,Image.width,Image.Height);


Und um weitere Probleme zu beseitigen, ist es notwendig etwas mehr code zu sehen.

Winni

alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Re: Problem mit canvas.pen.color

Beitrag von alpinus »

So, jetzt endlich ein kleines Programm, mit allen notwendigen Dateien zum Fehler nachvollziehen...
Thanks
Dateianhänge
Testprogramm.zip
(5.1 MiB) 190-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Problem mit canvas.pen.color

Beitrag von Winni »

Hi!

Du hast das falsche Testprogramm geschickt.
Irgendwas mit fpc_spreadsheet aber weit und breit kein image!

Tipp: Das kommt dabei raus, wenn man alle Testprogramme "Testprogramm" nennt!

Winni

alpinus
Beiträge: 13
Registriert: Di 6. Jan 2009, 08:05

Re: Problem mit canvas.pen.color

Beitrag von alpinus »

Klugsch... kann ich selber - @winni: Tipp Wenn man mehrere Testprogramme hat - und das falsche entpackt...

Da ich nur ein Testprogramm habe, ist es das Richtige!!! und da ist auch kein fpc_spreadsheet drin...

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit canvas.pen.color

Beitrag von wp_xyz »

OK, musste zuerst den Pfad zur DBF-Datei anpassen und im OnCreate des Formulars die DBF öffnen. Damit sehe ich links das Bild. Nun kann ich in den Zeichenmodus gehen. Wenn ich im rechten Bild klicke, kommt ganz einwandfrei ein roter Kreis mit rotem Mittelpunkt. Wenn ich dann auf den Save-Butten (Häkchen) klicke, wird aber anscheinend nichts gespeichert, den das Ausgangsbild links wird nicht verändert, auch nicht nach einem Neustart des Programms. Könntest du das Testprogramm bitte nochmals prüfen, so dass es auch auf einem fremden Rechner entsprechend funktioniert und den Fehler zeigt?

Antworten