Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi eine Art onchange für Variabeln? (https://www.delphipraxis.net/132247-eine-art-onchange-fuer-variabeln.html)

buster55 8. Apr 2009 15:24


eine Art onchange für Variabeln?
 
Meine Frage ist recht simpel, gibt es eine Möglichkeit direkt auf eine Veränderung einer Variabel zu reagieren.
Natürlich kann ich auch eine Schleife machen die das fortwährend abfragt, das macht die ganze Sache aber ein wenig langsam.


greetz
buster

mleyen 8. Apr 2009 15:25

Re: eine Art onchnage für Variabeln?
 
Such mal nach dem Stichwort Hier im Forum suchenProperty.
Dies ist ziemlich elegant gelöst mit Getter und Setter-Methoden.

Hier noch ein kleines Beispiel:

Delphi-Quellcode:
property Foo: Boolean read getFFoo write setFFoo;

DeddyH 8. Apr 2009 15:26

Re: eine Art onchnage für Variabeln?
 
Du könntest statt einer Variablen eine Property einer Klasse verwenden. Da könntest Du dann eine Setter-Methode implementieren.

buster55 8. Apr 2009 15:52

Re: eine Art onchange für Variabeln?
 
mmh danke erstmal da kommen wir der sache schon näher :D
Ich geh mal davon aus, dass getFFoo ne Funktion ist und setFFoo ne procedure (oder?)

Ich habe eigetnlich nur vor ne simple Integer Variable u 'überwachen' und wenn sie unter 0 ist untsprechen darauf zu reagieren (0 setzen).
Könntest du mir bitte ein konkreteres Bsp. liefern,habe nämlich noch nicht viel mit properties zu tun gehabt, wäre sehr nett :angel2:

Luckie 8. Apr 2009 15:53

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
Natürlich kann ich auch eine Schleife machen die das fortwährend abfragt, das macht die ganze Sache aber ein wenig langsam.

Das ist doch Blödsinn. Eine Variable ändert sich nur durch eine Zuweisung im Code und dann weißt du auch wann sie sich geändert hat. Du musst also nicht ständig den Zustand der Variablen überprüfen.

buster55 8. Apr 2009 15:57

Re: eine Art onchange für Variabeln?
 
Zitat:

Eine Variable ändert sich nur durch eine Zuweisung im Code und dann weißt du auch wann sie sich geändert hat
nicht wenn der Benutzer darauf Einfluss hat, dann weiß man zwar wann sie sich ändern könnte aber nicht wann sie konkret einen Wert annimmt, schon gar nicht wenn die Variabel von einer Dritten Quelle gelesen wird.

khh 8. Apr 2009 15:59

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von Luckie
Das ist doch Blödsinn. Eine Variable ändert sich nur durch eine Zuweisung im Code

richtig,
die Frage ist ja auch, wer oder was verändert die Variable ?

khh 8. Apr 2009 16:00

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
nicht wenn der Benutzer darauf Einfluss hat, dann weiß man zwar wann sie sich ändern könnte aber nicht wann sie konkret einen Wert annimmt, schon gar nicht wenn die Variabel von einer Dritten Quelle gelesen wird.

das solltes du schon etwas näher erklären

Andreas L. 8. Apr 2009 16:02

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
Zitat:

Eine Variable ändert sich nur durch eine Zuweisung im Code und dann weißt du auch wann sie sich geändert hat
nicht wenn der Benutzer darauf Einfluss hat, dann weiß man zwar wann sie sich ändern könnte aber nicht wann sie konkret einen Wert annimmt, schon gar nicht wenn die Variabel von einer Dritten Quelle gelesen wird.

Ich denke da ist dein Anwendungsdesign aber ziemlich suboptimal :wink:

Wenn dennnoch "benachrichtigt" werden willst, kannst du so eine Eigenschaft ganz einfach ins Form implementieren.

Delphi-Quellcode:
type
  TForm1= class(TForm)
  private
    FMeineIntegerVar: Integer;
  protected
    procedure SetmeineIntegerVar(Value: integer);
  published
    property MeineIntegerBar: integer read FMeineIntegerVar write SetMeineIntegerVar;    

...
...

procedure TForm1.SetmeineIntegerVar(Value: Integer);
begin
  if Value <= 0 then
    ShowMessage('Größeren Wert als 0 eingeben!')
  else
    FMeineIntegerBar := Value;
end;

jfheins 8. Apr 2009 16:05

Re: eine Art onchange für Variabeln?
 
Ich hätte da mal was:

Delphi-Quellcode:
TOnChangeNotifier = class
private
  FValue: Integer;
protected
  procedure SetValue(x: Integer);
public
  property Value read FValue write SetValue;
end;

implementation

procedure TOnChangeNotifier.SetValue(x: Integer);
begin
  if x >= 0 then
    FValue := x;
  else
    raise ERangeError.Create();

{
// Alternativ:
 if x >= 0 then
    FValue := x;
  else
    FValue := 0;
}
end;
Das OnChange-Event kann man bei Bedarf ja noch hinzufügen ;)

buster55 8. Apr 2009 16:07

Re: eine Art onchange für Variabeln?
 
dies macht eie dritte Quelle, auf die man keinen Einfluss hat, um genau zu sein die Anzahl der austehenden Druchaufträge, aber das tut denke ich nichts zur Sache solange sie korrekt ausgelesen werden.

Andreas L. 8. Apr 2009 16:09

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
dies macht eie dritte Quelle, auf die man keinen Einfluss hat, um genau zu sein die Anzahl der austehenden Druchaufträge, aber das tut denke ich nichts zur Sache solange sie korrekt ausgelesen werden.

Und da wo du ausliest kannst du auch die Variable abfragen, oder?

