![]() |
AW: Eigene Ereignisse auslösen
Wenn du T_CNCStatus anfassen kannst, wovon ich ausgehe, ist folgendes denkbar:
1. Erweiterung von T_CNCStatus um Property 2. Erweiterung von T_CNCStatus um Event
Delphi-Quellcode:
type
T_CNCStatus = packed record private FZbetr: byte; procedure SetZbetr(const Value: byte); public OnZbetrChange : TNotifyEvent; Kopf : byte; property Zbetr : byte read FZbetr write SetZbetr; end; implementation procedure T_CNCStatus.SetZbetr(const Value: byte); begin // hier könntest du vorher überprüfen ob sich der Wert wirklich geändert hat. FZbetr := Value; if Assigned(OnZbetrChange) then OnZbetrChange(nil); end; |
AW: Eigene Ereignisse auslösen
Hallo Jonas, vielen Dank , das ist es, was ich gesucht habe !
Die übrige Bytes aus Status records werden zwar benötigt, aber müssen keine ereignis auslösen. Ist es richtig, dass die Typendeklaration für Status dann insgesamt wie folgt aussehen wird : T_CNCStatus =packed record private FZbetr: byte; procedure SetZbetr(const Value: byte); public OnZbetrChange : TNotifyEvent; Kopf :byte; Zbetr :byte; ZREFE :byte; FLAG :byte; POSA1 :byte; POSA2 :byte; STACK :byte; ZAUTO :byte; ZOUT1 :byte; ZOUT2 :byte; ZINP1 :byte; ZINP2 :byte; VORSL :byte; {VORSCHUB} VORSH :byte; DAOUTL :byte; {DA1} DAOUTH :byte; SMAXH :byte; property Zbetr : byte read FZbetr write SetZbetr; end; {record} mfg Anton |
AW: Eigene Ereignisse auslösen
Wenn du diesen Record aber vom Comport oder einem Stream einliest, dann wird direkt auf den Speicher zugegriffen und das Property umgangen.
Der Setter wird nur benutzt, wenn über das Property etwas zugewiesen wird. |
AW: Eigene Ereignisse auslösen
Hallo Himitsu,
danke für den Hinweis, wenn ich also Dein Beispiel auf meine Anwendung anpasse, ist es so Richtig : //zuerst Typendeklaration TMyClass = procedure DoChange; // hier drin wird das OnChange-Event ausgelöst FMyProp: Byte; procedure SetMyProp(Value: Byte); property MyProp: Byte read FMyProp write SetMyProp; (* ich benötige nur ZBETR für Ereigniss auslösen, also darf ich es weglassen 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; *) Implementation procedure TMyClass.SetMyProp(Value: Byte); begin if Value = MyProp then Exit; FMyProp := Status.ZBETR; DoChange; end; |
AW: Eigene Ereignisse auslösen
Also an den Record selber würde ich keinerlei Events binden.
Statt dessen würde ich eine Klasse (z.B. abgeleitet von
Delphi-Quellcode:
) nehmen, welche die Nachrichten empfängt und dann den gesamten Record bei einer Änderung weiterreicht.
TThread
Ein Beispiel hatte ich in einem anderen Zusammenhang schon mal geschrieben ![]() Das Beispiel funktioniert zwar so nicht mit Delphi 7 beschreibt aber die generelle Vorgehensweise. |
AW: Eigene Ereignisse auslösen
Zitat:
Mal ganz von den bisherigen Beiträgen abgesehen. Das Vorhaben mutet an wie die Bastellösung eines seriellen TDatapackage. Welches über Events verfügt und auch ansonsten eigentlich keine Wünsche offen lässt. edt: Und noch eine Anmerkung. Da du einen Record verwendest gehe ich davon aus das die Daten des Records zusammengehörig sind. Wenn du jetzt bei Änderung von Zbetr auf ein OnChance reagierst sind vielleicht die anderen Felder noch nicht neu belegt. Du verwendest also in deiner Aktualisierungs/Verarbeitung-Routine eventuell Daten die noch zur Hälfte aus den alten Werten bestehen. |
AW: Eigene Ereignisse auslösen
Zitat:
Dann geht der Wert direkt in das Feld und wird nicht über das Property umgeleitet. |
AW: Eigene Ereignisse auslösen
Hallo,
Da der Record nur durch RS232 abgefüllt wird, werde ich beim Empfang fertig ein Flag setzen, und beim beginn des Empfangs natürlich rücksetzen. Dies lässt sich leicht lösen in der OnRXBuff procedur. Das wäre dann die Freigabe um die Daten zu lesen. (die Status Daten von der CNC werden nur gelesen). Es scheint mir, dass Ihr Experten euch nicht ganz einig sind, ist das so ? mfg Anton |
AW: Eigene Ereignisse auslösen
Zitat:
Delphi-Quellcode:
Der Trick hierbei ist es, die möglichen zeitlichen Überschneidungen so gering wie nur möglich zu halten. Da die Daten aber zunächst in eine lokale Variable geschrieben werden reduziert sich die Überschneidung auf das Auslesen/Setzen des Record-Inhalts und ist daher sehr kurz.
type
TMyClass = class( TThread ) private FCS : TCriticalSection; FStatus : TCNCStatus; procedure SetStatus( const Value : TCNCStatus ); function GetStatus : TCNCStatus; protected procedure Execute; override; public property Status : TCNCStatus read GetStatus; end; procedure TMyClass.Execute; var LStatus : TCNCStatus; begin inherited; while not Terminated do begin // Warten auf ein Empfangs-Signal // Irgendwie den Status empfangen LStatus := ... // öffentlichen Status setzen SetStatus( LStatus ); end; end; procedure TMyClass.SetStatus( const Value : TCNCStatus ); begin FCS.Enter; try FStatus := Value; finally FCS.Leave; end; end; function TMyClass.GetStatus : TCNCStatus; begin FCS.Enter; try Result := FStatus; finally FCS.Leave; end; end; |
AW: Eigene Ereignisse auslösen
Zitat:
Zitat:
Ich empfehle serielle Datenpakete zu verwenden. AsyncPro bietet das kostenlos. Stichwort Songbeamer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 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-2025 by Thomas Breitkreuz