Panels sehr langsam (beim Neuzeichnen)

Rund um die LCL und andere Komponenten
FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Also erstmal zur Vorgeschichte.

Ich musste fürs Studium ein Programm in Java schreiben und habe für meine Lösung mit vielen dynamisch erstellten Panels gearbeitet. Nur leider ist Java ja nicht so toll wenn es um Grfik ging. Mein Übungsleiter meinte dann das ich meine Lösung ganz gut mit Delphi umsetzen könnte, da Delphi das Problem nicht hat. Also hab ich mich an Lazarus probiert.

Ich habe ein großes Panel welches sich selbst mit der Form vergrößert/verkleinert. Auf diesem Panel sin, dynamisch erzeugt, weitere Panels. Die größe und Position dieser Panels ändere ich mit jedem "OnResize" Event. Klappt alles auch fast, aber das größte Problem was ich habe, ist das wenn man das Fenster vergrößert/verkleinert, man zugucken kann wie die Panels gezeichnet werden.

Ist das normal oder liegt das daran, das ich die Panels selbst neu "zeichne"?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von Teekeks »

Wie zeichnest du denn selbst?
Du musst ja auch nur .Height und .Width ändern und nicht wirklich ein .repaint drüber jagen.
Oder wie machst du das?

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Ich ändere nur die Position und Größe, mehr mache ich nicht. Deswegen wundert es mich ja, das es so langsam läuft!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von pluto »

Warum nutzt du nicht die, dafür vorgesende Eigenschaft eines jeden Panels ? Die Aligen-Eigenschaft. Damit kann man Automatische Größenänderungen sofort übernehmen.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von Socke »

Align wäre nur der richtige Weg, wenn die Panels eine feste Ausrichtung (Links, Rechts, Oben, Unten) haben. Etwas allgemeiner gehts mit AnchorSide[] und der entsprechenden Seite.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von pluto »

Was man mit "AnchorSide" machen, kann habe ich bis heute noch nicht "Verstanden". Kannst du Beispiele dazu geben ?

Jedenfalls wollte ich damit andeuten, dass es nicht Notwendig ist, dass Rad-Neu zu erfinden, wenn ich mit meiner "Vermutung" recht habe und es um eine Automatische Anpassung bei Größen Veränderung des Froms geht.
MFG
Michael Springwald

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Das Problem mit dem Anchor ist aber, wie kann ich ein Panel an einem anderem ausrichten?

Im Endeffekt stelle ich ne Art Tabelle dar. Zumal der Abstand dann ja auch größer wird, wenn ich das ganze über Autosize mache, aber das will ich ja auch nicht.

Ich teste heute nochmal meinen Code mit Debugausgaben, aber eigentlich werden doch Komponenten auf einem Panel mit relativen Koordinaten (der Ursprung ist die linke obere Ecke des Panels) platziert oder? Das scheint nämlich auch nicht zu funktionieren.

Edit::

Also ich würde sagen, da haut definitv was mit den Panels nicht hin!

Ich lasse oben, unten, links und rechts immer einen Rand von mind. 2 Pixeln. Wenn ich die Koordinaten auf der Konsole ausgeben, stimmen diese auch, aber platziert werden die Panels in der 1. Reihe ganz oben (also Rand 0 Pixel, obwohl andere Koordinaten angegeben wurden) und ganz links (also auch wieder Rand 0 Pixel). Ab der 2. Reihe scheinen dann wieder die "Top-Koordinaten" zu stimmen, denn zwischen der 1. und 2. Reihe ist ein zu großer Platz, aber sie werden links immer noch ohne Rand (= 0 Pixel) gezeichnet. In der letzten Reihe wird dann mit einmal das 2. Panel mit der richtigen "Left-Koordinate" gezeichnet (was wiederrum zu einer größeren Lücke zwischen dem 1. und 2. Panel der letzten Reihe führt).

Das beste ist aber, das wenn ich die Panels erstelle sie zwar oben und links ohne Rand gezeichnet werden, aber die Lücken zwischen den Panels sind genau die 2 Pixel groß. Sobald aber die "OnResize" Funktion das 2. Mal aufgerufen wird, kommt es zu dem oben beschriebenen Problemen.

Hat wer eine Idee woran das liegen könnte?

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

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von theo »

Lazarus Version? Betriebssystem? Widget Set?
Hänge mal den Quellcode einer kompilierbare Anwendung an, welche das Problem zeigt.

Was willst du eigentlich genau machen? Vielleicht gibt es zu dem Zweck auch eine elegantere Lösung.

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Es geht ums Game-Of-Life und es gibt 100%ig ne elegantere Lösung, aber das war halt meine Idee und daran würde ich gerne festhalten ;) Zumal es ja möglich sein muss. Denn wenn sogar Java ne bessere Performance hinlegt, will das schon was heißen!

Ich hoffe das die Dateien in dem ZIP-Archive reichen um das Projekt zu übersetzen.

Ich nutze Lazarus 0.9.28.2 unter Win7.
Dateianhänge
test0.zip
(459.33 KiB) 70-mal heruntergeladen

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

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von theo »

Ich würde das nicht mit Panels machen. Viel zu schwergewichtig. Eher noch TPaintBox oder sowas.
Am besten aber, du zeichnest einfach dein Grid in OnPaint mit Canvas.Lines oder Rectangles.
Das ist sehr schnell.

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Auch wenn es eine schnellere/elegantere Lösung gibt, funktioniert irgendetwas mit den Panels nicht richtig! Zumal ich in Java deswegen Panels genommen habe, damit ich nicht gucken brauche, wo hat der User jetzt hingeklickt, war es ein Stein oder nur ne Gitterlinie und welcher Stein war es. Mit Panels geht das viel einfacher, da füge ich nen MouseListener hinzu und kann dann einfach an ne Funktion die Y- und die X-Koordinate übergeben und brauch mir über den Rest keine Gedanken mehr zu machen.

