[gelöst!] Probleme mit Paintbox

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

[gelöst!] Probleme mit Paintbox

Beitrag von Michl »

Hallo liebe Lazarus-Helfer,

folgendes Problem:

Ich habe 2 Formen, mit einem Button (Form2.Showmodal) rufe ich die 2. Form auf, in der sich eine Paintbox befindet.

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.showmodal;
end;
Bei dem Ereignis Formpaint zeichne ich ein weißes Quadrat (form2.PaintBox1.Canvas.FillRect(50,50,100,100); )

Code: Alles auswählen

TForm2 = class(TForm)
    PaintBox1: TPaintBox;
    procedure FormPaint(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form2: TForm2;
 
implementation
 
{ TForm2 }
 
procedure TForm2.FormPaint(Sender: TObject);
begin
  form2.PaintBox1.Canvas.FillRect(50,50,100,100);
end;
Schließe ich nun die 2. Form, wird beim nächsten Aufruf dieser, das weiße Quadrat mal gezeichnet und mal nicht. Woran kann das liegen?!

Danke für Eure Hilfe!

Michl
Zuletzt geändert von Michl am Fr 22. Jun 2012, 09:05, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Probleme mit Paintbox

Beitrag von corpsman »

Ist der Fehler damit auch ?

Code: Alles auswählen

TForm2 = class(TForm)
    PaintBox1: TPaintBox;
    procedure FormPaint(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form2: TForm2;
 
implementation
 
{ TForm2 }
 
procedure TForm2.FormPaint(Sender: TObject);
begin
form2.PaintBox1.Canvas.brush.color := clwhite;
form2.PaintBox1.Canvas.brush.style := bssolid;
form2.PaintBox1.Canvas.pen.color := clblack;
  form2.PaintBox1.Canvas.Rectangle(50,50,100,100);
end;
--
Just try it

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit Paintbox

Beitrag von Michl »

Habe den Code entsprechend ausprobiert.
Ergebnis unverändert.
Beim nächsten Öffnen der Form2 wird mal gezeichnet und mal nicht.

Ich bin auch auf andere Weise auf das Problem gestoßen:
Um mir eine Statistik grafisch darzustellen, hatte ich mir eine zusätzliche Form gebaut, auf der ich die in der HauptUnit errechneten Ergebnisse grafisch darstelle.
Dies funktionierte auch wunderbar, als ich zur Darstellung der Form >Form2.show< gewählt hatte (sämtliche Zeichenoperationen funktionieren damit einwandfrei, auch nach mehrmaligen Anzeigen und Schließen).
Jetzt wollte ich diese Anzeige aber in einer anderem Aufruf nutzen, um Parameter zu- und abzuwählen, daher der Zugriff auf >Form2.showmodal<.

Um den Fehler einzugrenzen, habe ich den Code vereinfacht, um den Fehler einzugrenzen. Bin aber leider im Forum bzw. Netz nicht auf einen hilfreichen Hinweis für mein Problem gestoßen :( :(

Es kommt mir so vor, als hätte ich einfach vergessen irgend ein Wert zurückzusetzen, der bei Showmodal erzeugt wird und bei Show nicht?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Probleme mit Paintbox

Beitrag von Hitman »

Du reagierst auch im falschen Event. Du lässt die PaintBox zeichen, wenn das Formular gezeichnet werden soll. Das ist in (wie du auch merkst) nicht unerheblich vielen Fällen nicht das selbe. Z.B. wird der Bereich, in dem das Quadrat ist, von der PaintBox abgedeckt, daher wird bei "invalidate" dieses Bereichs sicherlich kein FormPaint ausgelöst ... es hat sich ja nur die PaintBox "verändert".

Ergo: PaintBox.OnPaint nutzen, nicht Form.OnPaint! Dann geht's auch.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit Paintbox

Beitrag von Michl »

Hallo Hitman,

DAS WAR ES!!! So einfach ist das! Vielen, vielen Dank! :lol: :lol:

Hab mir gestern wegen so einem kleinen Denkfehler die halbe Nacht um die Ohren geschlagen :oops:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten