Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

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)

Perlsau 13. Jan 2016 20:34

AW: OnChangeValue ?
 
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 ...

Dejan Vu 14. Jan 2016 06:17

AW: OnChangeValue ?
 
Habe ich das jetzt so verstanden, dass
Delphi-Quellcode:
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.

akurka 14. Jan 2016 11:02

AW: OnChangeValue ?
 
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

Jumpy 14. Jan 2016 13:29

AW: OnChangeValue ?
 
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?

himitsu 14. Jan 2016 13:40

AW: OnChangeValue ?
 
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)

akurka 14. Jan 2016 16:05

AW: OnChangeValue ?
 
Hallo
jetzt läuft es durch den Compiler auch durch. Es ist jetzt auch klar warum es immer ein Fehler bei der Compilation gab.

Delphi-Quellcode:
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

TiGü 14. Jan 2016 16:36

AW: OnChangeValue ?
 
Zitat:

Zitat von akurka (Beitrag 1327059)
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

akurka 14. Jan 2016 16:59

AW: OnChangeValue ?
 
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

Perlsau 14. Jan 2016 19:24

AW: OnChangeValue ?
 
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.

akurka 14. Jan 2016 22:43

AW: OnChangeValue ?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 Uhr.
Seite 2 von 5     12 34     Letzte »    

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