Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   OnChangeValue ? (https://www.delphipraxis.net/187891-onchangevalue.html)

akurka 14. Jan 2016 22:49

AW: OnChangeValue ?
 
ja übrigens das fehlt noch :
Delphi-Quellcode:

  TMeineKlasse = class
    private
       fBWStellung: Integer; //Hier ist der Wert gespeichert
       fOnValueChange :TNotifyEvent;
       procedure setBWStellung(const value: Integer);
       //function getBWStellung:Integer;
    public
      //BWStellung steht für Eigenschaft von fBWStellung
      Property BWStellung :Integer read fBWStellung write SetBWStellung;
      property OnValueChange: TNotifyEvent read FOnValueChange write FOnValueChange;
    end;
   // setBWStellung :Setter ist eine Methode um in fBWStellung zu schreiben
   //fBWStellung kann nur über das propperty ändern

var
  Form2: TForm2;
  MeineKlasse: TMeineKlasse;
  fBWStellung :integer;
  ActiveImage :TImage;
  F_KeyA :boolean;
  procedure OptionFehlt;

implementation
usw.

Perlsau 15. Jan 2016 00:47

AW: OnChangeValue ?
 
Akurka, tut mir leid, aber ich geb's hier auf. Offenbar fehlen mir noch weitere Informationen, um dein Problem richtig zu verstehen. Es gibt hier zahlreiche berufenere Geister als mich, die dir sicher gerne weiterhelfen werden.

akurka 15. Jan 2016 08:25

AW: OnChangeValue ?
 
Hallo Perlsau
ja ok, ich meine ich habe mein Problem genügend erklärt (siehe Antwort an Dich und Dejan Vu), vollständigkeits halber zitiere ich es noch einmal :

Zitat:

------------------------------------------------
Zitat von Dejan Vu
Habe ich das jetzt so verstanden, dass STATUS.CNC.ZBETR irgendwo außerhalb gesetzt wird und man auf die Änderung dieses Speicherbereiches reagieren will? Das kann mit der Lösung von Perlsau nicht funktionieren.
Laut Variable ist das der Status irgendeiner CNC-Maschine. Und dieser Wert ändert sich dann, wenn die CNC-Maschine ihren Status ändert. In der SPS-Welt pollt man den Wert (alle paar ms) und reagiert dann auf Änderungen.
------meine Antwort-----------------------------------------
Ja das ist so, der STATUS.CNC.ZBETR ist ein Byte aus einer 16 Byte Meldung die in unregelmässigen Abständen über RS232 in einem Thread empfangen wird.
Die Meldung selber kommt relativ häufig aber der STATUS.CNC.ZBETR ändert sich nur dann, wenn der Benützer das Betriebswahlschalter wechselt.Und das kann Stunden dauern. Ausserdem gibt es ganzer Menge andere Meldungen.

Bis jetzt habe ich es mit Polling gelöst was aber nicht gerade sauber ist. Der Grund warum ich es anders machen will ist, dass bei einem BW Wechsel das aktuelle Menü komplett neu aufgebaut wird.
Sonst bleibt das Menue bestehen und es werden nur Anzeigen geändert.
Aber auch das stösst an Grenzen mit Polling.

Eigentlich suchte ich eine Komponente die auf Aenderung einer Variable
reagiert (OnChangeValue).
Dieser Komponente möchte ich dann für verschiedene Variablen
anwenden (OnChangeBWStellung, OnChangeIstwert, OnchangeAchsenWahl usw.)

Die Polling Lösung hat ein gewichtige Nachteil, es verbraucht sehr viel Rechenzeit(bei allen diesen Meldungen).

Im übrigem ist mir klar, dass wenn die neue Lösung funktioniert ich mich auch mit "kritische Region" befassen muss, das aber später,eines nach dem anderem.

Die RS232 ist sowieso nur vorläufige (alte) Lösung , im Zukunft möchte ich auf EtherCAT(oder OpenCAN) umstellen, schon deswegen möchte ich die Resourcen sparen.

Nun muss ich auch die setter Methode immer wieder aufrufen
was dem Polling eigentlich gleich kommt, ist das nicht so ?

Nun ich verstehe, dass Du genug hast Dich mit OOP Anfänger
zu plagen. Trotzdem vielen Dank für Deine Hilfe, ich habe
wieder einiges gelernt.
Gruss Anton

Jumpy 15. Jan 2016 09:59

AW: OnChangeValue ?
 
Lies dir mal hier den 2ten Abschnitt: Prozedurale Typen und Objekte durch.

Da geht es auch um ein TNotifyEvent und wie man eine entsprechende Prozedur definiert, erzeugt und benutzt. Oder informiere dich einmal zum Stichwort "Methodenzeiger".


Musst du eigentlich mehrere verschiedene Werte überwachen (du würdest dann für jeden ein entsprechendes Objekt von TMeineKlasse brauchen) oder geht es nur um einen Wert? Im letzteren Fall könntest du dir den ganzen Aufwasch ja sparen und mit einer Variablen + Setter + Property direkt in Form2 arbeiten.

Mavarik 15. Jan 2016 10:27

AW: OnChangeValue ?
 
Zitat:

Zitat von akurka (Beitrag 1327100)
Nun muss ich auch die setter Methode immer wieder aufrufen
was dem Polling eigentlich gleich kommt, ist das nicht so ?

Klar...

Du möchtest einen Event... Aber wo soll der den her kommen? Wer soll den auslösen?

Wie pollst Du den? Du Fragst doch sicherlich etwas ab... Oder? Gibt es einen Trigger der RS232 Routine, nach dem Motto "Neue Daten da"? Das wäre eine Event... Auf den kannst Du reagieren, dann den Wert abfragen und gut ist. Kein Pollen mehr...

Mavarik

TiGü 15. Jan 2016 11:04

AW: OnChangeValue ?
 
So wäre das im Ansatz richtig:
Delphi-Quellcode:
procedure TForm2.MenueCreate(Sender: TObject);
begin
  keypreview := True;
  ActiveImage := Image1;
  Self.ClientWidth := 512;
  Self.ClientHeight := 256;
  Self.Image1.Width := 511;
  Self.Image1.Height := 255;
  F_obereAchsen := False;
  F_KeyA := False;
  MeineKlasse := TMeineKlasse.Create;
  MeineKlasse.OnvalueChange := Self.OnValueChange;
end;
Nun müsstest du uns nur noch die Stelle zeigen, wo du das machst:

Delphi-Quellcode:
MeineKlasse.BWStellung := ... // Die Zuweisung des neuen Wertes
// Das musst du ja irgendwie durch Pollen im Timer oder Thread umgesetzt haben?!

akurka 15. Jan 2016 11:07

AW: OnChangeValue ?
 
Hallo Jumpy
Besten Dank für Dein Tipp.
Ja nach der ersten Durchsicht ist es genau das was mir fehlt.
Habe es augedrückt und werde es genau studieren.

Zu Deiner Frage:

Ja es sind mehrere Werte aus den Meldungen die von der CNC über RS232
kommen. Die Wichtigste ist die Status.CNC Meldung(16 Byte,Array) und daraus das ZBETR(BetriebswahlSchalterStellung=BWStellung= 1 Byte).

Aber es soll aber auch bei der IstWertMeldung
( Anzahl Bytes variert,je nach Anzahl Achsen,pro Achse 24bit)
festgestellt werden ob sich irgend ein Istwert(24bit =>Integer) verändert hat.
Jetzt mache ich es mit Polling und Vergleich AltWert <> NeuWert und nur wenn eine Aenderung da ist, wird es Angezeigt.
Ziemlich umständlich und ein Resourcen Fresser.

Im grossen Ganzen sind es (je nach Betriebswahl) 2 bis 4 unterschiedliche Meldungen die permanent überwacht werden müssen.

Andrererseits muss ich sagen, dass die bisherige Lösung eigentlich nicht schlecht läuft.
Eleganter wäre natürlich eine Lösung wie bei
Tasten z.Bsp. OnKeyPress, darum meine Idee mit OnChangeValue.

Nur wenn sich ein Wert ändert wird entsprechender Erreigniss ausgelöst und der Wert Angezeigt.
Ob es dann weniger Rechenzeit braucht kann ich nicht beurteilen, aber ich will es probieren und testen.
Gruss Anton

Mavarik 15. Jan 2016 11:10

AW: OnChangeValue ?
 
Zitat:

Zitat von akurka (Beitrag 1327125)
Eleganter wäre natürlich eine Lösung wie bei
Tasten z.Bsp. OnKeyPress, darum meine Idee mit OnChangeValue.

Nur wenn sich ein Wert ändert wird entsprechender Erreigniss ausgelöst und der Wert Angezeigt.
Ob es dann weniger Rechenzeit braucht kann ich nicht beurteilen, aber ich will es probieren und testen.
Gruss Anton

Hast Du eigentlich meine Antwort gelesen?

akurka 15. Jan 2016 11:22

AW: OnChangeValue ?
 
Hallo TiGü
Besten Dank, das " MeineKlasse.OnvalueChange := Self.OnValueChange;"
hat gefehlt.

Ja mit der Polling, dass ist genau das Problem, das mache ich jetzt schon:
Zitat:

Delphi-Quellcode:
MeineKlasse.BWStellung := ... // Die Zuweisung des neuen Wertes
// Das musst du ja irgendwie durch Pollen im Timer oder Thread umgesetzt haben?!
siehe meine vorherige Antwort an Jumpy und an Perlsau.

Wird es punkto Rechenzeit überhaupt etwas bringen mit dem setter, wenn ich den Wert der Variable pollen muss ??
Gruss Anton

Mavarik 15. Jan 2016 12:12

AW: OnChangeValue ?
 
Zitat:

Zitat von akurka (Beitrag 1327130)
Wird es punkto Rechenzeit überhaupt etwas bringen mit dem setter, wenn ich den Wert der Variable pollen muss ??
Gruss Anton

Hast Du eigentlich meine Antwort gelesen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 Uhr.
Seite 3 von 5     123 45      

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