AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Ereignisse auslösen

Ein Thema von akurka · begonnen am 25. Mai 2014 · letzter Beitrag vom 1. Jun 2014
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#11

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 08:02
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;
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (26. Mai 2014 um 08:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 08:29
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
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 08:52
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.
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
 
#14

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 10:26
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;
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 11:25
Also an den Record selber würde ich keinerlei Events binden.

Statt dessen würde ich eine Klasse (z.B. abgeleitet von TThread ) nehmen, welche die Nachrichten empfängt und dann den gesamten Record bei einer Änderung weiterreicht.

Ein Beispiel hatte ich in einem anderen Zusammenhang schon mal geschrieben
http://www.delphipraxis.net/179188-g...a-threads.html
Das Beispiel funktioniert zwar so nicht mit Delphi 7 beschreibt aber die generelle Vorgehensweise.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (26. Mai 2014 um 11:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#16

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 11:46
Zitat:
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.
Wie ist es möglich, den Setter zu umgehen und auf FZbetr zu schreiben?

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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (26. Mai 2014 um 11:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 12:20
Wie ist es möglich, den Setter zu umgehen und auf FZbetr zu schreiben?
Indem man z.B. das TMyClass weiterhin als Record belässt und dann z.B. über ComPort.Read oder TStream.Read direkt in den Speicher der Record-Variable schreibt.

Dann geht der Wert direkt in das Feld und wird nicht über das Property umgeleitet.
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
 
#18

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 12:30
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
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 12:50
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).
Das ist eigentlich unnötig, denn diese Zugriffe kannst du erheblich besser mit einer CriticalSection absichern.
Delphi-Quellcode:
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;
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (26. Mai 2014 um 12:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#20

AW: Eigene Ereignisse auslösen

  Alt 26. Mai 2014, 13:23
Zitat:
Dann geht der Wert direkt in das Feld und wird nicht über das Property umgeleitet.
Stimmt hatte vergessen "strict private" drauß zu machen, aber man müsste schon explizit FZbetr beschreiben um den Setter zu umgehen.

Zitat:
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.
Wie hilft denn hier ein Flag? Das OnChance hätte ja schon aufgerufen werden müssen, wenn du das Flag zurück setzt. Das wird dadurch nur komplizierter.

Ich empfehle serielle Datenpakete zu verwenden. AsyncPro bietet das kostenlos. Stichwort Songbeamer
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 16:28 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