nach painbox resize kein zeichnen in neuen bereich möglich

Rund um die LCL und andere Komponenten
Antworten
Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

nach painbox resize kein zeichnen in neuen bereich möglich

Beitrag von Leberecht »

hallo,

ich habe heute ein merkwürdiges verhalten meiner paintbox festgestellt. nach einem resize derselben, funktionieren zeichenoperationen nur im alten bereich, nicht aber im neu entstandenen. aber nach einem onpaint-event der paintbox zeichnet er die elemente im neuen bereich. ich verstehe das nicht.

im prinzip läuft es so ab:
1. ich zeichne in die paintbox objekte, deren koordinaten aus einem array kommen. wenn ich mit der maus in die paintbox klicke, wird die endsprechene koordiante berechnet und das objekt im array eingetragen (koordinate+grafik). anschliessend rufe ich eine eigene funktion "zeichne" auf, in der das array durchgegangen wird und alle darin vorhandenen objekte über canvas.draw (kommen aus einer imagelist) gezeichnet werden. das geht auch wunderbar.
2. wenn ich jetzt das formular mit der maus größer ziehe, mach in im "FormChangeBounds" event eine anpassung aller formularobjekte an die neue größte (u.a. auch die paintbox. diese wird dann z.b. doppelt so breit und hoch.
3. ab diesem punkt funktioniert meine zeichenroutine nicht mehr korrekt (die koordinaten werden korrekt berechnet und die objekte auch korrekt im array abgelegt). objekte, die in dem neu entstandenen bereich gezeichnet werden sollen, zeichnet er nicht, im alten bereich ist alles wie immer. wenn ich aber das formular komplett mit einem anderen fenster verdecke und es dann wieder sichtbar mache, zeichnet er auch die neuen objekte korrekt. er ruft dann onpaint der paintbox auf, in der ich die zeichenroutine ebenfalls verlinkt habe.
aber warum zeichnet er ohne onpaint die grafiken in den neuen bereichen nicht, es wird doch im endeffekt dieselbe routine aufgerufen.

gibts da irgenteinen befehl, mit dem ich der paintbox sagen kann, das sie ihre kompletten einstellunge neu einlesen soll?
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

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

Re: nach painbox resize kein zeichnen in neuen bereich mögli

Beitrag von Michl »

Gezeichnet werden soll generell nur im OnPaint-Event, da dort nur auf das für die einmalige Darstellung zur Verfügung gestellte Canvas gezeichnet wird. Alle im OnPaint-Event durchgeführten Zeichenoperationen sind flüchtig und bleiben nicht dauerhaft im Speicher bestehen. Siehe auch: http://wiki.freepascal.org/Developing_w ... erelements

Ein Neuzeichnen kannst du mittels:

Code: Alles auswählen

PaintBox1.Invalidate;
//oder
PaintBox1.Refresh;
//oder
PaintBox1.Repaint;
anregen.

Code: Alles auswählen

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

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: nach painbox resize kein zeichnen in neuen bereich mögli

Beitrag von theo »

OnPaint ist der Moment zum Zeichen und nichts anderes.
Deshalb heißt es auch so. :wink:

EDIT sagt: Michl war schneller... :oops:

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: nach painbox resize kein zeichnen in neuen bereich mögli

Beitrag von Leberecht »

danke euch, wieder was gelernt. tja, nur weil man etwas jahrelang macht das bisher immer gut ging, heisst es noch lange nicht das dieses vorgehen richtig ist.
:roll:

p.s.
invalidate scheint da für mich der beste weg zu sein, dabei flackert die paintbox übverhaupt nicht. bei repaint oder refresh flackert es sehr.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Antworten