![]() |
Eigene Ereignisse auslösen
Hallo
Folgende Situation : //---------------------------------- T_CNCStatus = packed record Kopf :byte; ZBETR :byte; ZREFE :byte; FLAG :byte; // //usw. total 16 Byte SMAXH :byte; end; //record //-------------------------------- var Status :T_Status;{Status-Satz} //---------------------------------------- Wie kann ich ein Ereigniss erzeugen wenn sich der Wert des Bytes im Status.ZBETR ändert ? Die var Status wurde beschrieben durch Daten die von rs232 kommen. mfg Anton |
AW: Eigene Ereignisse auslösen
Kommt der Packed record als Array of Byte aus der RS232 und wird dann in record abgelegt? Oder wird jeder einzelne Wert von "Irgendwem" beschrieben?
|
AW: Eigene Ereignisse auslösen
Hallo Zeras
Ja, der Record wird ausschliesslich durch RS232 abgefüllt . Allerdings kann es passieren (in Mehrheit der Fälle), dass die Daten exakt die gleichen sind. Der ZBETR = Betriebswahl ändert nicht so schnell, ich soll aber nur bei einer Aenderung ein Erreignis (OnChange ) haben. Gruss Anton |
AW: Eigene Ereignisse auslösen
Wenn die Daten über die RS232 reinkommen, musst du diese ja bewerten.
Beispiel: Wenn 16 Zeichen im Puffer sind, dass du dann was machst. Wenn weniger Zeichen da sind, dann noch warten, bis 16 Zeichen im Puffer sind. Erst dann die Bewertung machen. Nebenbei solltest du noch einen Timeout nutzen, damit, wenn einmal zu wenig Zeichen kommen, diese dann verworfen werden und neu angefragt werden. Ich weiß zwar nicht, welche RS232 Unit du hast, aber bei den meisten kann man abfragen, wieviel Zeichen im Puffer sind. Wenn dann diese 16 Zeichen ausgewertet sind, kannst du dich auf dein Byte konzentrieren, welches du prüfen willst. |
AW: Eigene Ereignisse auslösen
Hallo Zeras
Ja, dass ist im bisherigem (pascal)Programm so, aber das ist nicht umbedingt OOP like(resp Delphi like). Ich soll vielleicht erwähnen das der Status eine Globale var ist. Ausserdem befinde ich mich in x_te Menü(x_te Form) und die Componente für Async32(auch Ereignis gesteuert) läuft völlig autonom. Ich möchte nicht wieder in das alte Schema von Polling hinein kommen. Ich möchte nur feststellen können, ob sich die Betriebswahl geändert hat, und falls es so war, wird in das y_te Menue(y_te Form) gewechselt. Uebrigens läuft die Komponennte Async32(rs232) auf dem Form1 (also Haupt programm). mfg Anton |
AW: Eigene Ereignisse auslösen
Wie liest du denn die Daten von Async aus?
Dann kannst du dich doch nur in die Empfangsroutine mit reinhängen und dann prüfen. Von allein wird da kein Ereignis kommen. Vielleicht hilft ein wenig Code von dir weiter. |
AW: Eigene Ereignisse auslösen
Zitat:
Nach Empfang und Auswertung des aktuellen Records wird dessen Inhalt z.B. in sowas wie
Delphi-Quellcode:
gespeichert. (falls die einzelnen Statuswerte nicht schon irgendwo existieren)
FLastCNCStatus: T_CNCStatus;
Bei der Auswertung kann man nun die Alten mit den neuen Werten vergleichen und bei einem Unterschied dann das gewünschte Ereignis auslösen. |
AW: Eigene Ereignisse auslösen
Hallo Himitsu,
Soviel ich in der letzte Zeit gelesen habe, soll Delphi eine Ereigniss orientierte Sprache. Selbstverständlich kann man es mit Vergleich alt/neu lösen, das ist sogar bereits im meinem uraltem Pascalprogramm so realisiert. Aber ich will es ja neu schreiben. Ich meinte, ahnlich wie die standard Ereignisse wie z.Bsp OnClick sollte man auch eigene Ereigniss "OnChange" für die Variableaenderung definieren können. Das wäre doch eleganter. Die Menues Umschaltung wird dann nur durch das Ereigniss gestartete Methode bewerkstelligt. Sollte das nicht durch überschreiben der Standard Ereignisse aus TControl möglich sein ? Durch die Definition eines eigenen Typs ? Nun bin ich da ein bisschen überfordert, wie es da weiter gehen soll. Vielleicht weisst Du ein ähnliches Beispiel ? mfg Anton |
AW: Eigene Ereignisse auslösen
Überlege mal, wie man zu einem Ereignis kommt.
Man muss intern überprüfen und dann sehen, ob der Status sich geändert hat. Der beste Zeitpunkt ist, wie schon oben beschrieben, die Empfangsorutine. Die läuft ereignisgesteuert. Und da wirst du dich reinhängen müssen. Soweit, wie ich weiß, läuft bei den RS232 Units um Hintergrund ein schneller Timer, der prüft, ob neue Daten im Hardwareempfangspuffer liegen und holt diese dann ab. Damit werden dann Ereignisse wie OnReceived etc. erstellt. Prüfe also im Ereignis OnReceived oder ähnlich ab, ob 16 Bytes da sind und lege diese in einem separaten Puffer ab. Wenn dann wieder 16 Bytes da sind, vergleichst du dann die neuen Daten mit den Alten Daten und wenn sich der Status geändert hat, machst du dann deine Routine. |
AW: Eigene Ereignisse auslösen
Ja, Delphi ist im Grunde eine objekt-orientierte Programmiersprache (OOP), welche viel mit Events arbeitet, aber von Alleine passiert das auch nichts.
Was man machen kann, ist seinen Code in entsprechende Klassen aufzuteilen und die Events/Property entsprechend auszulegen. Also z.B. gibt es dann irgendwo ein SMAXH-Property, welches im Setter prüft, ob sich der aktuelle Wert ändert und wenn ja, dann wird ein entsprechendes Ereignis ausgelöst.
Delphi-Quellcode:
(nun nur noch alle nötigen Werte entsprechend dieser Property-Vorlage anlegen)
procedure DoChange; // hier drin wird das OnChange-Event ausgelöst
FMyProp: Integer; procedure SetMyProp(Value: Integer); property MyProp: Integer read FMyProp write SetMyProp; function GetMyPropX(Index: Integer): Integer; // man kann auch einen Getter/Setter für mehrere Property benutzen procedure SetMyPropX(Index, Value: Integer); property MyPropA: Integer index 1 read GetMyPropX write SetMyPropX; property MyPropB: Integer index 2 read GetMyPropX write SetMyPropX; property MyPropC: Integer index 3 read GetMyPropX write SetMyPropX; procedure TMyClass.SetMyProp(Value: Integer); begin if Value = MyProp then Exit; FMyProp := Value; DoChange; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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 by Thomas Breitkreuz