AGB  ·  Datenschutz  ·  Impressum  







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

OnChangeValue ?

Ein Thema von akurka · begonnen am 13. Jan 2016 · letzter Beitrag vom 18. Jan 2016
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Perlsau
(Gast)

n/a Beiträge
 
#11

AW: OnChangeValue ?

  Alt 13. Jan 2016, 20:34
Du solltest eigentlich schon wissen, was du da tust. Das Property soll gelesen und geschrieben werden von getfBWStellung und SetfBWStellung. Dann mußt du deine Methoden auch so benennen. Wenn du, wie von mir empfohlen, auf der Property-Zeile Ctrl-Shift-C gedrückt hättest, wären diese Methoden automatisch richtig erstellt worden. Oder gibt's das bei deiner alten Version noch nicht? Das kann ich natürlich nicht wissen. Also wie gesagt: das, was hinter read steht, ist die Methode zum lesen des Property's, und das, was hinter write steht, die zum schreiben. Wenn du jetzt in der Deklaration ebenso wie in der Implementation dieses f einfügst, sollte es funktionieren.

Und vergiß nicht, die Tutorials durchzuarbeiten, damit deine Kenntnisse über OOP (Objektorientiertes Programmieren) voranschreiten können. Weißt du, ich hab das damals auch nicht alles auf Anhieb verstanden, sondern erst nach & nach durch viel Übung und ständiges Anwenden. Einfach nur so was abtippen und dann wie der Ochs vor einer kryptischen Fehlermeldung zu stehen, wird dich nicht wirklich weiterbringen ...
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#12

AW: OnChangeValue ?

  Alt 14. Jan 2016, 06:17
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.

Wenn der Treiber kein Callback anbietet, muss man selbst pollen. Das geht mit einem Timer, nur bekommt man die Änderungen dann nicht in Echtzeit mit. Falls damit ein Leitstand, also eine Anzeige des Status umgesetzt werden soll, reicht es aber.

Besser wäre es, eine Threadklasse zu schreiben, die den Status kontinuierlich prüft und bei Änderung ein Event auslöst (per Synchronize oder Queue). Dann hat man sein Event.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: OnChangeValue ?

  Alt 14. Jan 2016, 11:02
Hallo mitenand

Beitrag von Perlsau:
Zitat:
Wenn du, wie von mir empfohlen, auf der Property-Zeile Ctrl-Shift-C gedrückt hättest, wären diese Methoden automatisch richtig erstellt worden. Oder gibt's das bei deiner alten Version noch nicht? Das kann ich natürlich nicht wissen. Also wie gesagt: das, was hinter read steht, ist die Methode zum lesen des Property's, und das, was hinter write steht, die zum schreiben. Wenn du jetzt in der Deklaration ebenso wie in der Implementation dieses f einfügst, sollte es funktionieren.
genau das habe ich auch probiert aber mit oder ohne "f" die Fehlermeldung
ist immer die Gleiche.
Auch das mit Ctrl-Shift-C funktioniert nicht.
Ich fürchte das Problem liegt tatsächlich an meiner alte Delphi version.
Ja nun was tun ?
Allzuviel will ich in eine neue Delphi Version nicht investieren. Was empfielst Du mir ?

Uebrigens bin ich hauptsöchlich ein Hardware Entwickler (VHDL,FPGA)darum
bereitet mir dass OOP denken ziemliche Schwierigkeiten.
In den Tutorials die ich schon X-mal durchgelesen habe ist es immer so schön erklärt, aber die Praxis ist eine andere. Ja, ich gebs mir Mühe !!!
Gruss Anton

Beitrag von Dejan Vu
Zitat:
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.
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.
Du hast dich offenbar auch schon mit der SPS Welt befasst, was schlägst Du vor ?

Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#14

AW: OnChangeValue ?

  Alt 14. Jan 2016, 13:29
Delphi-Quellcode:
//interface-Teil

TMeineKlasse = class
  private
    fBWStellung: Integer;
    procedure setBWStellung(value: Integer);
    function getBWStellung:Integer;
  public
    OnValueChange :TNotifyEvent;
    Property BWStellung :Integer read getBWStellung write SetBWStellung;
  end;

//implementation-Teil

procedure TMeineKlasse.setBWStellung(value: Integer);
begin
  if (fBWStellung = value) then Exit;
  fBWStellung := value;
  if Assigned(OnValueChange) then
    OnValueChange(Self);
end;

function TMeineKlasse.getBWStellung:Integer;
begin
  Result:=fBWStellung;
end;
Hattes du überhaupt den Getter implementiert?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OnChangeValue ?

  Alt 14. Jan 2016, 13:40
Getter ist ja nicht wirklich nötig, außer man will den Zugriff threadsicher machen, oder man muß mehr machen, als nur ein Feld auszulesen.
Delphi-Quellcode:
type
  TMeineKlasse = class//(TComponent)
  private
    FBWStellung: Integer;
    FOnValueChange :TNotifyEvent;
    procedure SetBWStellung(Value: Integer);
  public//published? (vorallem für OnValueChange, wenn man TMeineKlasse im Designer AUF die Form legt)
    Property BWStellung: Integer read FBWStellung write SetBWStellung;
    property OnValueChange: TNotifyEvent read FOnValueChange write FOnValueChange;
  end;

procedure TMeineKlasse.SetBWStellung(Value: Integer);
begin
  if FBWStellung = Value then
   Exit;
  FBWStellung := Value;
  if Assigned(FOnValueChange) then
    FOnValueChange(Self);
