Ereigniss zeitweise deaktivieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 434
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Ereigniss zeitweise deaktivieren

Beitrag von DL3AD »

Hallo,

ich habe eine Ereignissprocedure wie z.B. diese

Code: Alles auswählen

procedure TForm1.FloatSpinEdit1Change(Sender: TObject);
begin
  machwas;
end;         


Nun möchte das Value des FloatSpinEdit1 ändern ohne das Ereigniss Change zu feuern.
Wie kann ich dass Ereigniss zeitweise deaktivieren ?

Gruß Frank

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Ereigniss zeitweise deaktivieren

Beitrag von baumina »

Du könntest es folgendermaßen machen:

Code: Alles auswählen

FloatSpinEdit1.OnChange := Nil; // deaktivieren
FloatSpinEdit1.OnChange := FloatSpinEdit1Change; // aktivieren
.

DL3AD
Beiträge: 434
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Ereigniss zeitweise deaktivieren

Beitrag von DL3AD »

... dass Abschalten funktioniert aber bei

Code: Alles auswählen

FloatSpinEdit1.OnChange := FloatSpinEdit1Change; // aktivieren


sagt er "Wrong numer of parameters specified for call to FloatSpinEdit1Change" :shock:

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Ereigniss zeitweise deaktivieren

Beitrag von baumina »

Auf Nil setzen heißt, ab jetzt springt er nicht mehr in die Routine wenn das Ereignis OnChange kommt. Wieder zuweisen heißt von diesem Zeitpunkt ab, springt er beim Ereignis OnChange wieder in die Routine. Das aktivieren bzw. deaktivieren darf natürlich nicht innerhalb der OnChange-Routine stattfinden.
.

Michl
Beiträge: 2335
Registriert: Di 19. Jun 2012, 12:54

Re: Ereigniss zeitweise deaktivieren

Beitrag von Michl »

mode Delphi:

Code: Alles auswählen

{$mode delphi} 
...
FloatSpinEdit1.OnChange := Nil; // deaktivieren
FloatSpinEdit1.OnChange := FloatSpinEdit1Change; // aktivieren
 

mode Objektpascal:

Code: Alles auswählen

{$mode objfpc}{$H+} 
...
FloatSpinEdit1.OnChange := Nil; // deaktivieren
FloatSpinEdit1.OnChange := @FloatSpinEdit1Change; // aktivieren
 

Bitte das "@" beachten!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

DL3AD
Beiträge: 434
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Ereigniss zeitweise deaktivieren

Beitrag von DL3AD »

... Danke dass @ war es :)

Flenser
Beiträge: 23
Registriert: Di 28. Okt 2014, 12:49

Re: Ereigniss zeitweise deaktivieren

Beitrag von Flenser »

Gibt es eine Möglichkeit, das Auslösen von Ereignissen für alle Komponenten zu unterbinden, ohne dass man für jede Komponente die festgelegte Ereignisprozedur zurück- und neusetzen muss?

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Ereigniss zeitweise deaktivieren

Beitrag von Warf »

Flenser hat geschrieben:Gibt es eine Möglichkeit, das Auslösen von Ereignissen für alle Komponenten zu unterbinden, ohne dass man für jede Komponente die festgelegte Ereignisprozedur zurück- und neusetzen muss?


Ja, du iterierst über jede Komponente, über jede Property (RTTI). Wenn die Property mit On... anfängt, speicherst du den Inhalt in einer Map und setzt es auf nil.
Zum reaktivieren einfach wieder drüber iterieren und den originalwert wieder herstellen.

Aber, hast du mal .enabled versucht? ich glaub es können keine events gefeurt werden während enabled auf false steht

Antworten