Vielleicht werfe ich mal nen Blick auf den Source vom TPanel und was dahinter steckt, aber das dürfte wohl noch dauern bis ich die Zeit dazu habe.

Hat ansonsten niemand eine Idee was da falsch laufen könnten (das die Panels an der falschen Position gezeichnet werden)?

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

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von theo »

Mit einer Paintbox hast du das auch (OnClick etc..) nur ist eine TPaintbox kein Wincontrol wie TPanel (also ein Ding vom Betriebssystem/X11), sondern nur ein Zeichenbereich auf dem Eltern-Canvas und dadurch "leichter".
FlashBurn hat geschrieben: Hat ansonsten niemand eine Idee was da falsch laufen könnten (das die Panels an der falschen Position gezeichnet werden)?
Sorry, ich meinte oben eigentlich, ob du das Problem in einer kleinen Anwendung isolieren kannst, also ohne drumherum, nur das Panel das deiner Meinung nach nicht richtig funktioniert. Bzw. eine Anwendung, die nichts weiter macht als den vermeintlichen? Bug zu zeigen. Ich weiss bei deiner Anwendung nicht, wo dieses Problem zu sehen wäre.
Das isolieren von Problemen ist sowieso eine gute Debug-Taktik.

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Sorry, ich meinte oben eigentlich, ob du das Problem in einer kleinen Anwendung isolieren kannst, also ohne drumherum, nur das Panel das deiner Meinung nach nicht richtig funktioniert. Bzw. eine Anwendung, die nichts weiter macht als den vermeintlichen? Bug zu zeigen. Ich weiss bei deiner Anwendung nicht, wo dieses Problem zu sehen wäre.
Ich finde meine Anwendung bisher ja nicht wirklich groß ;)

Das Problem liegt in der procedure "TForm1.FormResize(Sender: TObject)" und die besteht ja nur aus 2 verschachtelten for-Schleifen!

Ich gucke mir mal TPaintBox an! Aber wie gesagt, der ganze Versuch das Java-Programm nach Pascal zu übersetzen beruht darauf, dass das Zeichnen besser und schneller funktioniert. Denn eine Lösung ohne Panels kann ich auch unter Java performanter umsetzen. Ich mache das ganze ja nur für mich um mal wieder was in Pascal zu machen.

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

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von theo »

FlashBurn hat geschrieben:Ich finde meine Anwendung bisher ja nicht wirklich groß ;)

Das Problem liegt in der procedure "TForm1.FormResize(Sender: TObject)" und die besteht ja nur aus 2 verschachtelten for-Schleifen!
Reduziere das mal auf's Wesentliche, sonst muss ich es machen.
Du sagst ja quasi: "wenn ich Panel.Top in OnResize auf 2 setze dann ist es trotzdem bündig mit dem oberen Rand".
Dann mach mal nur das, und schaue ob sich das reproduzieren lässt. Das nennt sich debugging und gehört zum Handwerk ;-)

FlashBurn
Beiträge: 12
Registriert: Mi 16. Jun 2010, 16:39

Re: Panels sehr langsam (beim Neuzeichnen)

Beitrag von FlashBurn »

Reduziere das mal auf's Wesentliche, sonst muss ich es machen.
Du sagst ja quasi: "wenn ich Panel.Top in OnResize auf 2 setze dann ist es trotzdem bündig mit dem oberen Rand".
Dann mach mal nur das, und schaue ob sich das reproduzieren lässt. Das nennt sich debugging und gehört zum Handwerk ;-)
Naja, genau das mach ich doch, ich las mir die Werte, die in Top und Left eingetragen werden, anzeigen! Ich habe das über SetBounds und jetzt auch mal direkt über Top und Left probiert und das Ergebnis ist das gleiche. Ich weiß nicht in wie weit ich es noch reduzieren soll. Denn ab einer gewissen Stelle zeichnet er ja korrekt, obwohl sich an den Werten (relativ gesehen) nichts geändert hat!

Ich habe mir jetzt auch mal TPaintBox angesehen und das scheint noch weniger zu funktionieren. Denn dort kann ich die Größe und Position scheinbar gar nicht ändern. Scheinbar deswegen, weil ich die PaintBox nur sehen kann, wenn ich das Fenster schnell immer wieder verkleinere/vergrößere.

Ich habe auch versucht in TPaintBox/TPanel zu zeichnen, aber das klappt auch irgendwie nicht (obwohl ich hier zugeben muss, das ich auch absolut keine Ahnung habe, wie das wirklich geht). Ich habe versucht "PaintBox.Canvas.FillRect(0,0,PaintBox.Width,PaintBox.Height)" und das selbe mit dem Panel zu machen (in der Paint procedure) und ich sehe trotzdem keine Veränderung. Die Farbe habe ich über "PaintBox.Color:= clred" gesetzt.

Edit::

Ich habe jetzt einfach mal nur in mein großes Panel ein einziges hinzugefügt und es mittels SetBounds platziert. Die Größe des Panels ist in Ordnung, aber es ist immernoch in der linken oberen Ecke des großen Panels.

Ich habe allerdings eine Idee woran es liegen kann, den Anchors. Ich muss nur mal gucken wie ich die alle deaktivieren kann.

Antworten