Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mi 23.04.14 16:49 
Hallo Leute,
ich habe eine Procedur bzw. ein ButtonClick Ereignis in dem mehrere Schritte ausgeführt werden.
Unter anderem wird ein externen Netzteil über einen Comport eingeschaltet.
Nun muss aber bevor mit dem Aufruf einer Unterprozedur angefangen werden darf überprüft werden ob das Netzteil auch an ist.
Dazu sende ich in meinr ButtonClick Prozedur einen Befehl. und nun kommt das Problem an dem ich nicht weiter komme.
enn ich den Befehl an das NEtzteil geschickt habe meldet es sich zurück und in dem Event procedure TForm1.NetzteilRxClusterEvent(Sender: TObject); von der Komponente SerialNG wird der Status in eine variable gespeichert.

Jetzt müsste meine ButtonClick Procedur solange warten bis dieses Ereignis eingetreten ist bzw. die Variable den Wert 1 hat ode ein Timeout entritt.
Aber die Procedur wird ja erstmal komplett durchlaufen bis das RX Event eintritt ( was auch ca. 0,5S dauert).
Wie kann ich das nun so zum laufen bekommen das erstmal geschaut wird ob alles i.O. ist bevor weitere Funktionen aufgerufen werden?
Für Vorschläge und Stichworte wäre ich sehr dankbar.
Grüße Christian
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 23.04.14 16:58 
Moin!

Du denkst/planst nicht ereignisorientiert. ;) Schau mal hier rein, da wird das Konzept "Anwendungszustand" erklärt, damit kommst du weiter. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Do 24.04.14 15:49 
Hallo Narses,
hab jetzt mal das Beispiel mit den Buttons nachprobiert, funktioniert.
Ich würde jetzt daraus Ableiten das:
Ich folgende Zustände habe:
1. Programmierknopf gedrückt
2. Rückmeldung von Netzteil erfolgt
3. Programmierung
4. Idle

Der erste Zustand wird erreicht nachdem der Button gedrückt wurde.
Mein exterenes Rückmeldeereignis setzt den Zustand auf 2. In diesem Zustand wird Zustand 3 aufgerufen.
Nach der Programmierung wird der Zustand Idle aufgerufen.

Kann man das so machen?

Grüße Chris
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 24.04.14 16:33 
Ereignisse in einem Windows-Programm können auf vielfältige Weise ausgelöst werden:

1. durch Benutzer-Aktionen
2. durch Windows-Aktionen
3. durch Datenbank-Aktionen
4. durch Geräte-Aktionen
5. ...

Wenn nun ein Gerät zu einer Rückmeldung an dein Programm fähig ist, mußt du auf diese Rückmeldung entsprechend reagieren, indem du dafür eine Ereignisbehandlung schreibst, genau so, wie du das für das Klicken auf einen Button machst. Dabei wertest du die Rückmeldung aus, die ja hoffentlich mitteilt, ob das Netzteil erfolgreich ein- oder ausgeschaltet wurde. Je nach Auswertungsergebnis verzweigst du in entsprechende weitere Methoden. Wichtig wäre vielleicht noch, den Button entsprechend zu markieren, nachdem er gedrückt wurde: So lange das Gerät damit beschäftigt ist, sich einzuschalten, sollte man den Button auf Enabled := False stellen. Danach könnte man die Button-Beschriftung von "Einschalten" auf "Ausschalten" ändern und Enabled wieder auf True setzen. Wichtig wäre, wenn du die ganze Logik in einer eigenen Klasse abhandelst, ein Property einzufügen, das den Zustand des Netzteils (Gerätes) repräsentiert. Dann mußt du beim Buttonklick einfach immer nur dieses Property abfragen, um zu wissen, ob jetzt gerade ein- oder ausgeschaltet werden soll.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 24.04.14 23:27 
Moin!

user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:
Kann man das so machen?
Ja, das hört sich zumindest logisch an. :zustimm:

Ich würde vielleicht noch etwas umsortieren, so dass der Startzustand auch direkt bei Programmstart greift:
1. Idle
2. Programmierknopf gedrückt
3. Rückmeldung von Netzteil erfolgt
4. Programmierung
->1. Idle

user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:
Der erste Zustand wird erreicht nachdem der Button gedrückt wurde.
Hier würde ich noch, wie Perlsau bereits vorgeschlagen hat, den Button deaktivieren. Es ist sicher auch eine gute Idee, wenn du irgendwo (weniger schön wäre direkt auf dem Button, also eher in einer Statuszeile oder sowas) ausgibst, was das Programm grade tut (der Button ist ja deaktiviert, da will man als Anwender wissen, warum und was los ist :idea:).

Generell: Probier´s einfach mal aus, da kann man eigentlich nicht soo viel falsch machen, wenn man das mal verstanden hat. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.