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]
Panel canvas fehler beim zeichnen
-
- Beiträge: 21
- Registriert: Mi 15. Feb 2012, 22:17
-
- Beiträge: 760
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
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
invalidate ist also immer der Auslöser zum Zeichnen
In OnPaint wird immer gezeichnet
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;
In OnPaint wird immer gezeichnet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...