Panel canvas fehler beim zeichnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Arthur Dent
Beiträge: 21
Registriert: Mi 15. Feb 2012, 22:17

Panel canvas fehler beim zeichnen

Beitrag von Arthur Dent »

Hallo Leute!

Leider ist mir keine treffendere Überschrift eingefallen, welche mein Problem beschreibt. Ich habe eigentlich ein recht simples Szenario:
1.) Es gibt ein Panel.
2.) Es gibt eine Funktion welche das Panel als Parameter übergeben bekommt und darauf zeichnet.
3.) Es gibt einen Button der die Funktio aufruft.

Soweit so gut.
Mein Problem ist nun, dass die zeichenfunktion erst beim zweiten Aufruf korrekt ausgeführt wird. Also entweder wenn ich zwei mal den Button Klicke, oder wen ich sie zweimal im Klick-Ereignis aufrufe. Wie lässt sich das beheben/umgehen ?
Ich benutze Lazarus 1.6.4 auf Windows 8.0.

Vielen Dank im Voraus!

Anbei noch die beiden Prozeduren:

[pascal]
 
procedure erase(view: TCanvas);
var
brushColorState:TColor;
begin
brushColorState:=view.Brush.Color;
view.brush.Color:= clWhite;
view.FillRect(0,0,view.Width,view.Height);
view.Brush.color:=brushColorState;
end;
 
[/pascal]
[pascal]
 
procedure TForm1.btnInitClick(Sender: TObject);
var
view:TCanvas;
begin
view:= self.drawPanel.Canvas;
erase(view);
end;
 
[/pascal]

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Panel canvas fehler beim zeichnen

Beitrag von siro »

Hallo Arthur,
deine Vorgehensweise ist so nicht korrekt,
Zeichnen darfst Du generell nur in der OnPaint Methode
Damit sie aufgerufen wird, muss Du Panel1.invalidate; aufrufen

Code: Alles auswählen

 
var Zaehler:Integer;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.invalidate;   // Dies löst ein Neuzeichen, also die Funkltion Panel1.OnPaint aus
  // in OnPaint wird dann automatisch gezeichnet.
end;
 
procedure erase(view: TCanvas);
var brushColorState:TColor;
begin
  brushColorState:=view.Brush.Color;
  view.brush.Color:= clWhite;
  view.FillRect(0,0,view.Width,view.Height);
  view.Brush.color:=brushColorState;
 
  // Nur zum gucken wird hier noch ein Zähler um eins hochgezählt und ausgegeben
  // Du siehts also nach jedem Tastendruck zählt er eins hoch
  // obwohl bei ButtonClick nur Panel1.invalidate steht
  inc(Zaehler);
  view.TextOut(0,0,IntToStr(zaehler));
end;
 
procedure TForm1.Panel1Paint(Sender: TObject);
begin
  // Hier kannst Du nun zeichnen nach Herzenslust
  // oder auch eine Funktion wie bei Dir aufrufen mit dem Canvas
  erase(Panel1.Canvas);
  // Du kannst natürlich auch hier alles Zeichnen,
end;         
 


invalidate ist also immer der Auslöser zum Zeichnen
In OnPaint wird immer gezeichnet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Antworten