Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Aktualisierung Fenster erzwingen (https://www.delphipraxis.net/50608-aktualisierung-fenster-erzwingen.html)

Surrounder 28. Jul 2005 10:26


Aktualisierung Fenster erzwingen
 
Hallo Forum,

hab ein kleines Problem bei meiner Software. Folgendes zur Software, es gibt ein Hauptforumlar, alle anderen Formulare werden zur Laufzeit erzeugt und auch wieder zerstört. Ich hab im Hauptformular eine Outlookleiste mit entsprechenden Buttons die dann die Formulare erzeugt und beim umschalten auch wieder löscht. Außerdem hat jedes Formular eine Aktualisierungsroutine die bei jedem Formular die gleichen Übergabe und Rückgabeparameter hat. Das Hauptformular hat einen Timer, und dieser Timer sprint über einen Zeiger diese Aaktualisierungsroutine an ( alle 100 ms ), je nachdem welches Fenster denn gerade aktive ist. So weit tut das auch alles.

Jetzt hab ich nur das Problem, dass es beim Umschalten ab und zu, zu einer Exception kommt. :wall:

Und zwar besonders dann wenn ich viel auf dem Formular zu tun habe / hatte. Jetzt hab ich mit einigen Zusatzunits und Mapfile herausbekommen, dass es damit zu tun haben muss dass Windows nachdem das Formular weg ist noch auf irgend etwas zugreifen will um es zu aktualisieren.

Meine Frage jetzt, kann das sein? Kann es sein dass es erschwert zu tage kommt weil ich über einen Zeiger auf die Aktualisierung des Formulares mache?

Wenn ich jetzt in die Close Routine des Formulars einen Application.ProcessMessages setzte, zwinge ich dann Windows wirklich dazu alle Dinge die es noch auf dem Formular tun muss auch sofort zu tun?

Oder gibt es eine bessere Möglichkeit nur das eine Fenster zu aktualisieren?

barf00s 28. Jul 2005 10:30

Re: Aktualisierung Fenster erzwingen
 
frmBlah.Invalidate;


- btw, wieso lässt du über nen timer deine ganzen fenster alle 100ms "aktualisieren"
- wird der aktualisierungstimer vor dem zerstören des fensters auch angehalten/zerstört?

marabu 28. Jul 2005 10:35

Re: Aktualisierung Fenster erzwingen
 
Manchmal ist es besser TForm.Release() zu verwenden an Stelle von TForm.Free(), aber in der Regel tritt der Fehler auf, wenn an irgendeiner Stelle nach dem Free() ein dangling pointer zurück bleibt.

Grüße vom marabu

Surrounder 28. Jul 2005 10:40

Re: Aktualisierung Fenster erzwingen
 
Weil die Daten die in den Fenstern stehen über eine USB Kommunikation von einer Hardware kommen, für die Menge an Daten brauche ich eine schnelle Kommunikation. Und um diese Daten jetzt im Fenster darzustellen habe ich eben einen Zeiger den ich prüfe ob er nil ist oder nicht, wenn nicht dann rein in die Routine und aktualisieren. Das sind ca. 30 verschiednen Fenster, aber immer nur das aktive muss aktualisiert werden.

Der Timer kommt alle 10ms und jeden 10 durchlauf aktualisiert er das aktive Fenster ( Eigener Timer, der Windows Timer schafft das nicht ). Vor dem aktualisieren des Fenster setze ich eine globale Variable, und wenn ich zurück komme lösche ich diese. Wenn der close des Fensters kommt, weil z.B umgeschaltet wurde, dann warte ich im close bis die globale Variable False ist und dann setzte ich den Zeiger auf nil, so dass der Timer nicht noch einmal in das Fenster springen kann.

Ich hab eigentlich gedacht dass das reichen müsste um zu verhindern dass der Timer nach 10 durchläufen erneut ins Fenster springt. Weil ich den Timer aufgrund der Kommunikation die ja weiter laufen muss nicht anhalte.

Surrounder 28. Jul 2005 10:51

Re: Aktualisierung Fenster erzwingen
 
Zitat:

Zitat von marabu
Manchmal ist es besser TForm.Release() zu verwenden an Stelle von TForm.Free(), aber in der Regel tritt der Fehler auf, wenn an irgendeiner Stelle nach dem Free() ein dangling pointer zurück bleibt.

Grüße vom marabu

Blöde Frage vielleicht jetzt, aber welche Möglichkeit habe ich so einen Pointer los zu werden bzw. zu verhindern? Ich mein ich habe TCharts auf dem Formular und einige StringGrids. Soll ich die alle von Hand am Ende mit Free freigeben?

Ultimator 28. Jul 2005 11:04

Re: Aktualisierung Fenster erzwingen
 
Zitat:

Zitat von Surrounder
Blöde Frage vielleicht jetzt, aber welche Möglichkeit habe ich so einen Pointer los zu werden bzw. zu verhindern?

Verwende FreeAndNil() anstelle von .Free ;)

marabu 28. Jul 2005 11:25

Re: Aktualisierung Fenster erzwingen
 
Ein dangling pointer entsteht, wenn du beipielsweise in Form2.OnCreate eine Methode von Form2 an Application.OnIdle zuweist, dann irgendwann Form2.Free ausführst ohne vorher Application.OnIdle auf nil zu setzen. Nach der Wiederbelegung des Hauptspeichers führt das zu einer exception.

Das Beispiel ist vielleicht nicht sehr realistisch, aber es sollte dir verdeutlichen, dass nur deine Sorgfalt dich vor einem dangling pointer schützen kann.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz