Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Eigene Ereignisse auslösen (https://www.delphipraxis.net/180510-eigene-ereignisse-ausloesen.html)

akurka 25. Mai 2014 15:38

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

zeras 25. Mai 2014 15:58

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?

akurka 25. Mai 2014 17:06

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

zeras 25. Mai 2014 17:17

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.

akurka 25. Mai 2014 17:45

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

zeras 25. Mai 2014 18:11

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.

himitsu 25. Mai 2014 18:33

AW: Eigene Ereignisse auslösen
 
Zitat:

Zitat von zeras (Beitrag 1260183)
Dann kannst du dich doch nur in die Empfangsroutine mit reinhängen und dann prüfen. Von allein wird da kein Ereignis kommen.

Im Prinzip muß also der alte Status gespeichert sein.

Nach Empfang und Auswertung des aktuellen Records wird dessen Inhalt z.B. in sowas wie
Delphi-Quellcode:
FLastCNCStatus: T_CNCStatus;
gespeichert. (falls die einzelnen Statuswerte nicht schon irgendwo existieren)
Bei der Auswertung kann man nun die Alten mit den neuen Werten vergleichen und bei einem Unterschied dann das gewünschte Ereignis auslösen.

akurka 25. Mai 2014 21:15

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

zeras 25. Mai 2014 21:34

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.

himitsu 26. Mai 2014 01:53

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:
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;
(nun nur noch alle nötigen Werte entsprechend dieser Property-Vorlage anlegen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 Uhr.
Seite 1 von 5  1 23     Letzte »    

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