TPaintbox - seltsames Verhalten (Laz 3.2)

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von PeterS »

Hallo,

manchmal wenn man was von Grund auf ausprobieren möchte,
stößt man auf merkwürdige "Dinge".

Ich hatte ganz simpel eine TPaintbox auf eine Form gepackt,
und eine weitere, die nicht automatisch erzeugt wird.
Jetzt verhält sich das ganze aber arg merkwürdig:

Nur wenn ich mit der Maus über den Button gehe, erscheinen die farbigen Quadrate.
Vergrößere oder verkleinere ich mit der Maus die Form, verschwinden sie wieder.
Wenn ich den Code zu TImage aktiviere, verhält sich das ganze wieder anders.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  ...
  //Image1.Canvas.Brush.Style:= bsSolid;
  //Image1.Canvas.Brush.Color:= clBlue;
  //Image1.Canvas.FillRect( 0, 0, Image1.Canvas.Width, Image1.Canvas.Height);
end;
Was ist das bloß ? Oder mache ich was grundlegendes falsch ?

Screenshot (638).png
Screenshot (638).png (6.97 KiB) 3143 mal betrachtet
Dateianhänge
TPaintBox-Test.zip
(141.39 KiB) 61-mal heruntergeladen

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

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von fliegermichl »

Das zeichnen der Paintbox sollte in dem Event OnPaint der Paintbox erfolgen.
Dafür kannst du im Event OnPaint einfach FormPaint auswählen und im FormCreate CustomBox.OnPaint := @FormPaint hinzufügen.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von PeterS »

fliegermichl hat geschrieben: Sa 22. Jun 2024, 07:32 Das zeichnen der Paintbox sollte in dem Event OnPaint der Paintbox erfolgen.
Danke !

Screenshot (639).png
Screenshot (639).png (4.84 KiB) 3098 mal betrachtet

Ich habe jetzt (weil's intern passieren soll) das zeichnen in die CustomBox Unit gepackt. Siehe Anhang.
Die Anwendung muss garnicht in meine CustomBox zeichnen können, die CustomBox soll sich nur selber zeichen.


fliegermichl hat geschrieben: Sa 22. Jun 2024, 07:32 Dafür kannst du im Event OnPaint einfach FormPaint auswählen
und im FormCreate CustomBox.OnPaint := @FormPaint hinzufügen.
Meinst Du das so ?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  ..
  CustomBox.OnPaint:= @FormPaint
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  //
end;
Dateianhänge
TPaintBox-Test-2.zip
(141.49 KiB) 59-mal heruntergeladen

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

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von wp_xyz »

Im Anhang eine funktionierende Version deines Projekts, mit vielen Kommentaren. Natürlich weiß ich nicht im Detail, warum da ein unbenutzes Bitmap in deiner abgeleiteten Paintbox-Klasse ist. Daher kann mein Code für dich nützlich sein - oder auch nicht...
Dateianhänge
TPaintBox-Test-wp.zip
(3.14 KiB) 67-mal heruntergeladen

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

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von wp_xyz »

PeterS hat geschrieben: Sa 22. Jun 2024, 11:08

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  ..
  CustomBox.OnPaint:= @FormPaint
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  //
end;
Kapier' ich nicht... Warum ruft CustomBox.OnPaint das OnPaint des Formulars auf, in dem überhaupt nichts passiert? Bitte versuche, jeden deiner Schritte zu verstehen.

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von PeterS »

wp_xyz hat geschrieben: Sa 22. Jun 2024, 12:00 Kapier' ich nicht... Warum ruft CustomBox.OnPaint das OnPaint des Formulars auf, in dem überhaupt nichts passiert? Bitte versuche, jeden deiner Schritte zu verstehen.
Dieser Kommentar war für @fliegermichl
Weil ich seine Anmerkung nicht verstanden hatte.

Natürlich passiert da (noch?) nix im OnPaint des Formulars.
Ist ja erstmal nur roher leerer Code ..

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von PeterS »

wp_xyz hat geschrieben: Sa 22. Jun 2024, 11:58 Im Anhang eine funktionierende Version deines Projekts, mit vielen Kommentaren. Natürlich weiß ich nicht im Detail, warum da ein unbenutzes Bitmap in deiner abgeleiteten Paintbox-Klasse ist. Daher kann mein Code für dich nützlich sein - oder auch nicht...
=>

Code: Alles auswählen

// Warum soll das vom Formular gezeichnet werden, wenn die Paintboxen das doch
// selbst können? 
Ich bin gerade dabei, einen uralten Delphi-Quellcode einer Komponente zu übersetzen.
Und die zeichnete halt (noch) nicht, unter Lazarus. Daher hatte ich dieses Test-Projekt erstellt.
Damit nicht Tonnen von unnötigem Code einem die Sicht versperren.

Das "unbenutze Bitmap" wird - wenn dann hineingezeichnet wurde/wird - per BitBlit()
resp. per Canvas.Draw() auf den Canvas von TPaintBox kopiert.

Und das klappt jetzt auch, hier in meiner Uralt-Komponente - puh !

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: TPaintbox - seltsames Verhalten (Laz 3.2)

Beitrag von PeterS »

Code: Alles auswählen

CustomBox.Free;   // Unnötig, da die CustomBox mit Owner = self erzeugt wurde.
Jep - da bin ich wieder drauf reingefallen.
Alte Gewohnheit, selbsterzeugtes TObject am Ende auch wieder "zu Fuß" zerstören.

Jetzt fällt es mir auch wieder ein, daß das - mit Owner = self erzeugt - sich brav selbst zerstört :roll:
wenn das Programm sich beendet.

Antworten