![]() |
OnChangeValue ?
Hallo
Ich suche eine Komponente die bei ànderung einer Variable (Externe Eingangswert) einen Event auslöst. Etwa in der Art : OnChangeValue. Ich habe überall danach gesucht aber niergens gefunden. Muss ich dann eine eigene Komponente schreiben ? |
AW: OnChangeValue ?
Mach das doch mit einer Property dessen Setter-Methode ein "OnChange"-Event auslöst:
Delphi-Quellcode:
TMeineKlasse = class
private var FMeinWert: Integer; procedure setMeinWert(const value: Integer); public var OnValueChange: TNotifyEvent; property MeinWert: Integer read FMeinWert write setMeinWert; end; procedure TMeineKlasse.setMeinWert(const value: Integer); begin if (FMeinWert = value) then Exit; FMeinWert := value; if Assigned(OnValueChange) then OnValueChange(self); end; |
AW: OnChangeValue ?
Zur Ergänzung: Man schreibt sich dann eine Ereignisbehandlung, z.B.:
Delphi-Quellcode:
und weist z.B. im OnCreate oder im OnShow der Form dem Ereignis diese Methode zu:
procedure TFormMain.ExternValueChanged;
begin DoSomething; end;
Delphi-Quellcode:
Wird das Ereignis in einer anderen Unit bzw. Form ausgelöst, muß man darauf achten, daß diese andere Form bereits instaziiert wurde. Wird sie erst nach der Unit/Form, in der die Ereignisbehandlung steht, erzeugt, wählt man für die Zuweisung der Ereignisbehandlung zum Ereignis z.B. OnShow oder OnActivate statt OnCreate.
procedure TFormMain.FormCreate(Sender: TObject);
begin OnValueChange := ExternValueChanged; end; |
AW: OnChangeValue ?
Hallo, danke für die beiden Beiträge.
Was den Setter anbelangt verstehe ich es nicht ganz, der Wert den ich überwachen will kommt von aussen, d.h es wird in meinem Programm gar nicht verändert resp. gesetzt. Im meinem Programm wird das Wert nur gelesen. Ich meinte Setter bedeutet setzen eines bestehenden Wertes und wenn es ungültig ist dann eine Exception auslösen. Verstehe ich es falsch ?? Beim zweitem Vorschlag was meinst Du mit DoSomething ? Sollte da ein Vergleich zwischen AltWert und NeuWert statfinden ? Aber wie soll daraus ein Event erzeugt werden ? |
AW: OnChangeValue ?
Zitat:
Delphi-Quellcode:
procedure TFormMain.DoSomething;
Var i : integer begin for i := 0 to 999999 do begin beep; Sleep(1000); end; end; |
AW: OnChangeValue ?
Zitat:
Delphi-Quellcode:
Das ist die Art & Weise, wie man Properties erstellt. Drückst du nun in der Zeile, in der das Property deklariert wird, die Tastenkombination Shift-Control-C, werden automatisch die beiden Methoden Getter und Setter erstellt. Nun kannst du "von außen" die Variable fMeinWert nur noch auf dem Weg über das Property ändern:
Private
fMeinWert : Integer; Public Property MeinWert : Integer read GetfMeinWert write SetfMeinWert;
Delphi-Quellcode:
Beim Setzen und Auslesen von MeinWert werden jetzt immer Setter und Getter des Properties aufgerufen. Hier kannst du dann z.B. das reinschreiben, was passieren soll, wenn sich die Variable ändert, also im Setter nach der Zuweisung DoSomeThing.
// Wert setzen
MeinWert := 65; //oder MeinWert := AusgelesenerWert; // Wert auslesen MeineVariable := MeinWert; Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Ausgelöst wird das Ereignis dann durch diesen Befehl:
TYPE
TUpdateStatusbarEvent = Procedure of Object; // Statusbar in Mainform TYPE TDatMod = CLASS(TDataModule) ... PRIVATE { Private-Deklarationen } Var fUpdateStatusbar : TUpdateStatusbarEvent; ... PUBLIC { Public-Deklarationen } ... Property OnUpdateStatusbar : TUpdateStatusbarEvent read fUpdateStatusbar write fUpdateStatusbar; ... END;
Delphi-Quellcode:
Verbindest du nun in deiner Unit, in der die Reaktions-Methode steht, das Ereignis mit der Methode, wird diese Methode jedesmal aufgerufen, wenn das Ereignis stattfindet – oder wie man hier gewöhnlich sagt: wenn das Event feuert:
If Assigned(fUpdateStatusbar) Then fUpdateStatusbar;
Delphi-Quellcode:
Ich setze dieses Event z.B. ein, um in der Mainform die Statusbar zu aktualisieren, wenn sich der Datensatzzeiger einer Tabelle geändert hat:
Procedure TFormMain.FormActivate(Sender: TObject);
begin ... DatMod.OnUpdateStatusbar := StatusBarAktuell; ... end;
Delphi-Quellcode:
Damit wird nun jedesmal beim Scrollen einer Datenmenge, die z.B. in FormMain durch das Scrollen in einem DBGrid ausgelöst wurde, die Anzeige in der Methode StatusBarAktuell aktualisiert:
Procedure TDatMod.View_LogAccessAfterScroll(DataSet: TDataSet);
begin If Assigned(fUpdateStatusbar) Then fUpdateStatusbar; end;
Delphi-Quellcode:
Solltest du entgegen meiner Erwartung nur Bahnhof verstehen, empfiehlt sich die Lektüre des einen oder anderen Tutorials, z.B. das beim
Procedure TFormMain.StatusBarAktuell;
begin StatBar.Panels[0].Text := GLD.IntToStrPunkte(DatMod.View_LogAccess.RecNo); StatBar.Panels[1].Text := GLD.IntToStrPunkte(DatMod.View_LogAccess.FieldByName('ID').AsInteger); StatBar.Panels[2].Text := DatMod.View_LogAccess.FieldByName('DATEI').AsString; Application.ProcessMessages; end; ![]() |
AW: OnChangeValue ?
Hallo
Vielen vielen Dank für die ausführliche Erklärung. Es ist sehr gut erklärt, soweit habe ich es verstanden. Ich hatte die überwachte Werte bisher über mehrere Timer überwacht was im prinzip einem Polling gleichkommt, und natürlich auch dem Windows Prinzip wiederspricht. Jetzt werde ich mein Programm entsprechend umstellen, ich schreibe Dir dann ob es klappt. Besten Dank und ein Gruss aus dem Wolkenverhangenem Engadin Anton |
AW: OnChangeValue ?
Hallo Perlsau
Leider klappt es bereits bei der Deklaration nicht :
Delphi-Quellcode:
Bei der Compilation gibt es diese Meldung:
unit menueREF;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, NC__09,NC__08,NCAS09,NCKU00,NCKU09; type TForm2 = class(TForm) Image1: TImage; procedure MenueCreate(Sender: TObject); procedure StatusBild; procedure Man; procedure MenueDestroy(Sender: TObject); procedure OnKeyPress(Sender: TObject; var Key: Char); private fBWStellung: Integer; { Private-Deklarationen } public Property BWStellung :Integer read GetfBWStellung write SetfBWStellung; { Public-Deklarationen } end; var Form2: TForm2; ActiveImage :TImage; BWStellung := int(Status.CNC.ZBETR); //Status.CNC.ZBETR ist Byte F_KeyA :boolean; procedure OptionFehlt; implementation {$R *.dfm} uses NCUP01,NCUP10,NCUP11,NCUP12,NCUP13; //===================================================== procedure TForm2.MenueCreate(Sender: TObject); begin keypreview:=true; usw..... [Fehler] menueREF.pas(22): Feld- oder Methodenbezeichner erwartet Eigentlich ist der zu überwachende Wert ein Byte (STATUS.CNC.ZBETR). Ich habe es zuerst mit Byte probiert danach auch mit integer. Es wird ein Feld verlangt also z.Bsp ein String Muss ich meine Variable als String deklarieren d.h. Feld? oder liegt sm am DELPHI7 dass es nicht schluckt ? Gruss Anton |
AW: OnChangeValue ?
Ich sehe in deinem Code keine Getter- und Setter-Methoden. Die erzeugst du, wie ich oben bereits ausgeführt habe, indem du den Cursor auf die Zeile mit der Property-Deklaration setzt und die Tastenkombi Ctrl-Shift-C drückst. In den Setter schreibst du dann rein, was passieren soll, wenn der Wert gesetzt wird.
Hinweis: Eine Anleitung sollte man schon komplett ausführen, weil sonst Fehlermeldungen auftreten. |
AW: OnChangeValue ?
Hallo Perlsau
Tut mir leid dass ich Dich nochmal beanspruche aber es haut nicht. Muss man für die Setter Deklaration immer eigene Klasse deklarieren oder kann ich auch bestehende nehmen ? Ich habe beides probiert aber ohne Erfolg. Was mache ich falsch ?
Delphi-Quellcode:
die Fehler Meldung ist die gleiche :
unit menueREF;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, NC__09,NC__08,NCAS09,NCKU00,NCKU09; type TForm2 = class(TForm) Image1: TImage; procedure MenueCreate(Sender: TObject); procedure OnValueChange; procedure StatusBild; procedure Man; procedure MenueDestroy(Sender: TObject); procedure OnKeyPress(Sender: TObject; var Key: Char); private //fBWStellung: Integer; //procedure setBWStellung(const value: Integer); { Private-Deklarationen } public //OnValueChange :TNotifyEvent; //Property BWStellung :Integer read GetfBWStellung write SetfBWStellung; { Public-Deklarationen } end; TMeineKlasse = class private fBWStellung: Integer; procedure setBWStellung(const value: Integer); public OnValueChange :TNotifyEvent; Property BWStellung :Integer read getfBWStellung write SetfBWStellung; end; var Form2: TForm2; ActiveImage :TImage; F_KeyA :boolean; procedure OptionFehlt; implementation {$R *.dfm} uses NCUP01,NCUP10,NCUP11,NCUP12,NCUP13; //===================================================== //procedure TForm2.setBWStellung(const value: Integer); procedure TMeineKlasse.setBWStellung(const value: Integer); begin if (fBWStellung = value) then Exit; fBWStellung := value; if Assigned(OnValueChange) then OnValueChange(Self); end; //------------------------------------------------- procedure TForm2.OnValueChange; begin StatusBild; end; //==================================================== procedure TForm2.MenueCreate(Sender: TObject); begin keypreview:=true; //BWStellung := int(Status.CNC.ZBETR); ActiveImage :=Image1; Form2.ClientWidth:=512; Form2.ClientHeight:=256; Form2.Image1.Width:=511; Form2.Image1.Height:=255; F_obereAchsen:=false; F_KeyA := false; end; //===================================================== procedure TForm2.MenueDestroy(Sender: TObject); [Fehler] menueREF.pas(35): Feld- oder Methodenbezeichner erwartet Gruss Anton |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 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