end;

Im Thread kannst du nun per TThread.Synchronize oder TThread.Queue dem Property was zuweisen.
Der Thread wertet also die Records aus und setzt die entsprechenden Property und die Klasse kümmert sich um die Notifications.
(mit Queue, wenn der Thread nicht hängen soll, so lange der Hauptthread arbeitet, aber mit Generice/anonymen Methroden geht sowas einfacher)
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
 
#16

AW: OnChangeValue ?

  Alt 14. Jan 2016, 16:05
Hallo
jetzt läuft es durch den Compiler auch durch. Es ist jetzt auch klar warum es immer ein Fehler bei der Compilation gab.

Property BWStellung :Integer read getBWStellung write SetBWStellung; Wenn es in der Zeile das " read getBWstellung" gibt, ist natürlich auch die Funktion
"getBWStellung" notwendig. Ersetzt man dagegen das
read getBWStellung durch read fBWStellung kann man die getFunktion weglassen.

Es ist zwahr jetzt beim Compiler auch durch, aber es gibt leider kein Event beim änderung der BWStellung.

Delphi-Quellcode:
procedure TForm2.OnValueChange;
begin
  StatusBild;
end;
Die Procedur StatusBild wurde gar nicht aufgerufen bei
BWStellung Aenderung.Das konnte ich eindeutig mit dem Debugger feststellen.

Nun eine Frage:
Ich habe versucht nebenbei eine eigene Komponente zu
schreiben. Nun in den Tutorials wird für ein Event Auslösung z.Bsp. ein OnKeyPress genommen und entsprechend geändert.Was ich für mein Problem nicht brauchen kann.
In allen Tutorials die ich gefunden habe,
wurden immer als Beispiel Event von Tasten genommen.
Ist es darum, dass es keine andere WindowsMessage gibt?
Weiss jemand, wie man in eine eigene Komponente ein
Event auslöst für eine Wertänderung ? Oder ist es gar nicht möglich ?

Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: OnChangeValue ?

  Alt 14. Jan 2016, 16:36
Es ist zwahr jetzt beim Compiler auch durch, aber es gibt leider kein Event beim änderung der BWStellung.

Delphi-Quellcode:
procedure TForm2.OnValueChange;
begin
  StatusBild;
end;
Die Procedur StatusBild wurde gar nicht aufgerufen bei
BWStellung Aenderung.Das konnte ich eindeutig mit dem Debugger feststellen.

Nun eine Frage:
Ich habe versucht nebenbei eine eigene Komponente zu
schreiben. Nun in den Tutorials wird für ein Event Auslösung z.Bsp. ein OnKeyPress genommen und entsprechend geändert.Was ich für mein Problem nicht brauchen kann.
Zeige doch bitte mal die Stelle in deinen Quelltext, wo du das schreibst:
Delphi-Quellcode:
DeinVariablenName := TMeineKlasse.Create;
DeinVariablenName.OnValueChange := Form2.OnValueChange
  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: OnChangeValue ?

  Alt 14. Jan 2016, 16:59
Hallo TiGü
Entschuldige, aber mir ist nicht ganz klar welche Stelle in meinem Programm sehen willst ?
Soll ich Dir die ganze Unit senden ?
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#19

AW: OnChangeValue ?

  Alt 14. Jan 2016, 19:24
Das schreibt TiGü doch "laut" und deutlich: Er möchte sehen, wo du eine Instanz deiner neuen Klasse erzeugst. Wenn du eine solche Stelle nicht finden kannst, dann erzeugst du keine Instanz deiner Klasse und kannst auch nicht mit dieser Klasse arbeiten.

Ich würde dir wirklich dringendst emfpehlen, mal das eine oder andere Class-Turorial durchzuarbeiten, denn offenbar verstehst du von dem, was man dir ständig an wertvollen Tips gibt, nicht mal die Hälfte. Diesen Umstand kannst nur du selbst ändern.
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

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

AW: OnChangeValue ?

  Alt 14. Jan 2016, 22:43
Hallo Perlsau

So habe ich die neue Klasse Instanziert, gemäss dem Tutorial :

Delphi-Quellcode:
//====================================================
procedure TForm2.MenueCreate(Sender: TObject);
begin
  keypreview:=true;
  ActiveImage :=Image1;
  Form2.ClientWidth:=512;
  Form2.ClientHeight:=256;
  Form2.Image1.Width:=511;
  Form2.Image1.Height:=255;
  F_obereAchsen:=false;
  F_KeyA := false;
  MeineKlasse :=TMeineKlasse.Create;
  //MeineKlasse.fBWStellung.OnvalueChange := Form2.OnValueChange;
  //MeineKlasse.fBWStellung.OnvalueChange := OnValueChange;
  //MeineKlasse.OnvalueChange := OnValueChange;
  //MeineKlasse.OnvalueChange := Form2.OnValueChange;
  //fBWStellung := Form2.OnValueChange;
  //fBWStellung := OnValueChange;
  // das frisst der Compiler nicht..
end;
Genügt das nicht ?
Ich meinte wenn die neue Klasse instanziert ist, sind auch die drin deklarierte Proceduren bekannt, oder nicht ?
Muss man die OnValueChange noch zusätzlich deklarieren ? das habe ich probiert, aber das schluckt der Compiler nicht.
Ich habe den verdammten Tutorial von vorne und zurück
heute nachmittag sicher 5 mal durchgelesen aber die Verwirrung
wird nur noch grösser.
Gruss Anton
Anton Kurka
  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 22:14 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