![]() |
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 ... |
AW: OnChangeValue ?
Habe ich das jetzt so verstanden, dass
Delphi-Quellcode:
irgendwo außerhalb gesetzt wird und man auf die Änderung dieses Speicherbereiches reagieren will? Das kann mit der Lösung von Perlsau nicht funktionieren.
STATUS.CNC.ZBETR
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. |
AW: OnChangeValue ?
Hallo mitenand
Beitrag von Perlsau: Zitat:
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:
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 |
AW: OnChangeValue ?
Delphi-Quellcode:
Hattes du überhaupt den Getter implementiert?
//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; |
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) |
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:
Wenn es in der Zeile das " read getBWstellung" gibt, ist natürlich auch die Funktion
Property BWStellung :Integer read getBWStellung write SetBWStellung;
"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:
Die Procedur StatusBild wurde gar nicht aufgerufen bei
procedure TForm2.OnValueChange;
begin StatusBild; end; 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 |
AW: OnChangeValue ?
Zitat:
Delphi-Quellcode:
DeinVariablenName := TMeineKlasse.Create;
DeinVariablenName.OnValueChange := Form2.OnValueChange |
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 |
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. |
AW: OnChangeValue ?
Hallo Perlsau
So habe ich die neue Klasse Instanziert, gemäss dem Tutorial :
Delphi-Quellcode:
Genügt das nicht ?
//====================================================
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; 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 19:22 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 by Thomas Breitkreuz