![]() |
Fehler bei Form1.Active
Hallo
hab da ein ziemlich grosses Problem und das besteht darin, das ich je nach Auslastung des PC's bei dieser Zeile "Form1.Active" einen Fehler erhalte. Hab heute den ganzen Tag div. Versionen ausprobiert (Active, Showing) immer derselbe Effekt. Irgendwie scheint es, dass das "Fomr1" noch nicht ganz erstellt ist, wenn der PC andere Task bearbeiten muss. z.Bsp. Word aufstarten etc., wenn ich darauf zugreife. Ich hab auch schon einen Timer eingefügt und das Programm X sec leerlaufen lass, bis ich dann die Funktion aufgerufen habe. Damit hat es funktioniert. Gibt es irgendeine Funktion mit der ich abfragen kann ob der Create-Vorgang abgeschlossen ist. Bzw. ist der Vorgang wirklich abgeschlossen nach dem Aufruf der Funktion Create? Der Ablauf des Programm ist Ok. Die Abfrage "Form1.Active" erfolgt erst nach dem Aufruf "Application.Run". Besten Dank im voraus für die Hilfe. Gruss Markus |
Re: Fehler bei Form1.Active
Warum packst du den Code dann nicht einfach in den OnShow/OnLoaded/WasWeißIchWieDerHeißt - Event.
Dadurch würde er wirklich erst dann ausgefürht werden, wenn das Formular dargestellte wird. (oder vielleicht kurz vorher) |
Re: Fehler bei Form1.Active
Hi,
wo greifst du auf Active zu? Wird das Form automatisch erzeugt oder rufst du das Create selbst auf? Eventuell könnte auch ein bisschen Code ganz hilfreich sein. Zitat:
|
Re: Fehler bei Form1.Active
Hi Mak,
die Form ist nach dem Create noch nicht endgültig fertig. Das liegt aber an Windows und der Bearbeitung der Message-Queue. Was ich in deinem Problem nicht verstehe ist, was du eigentlich wirklich machen willst. Gibt doch mal ein Beispiel. Das OnShow-Ereignis ist eine Möglichkeit, hat aber auch seine Tücken. Wozu hast du einen Timer gestartet. Las' mal sehen, wo dein Problem ist. Kay |
Re: Fehler bei Form1.Active
Hallo
sorry für die späte Antwort, war gester leider ausser Haus, daher erst jetzt eine Rückmeldung. Also ich habe da ein Projekt das über eine RS232-Schnittstelle kommuniziert. Ein Teil des Projektes besteht darin, dass in einem Formular Fehler angezeigt werden, die aus eben dieser Hardware über RS232 eingelesen werden. Wenn nun ein Fehler ansteht wird das Fehleranzeigeformular automatisch geöffnet und mittels einer Funktion das StringGrid auf dem Formular gefüllt. Diese Funktion wird über einen Timer (DelphiTimer nicht MM) zyklich aufgrufen wie die Kommunikation auch. Damit ich nun diese Funktion nur aufrufe wenn das Formular auch angezeigt ist, habe ich eben die Funktion "FormX.Showing" verwendet. Könnte es sein, dass der Delphi-Timer (Komponente unter System) eine thread benutzt und daher nicht mehr synchronisiert ist? Ich Versuch das ganze mal mit dem Hi-Timer von LMD, mal schauen was dabei herauskommt. Gruss Markus und vielen Dank für die Anregungen. |
Re: Fehler bei Form1.Active
Zitat:
Und in der Fensternachrichtenschleife abgelegt. Alle Nachrichten die vor WM_TIMER kommen, werden auch zuerst bearbeitet. Aber irgendwie habe ich dein Problem nicht so richtig verstanden. |
Re: Fehler bei Form1.Active
Hallo
also ich versuche es noch einmal. Ganz vereinfacht würde das Projekt aus zwei Formularen bestehen: FormHauptprogramm, FormFehlerAnzeige FormHauptprogramm hat einen Timer. In diesem OnTimer Event steht die Abfrage FormFehlerAnzeige.Showing. Je nach Auslastung des PC's wird bei starten des Programms an dieser Stelle ein Fehler ausgelöst. Der Timer wird erst gestartet im "OnActivate" vom Hauptformular. Also nach meine Verständnis, wenn das Formular FormFehlerAnzeige created ist und ich auch solche Abfragen an das Formular FormFehlerAnzeige stellen kann. Hoffe ich hab es jetzt auf den Punkt gebracht. Gruss Markus |
Re: Fehler bei Form1.Active
Hallo Mak,
ein Create einer Form reicht nicht aus. Das Handle einer Form ist erst im OnShow-Ereigniss einer Form verfügbar. Ein Timer ist in der Tat sowas wie ein Thread von Windows. Wenn ich dich richtig verstanden habe, mußt die natürlich in deinem OnTimer-Event abfragen, ob die Form vorhanden ist und angezeigt wird. Folgender Weg könnte dein Problem lösen: 1. Erzeuge deine Form für die Fehlerausgabe (also mit dem StringGrid) bereits beim Programmstart und setze sie auf Invisible (Visible := False). 2. Wenn durch deine Funktion Daten in den StringGrind abgelegt werden sollen, kann das nun zu jedem Zeitpunkt erfolgen. 3. Zeige die Fehler-Form durch Visible := True an, wenn es notwendig ist. 4. Zerstöre die Form erst mit dem Programmende. Mit diesem Weg hast du nun kein Problem mit dem Timer. Es funktioniert immer. Ich verwende diesen Weg selbst an zahlreichen Stellen. Grüße Kay |
Re: Fehler bei Form1.Active
Kay hat natürlich vollkommen recht: Ohne Handle kein Message loop. -> keine Timernachricht.
Ist das Form nur unsichtbar, bekommt es trotzdem Messages. Zitat:
Timer besitzen IMHO die niedrigste Priorität überhaupt -> Will irgendein Programm CPU-Zeit, wird dein Timer nix mehr abkriegen. |
Re: Fehler bei Form1.Active
Hallo
besten Dank für eure Hilfe. Werde mal Versuchen, das System von Kay in meinem Programm umzusetzen. Gruss Markus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz