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?
nach painbox resize kein zeichnen in neuen bereich möglich
-
- 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
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)
(Yoda zu Dooku)
Re: nach painbox resize kein zeichnen in neuen bereich mögli
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:anregen.
Ein Neuzeichnen kannst du mittels:
Code: Alles auswählen
PaintBox1.Invalidate;
//oder
PaintBox1.Refresh;
//oder
PaintBox1.Repaint;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: nach painbox resize kein zeichnen in neuen bereich mögli
OnPaint ist der Moment zum Zeichen und nichts anderes.
Deshalb heißt es auch so.
EDIT sagt: Michl war schneller...
Deshalb heißt es auch so.

EDIT sagt: Michl war schneller...

-
- 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
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.
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.

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)
(Yoda zu Dooku)