AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Eigene Ereignisse auslösen

Ein Thema von akurka · begonnen am 25. Mai 2014 · letzter Beitrag vom 1. Jun 2014
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#1

Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 16:38
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
Anton Kurka
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 16:58
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?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#3

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 18:06
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
Anton Kurka
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#4

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 18:17
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#5

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 18:45
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
Anton Kurka
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#6

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 19:11
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#7

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 19:33
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#8

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 22:15
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
Anton Kurka
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#9

AW: Eigene Ereignisse auslösen

  Alt 25. Mai 2014, 22:34
Ü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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#10

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 02:53
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Mai 2014 um 02:55 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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