AW: on[XYZ]-Methoden: Nicht aufrufen wenn Programmcode die Komponente ändert
Um auch mal meinen Mist dazu zu geben, obwohl schon alles gesagt ist
Zitat:
"in der Logik"
Delphi-Quellcode:
"in der GUI"
//Feststellen, dass etwas in der GUI geändert werden muss
GUI.DoNotTriggerEvents := True; //Änderungen in der GUI vornehmen GUI.DoNotTriggerEvents := False;
Delphi-Quellcode:
private
FDoNotTriggerEvents : Boolean; public property DoNotTriggerEvents ... [...] if Assigned(OnRadioGroupClick) and (not FDoNotTriggerEvents) then OnRadioGroupClick(...); |
AW: on[XYZ]-Methoden: Nicht aufrufen wenn Programmcode die Komponente ändert
Ich persönlich glaube, das diese Problematik nur dann* auftritt, wenn man das VM-Muster (Viewmodel) nicht umsetzt.
Wegen der -bei korrektem Design- 1:1 Zuordnung von VM-Property und GUI-Control sollte bzw. muß dann imho jede Änderung des Controlzustandes (z.B. Setzen vom ItemIndex) die entsprechende Kaskade von OnXXXX-Ereignisaufrufen nach sich ziehen. Zitat:
Delphi-Quellcode:
Einzige Ausnahme: Eine Double-Property verweigert gerne einmal den Endlosschleifenshowstopper
Procedure TMyViewModel.SetMyProperty (Const Value : TSomeType)
begin if Value = MyProperty Then exit; fMyProperty := Value; RaiseOnChaingeMyPropertyEvent; end;
Delphi-Quellcode:
wegen den bekannten Double-Gleichheits-Problematiken.
If Value = MyValue then Exit
Wie gesagt: Man kann sämtliche Fallstricke und Performancebremsen durch saubere Programmierung des Viewmodels eliminieren, meiner Meinung nach. Zitat:
Besser:
Delphi-Quellcode:
Man sollte i.A. auf Flags à la 'NotXXX' verzichten, weil das Hirn beim Lesen mit solchen Verneinungen meist nicht so gut klar kommt. Hier ist das allerdings ok, denn das Flag definiert die Ausnahme von der Regel. Vielleicht wäre jedoch 'SurpressTrigger' ein besserer Name (gleiche Bedeutung, keine Verneinung).
if Assigned(OnRadioGroupClick) and FTriggerEvents then // Logik umkehren
OnRadioGroupClick(...); // Oder if FDoNotTriggerEvents then exit; // Lesbarkeit erhöhen if Assigned(OnRadioGroupClick) then OnRadioGroupClick(...); |
AW: on[XYZ]-Methoden: Nicht aufrufen wenn Programmcode die Komponente ändert
Zitat:
|
AW: on[XYZ]-Methoden: Nicht aufrufen wenn Programmcode die Komponente ändert
Zitat:
|
AW: on[XYZ]-Methoden: Nicht aufrufen wenn Programmcode die Komponente ändert
Zitat:
Delphi-Quellcode:
und nicht
If Value=fMyProperty then...
Delphi-Quellcode:
, deshalb also der explizite Hinweis. Ich hätte den Hinweis auch auf Objekte erweitern können, aber das habe ich mir geschenkt. Da bei Double-Werten jedoch hin und wieder noch die Frage aufkommt, wieso '=' nicht funktioniert, habe ich das dann kurz und knapp angerissen. Bei Erwähnung von 'SameValue' hätte ich ausholen müssen, bei Weglassen meines knappen Zusatzes wäre ein ganz Schlauer auf die Idee gekommen, mich auf die Double-Problematik hinzuweisen, also habe ich wirklich gedacht, der kurze Hinweis reicht. Tut er wohl nicht.
If SameValue(fMyProperty,Value) then...
Zitat:
Oder meinst Du mit 'VCL-Entwicklern' Entwickler, die mit der VCL entwickeln? Wenn Sie unter deiner Leitung arbeiten, dann chleudere die Purchen su Poden. Arbeiten sie nicht mit/für Dich, dann... Pech gehabt und weiter den linken Schuh ausziehen (aka den Messias spielen). Leider gibt es hier in der DP kein Dojo, wo man sich mit solchen Implementierungen auseinandersetzen und robuste Pattern entwickeln kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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