Delphi-Quellcode:
MeineVar := GetDruckaufträge;
if MeineVar = 0 then
....

buster55 8. Apr 2009 16:10

Re: eine Art onchange für Variabeln?
 
richtig aber ich will sie ja nicht nur überprüfen wenn sie ausgelesen wird sondern fortwährend

Andreas L. 8. Apr 2009 16:12

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
richtig aber ich will sie ja nicht nur überprüfen wenn sie ausgelesen wird sondern fortwährend

Aber die Variable verändert sich doch nur wenn du die Druckaufträge ausliest?!? Naja, dann halt QuickAndDirty mit einem Timer oder der Methode von jfheins.

DeddyH 8. Apr 2009 16:13

Re: eine Art onchange für Variabeln?
 
Dann setz doch die geposteten Beispiele einfach um, Unsinn oder nicht.

khh 8. Apr 2009 16:14

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
richtig aber ich will sie ja nicht nur überprüfen wenn sie ausgelesen wird sondern fortwährend

ich verstehe nicht ganz, was du willst.

Wenn du sie andauernd prüfen möchtest musst du sie doch auch andauernd neu übernehmen?

in dem Moment wo du die Variable übernimmst kannst du sie prüfen.

DeddyH 8. Apr 2009 16:16

Re: eine Art onchange für Variabeln?
 
Wenn man das aber an 100 Stellen im Code macht, ist eine Property IMHO die bessere Wahl, da man an zentraler Stelle reagieren kann ;)

Luckie 8. Apr 2009 16:19

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
richtig aber ich will sie ja nicht nur überprüfen wenn sie ausgelesen wird sondern fortwährend

Noch mal, eine Varaible ändert sich nicht aus heiterem Himmel, sondern nur, wenn ihr ein neuer Wert zugewiesen wird. Und dann weißt du ganz genau, wann sie sich geändert hat, nämlich nach der Zuweisung und dann kannst du ihren Zustand abfragen. Geschiet dies mehr mals im Quellcode, ist, wie schon gesagt wurde, eine Property mit Setter sinnvoll, da man dann eine zentrale Stelle im Code hat.

Gib mal ein Beispiel, wo du meinst nicht mitzubekommen, wann sich der Wert der Varaiblen ändert.

mjustin 8. Apr 2009 16:39

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
Meine Frage ist recht simpel, gibt es eine Möglichkeit direkt auf eine Veränderung einer Variabel zu reagieren.
Natürlich kann ich auch eine Schleife machen die das fortwährend abfragt, das macht die ganze Sache aber ein wenig langsam.


greetz
buster

Ist es eine eigene Variable oder eine 'fremde'? Die Anzahl Druckaufträge könnte ja eine Variable sein, die man nur abfragen kann, und keine Möglichkeit bietet, ein 'PropertyChangeEvent' in Form einer Setter-Methode daranzupappen.

'Fremd' ist alles, was z.B. ohne Sourcecode vorliegt (oder in Sourcen steht die man nicht ändern darf).

stoxx 8. Apr 2009 17:13

Re: eine Art onchange für Variabeln?
 
Zitat:

Noch mal, eine Varaible ändert sich nicht aus heiterem Himmel, sondern nur, wenn ihr ein neuer Wert zugewiesen
Luckie hat nur halb gelesen ..


wenn Du benachrichtig werden willst, kannst Du mal gucken, ob das Windows nicht vielleicht schon selber macht und es eine API Funktion dafür gibt. (da es ja wohl um Druckaufträge ging? ) Ansonsten müsstest du Dir eine Klasse schreiben, die eben wirklich ständig prüft und ein Event generiert, wenn sich die Zahl ändert.
in eine Liste könntest alle Events eintragen, wenn sich mehrere Objecte benachrichtigen lassen wollen.
Event Multicaster müsstest Du da basteln .. .NET kann das schon von Haus aus.
In Delphi selber basteln.

Oder such mal nach Observer Pattern .. wobei das in der Grundidee quatsch ist, weil Multicast Events völlig ausreichend sind und man da nicht von einer speziellen Klasse abgeleitet sein muss ..

kommt halt drauf an, wie groß das Projekt ist, bei einem 5 Minutenprojekt reicht sichherlich ein Timer, der ab und zu mal prüft :)

jaenicke 8. Apr 2009 19:08

Re: eine Art onchange für Variabeln?
 
Zitat:

Zitat von buster55
dies macht eie dritte Quelle, auf die man keinen Einfluss hat, um genau zu sein die Anzahl der austehenden Druchaufträge, aber das tut denke ich nichts zur Sache solange sie korrekt ausgelesen werden.

Wie liest du die denn aus? Ist das eine API-Funktion, wenn ja welche? Das weiß ich aus dem Kopf nämlich nicht, aber wenn du das direkt über die Windows API machst, dann kann man an der Stelle in der Dokumentation schauen was es da noch gibt.

Medium 8. Apr 2009 21:09

Re: eine Art onchange für Variabeln?
 
Für gewöhnlich kann man sich bei API Klamotten entweder eine Callback-Prozedur registrieren, oder aber es gibt Messages.

Was es nicht gibt ist, dass ein drittes Programm eine DEINER selbst deklarierten Variablen in DEINEM Adressraum ohne DEIN Zutun ändert. Es sei denn dieses Programm zielt eben darauf ab, aber dann würd' ich es mir so schnell es geht vom Leibe schaffen. Die WinAPI tut sowas jedenfalls nicht.

Aber bevor wir hier weiter rumraten erzähl uns doch bitte endlich womit du da arbeitest. Das hätte schon in den 1. Beitrag gehört, und du hättest vermutlich schon längst eine passende Antwort gehabt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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