Panel canvas fehler beim zeichnen

Für Fragen von Einsteigern und Programmieranfängern...

Panel canvas fehler beim zeichnen

Beitragvon Arthur Dent » 20. Nov 2017, 12:17 Panel canvas fehler beim zeichnen

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:

Code: Alles auswählen
 
  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;
 

Code: Alles auswählen
 
  procedure TForm1.btnInitClick(Sender: TObject);
  var
    view:TCanvas;
  begin
    view:= self.drawPanel.Canvas;
    erase(view);
  end;
 
Arthur Dent
 
Beiträge: 16
Registriert: 15. Feb 2012, 22:17

Beitragvon siro » 20. Nov 2017, 15:51 Re: Panel canvas fehler beim zeichnen

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...
siro
 
Beiträge: 315
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
porpoises-institution
accuracy-worried