Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehler bei Form1.Active (https://www.delphipraxis.net/28951-fehler-bei-form1-active.html)

mak 1. Sep 2004 16:48


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

Robert_G 1. Sep 2004 17:17

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)

Niko 1. Sep 2004 17:22

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:

Zitat von mak
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.

Das dürfte bei einer Ein-Thread-Anwendung IMHO nicht passieren.

Golze 1. Sep 2004 17:27

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

mak 3. Sep 2004 08:51

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.

Sprint 3. Sep 2004 08:57

Re: Fehler bei Form1.Active
 
Zitat:

Zitat von mak
Könnte es sein, dass der Delphi-Timer (Komponente unter System) eine thread benutzt und daher nicht mehr synchronisiert ist?

TTimer benutzt die Windows Timer. Auf der Form wo deine TTimer Komponente liegt, wird auch die Nachricht WM_TIMER hingeschickt.
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.

mak 3. Sep 2004 09:07

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

Golze 3. Sep 2004 16:28

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

Robert_G 3. Sep 2004 17:24

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:

Je nach Auslastung des PC's wird bei starten des Programms an dieser Stelle ein Fehler ausgelöst.
Wenn dein Timer etwas bereitstellt, das dein Form unbedingt benötigt, kannst du direkt ins nächste Messer laufen. ;)
Timer besitzen IMHO die niedrigste Priorität überhaupt -> Will irgendein Programm CPU-Zeit, wird dein Timer nix mehr abkriegen.

mak 6. Sep 2004 07:59

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 19:24 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