![]() |
AW: TList<>.OnBefore?
Zitat:
In Delphi Seattle geht die gesamte Klassendefinition von Zeile 340 bis Zeile 450. Die öffentlichen Methoden von 369 bis 425 mit vielen Leerzeilen dazwischen, die fünf Propertys und ggf. der Enumerator kommen noch dazu. Aber soooviel zu wrappen ist es auch nicht, wenn man unbedingt noch die Prüfung im Add, Insert und AddRange braucht. |
AW: TList<>.OnBefore?
Mit dem Helper und allem drum und dran geht es bei Zeile 20 los, aber OK, nur TList<> sind dennoch 100 Zeilen (330 bis 440)
Alleine der ListHelper von 70 bis 330 und die Events werden in jeder dessen Methode einzeln aufgerufen. |
AW: TList<>.OnBefore?
Zitat:
Zitat:
|
AW: TList<>.OnBefore?
Muss man denn auch den ganzen ListHelper nachstellen?
Ich dachte eher an sowas:
Delphi-Quellcode:
Zugegeben, das wird bei Insert/AddRange() etwas fricklig, aber sonst?
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Generics.Collections; type THimiBeforeNotifyEvent<T> = reference to function(Sender: TObject; const Item: T): Boolean; THimiList<T> = class strict private FList: TList<T>; FOnBeforeNotify: THimiBeforeNotifyEvent<T>; public constructor Create; destructor Destroy; override; function Add(const Value: T): Integer; {$IFDEF Release} inline; {$ENDIF} property OnBeforeNotify: THimiBeforeNotifyEvent<T> read FOnBeforeNotify write FOnBeforeNotify; end; constructor THimiList<T>.Create; begin inherited; FList := TList<T>.Create; end; destructor THimiList<T>.Destroy; begin FList.Free; inherited; end; function THimiList<T>.Add(const Value: T): Integer; begin Result := 0; if Assigned(FOnBeforeNotify) then begin if FOnBeforeNotify(Self, Value) then begin Result := FList.Add(Value); end; end; end; procedure Main; var HimiList: THimiList<Integer>; begin HimiList := THimiList<Integer>.Create; HimiList.OnBeforeNotify := function(Sender: TObject; const Item: Integer): Boolean begin Result := (Item mod 2) = 0; end; try HimiList.Add(1); HimiList.Add(2); HimiList.Add(3); HimiList.Add(4); finally HimiList.Free; end; end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: TList<>.OnBefore?
Zitat:
Zitat:
![]() Wenn ich eine Liste benötige, bei der ich kontrollieren muss, was rein darf und was nicht, schreibe ich mir eine entsprechende Klasse. Die Liste (bzw. allgemein: eine Klasse) mit virtuellen Methoden zu überladen und damit komplex und schwerfällig zu machen, kann es doch nicht sein. Denn es bliebe ja nicht beim OnBefore, sondern... OnAfter? OnDelete? OAfterDelete? etc. Was ist, wenn ich ein Listenelement einfach update und damit die Validierumg im 'OnBefore' aushebeln kann? |
AW: TList<>.OnBefore?
Zitat:
Man hat nur Add erweitert (siehe oben), dann benutzt wer Insert und schon war es das. Selbt List ist geil, da dynamische Arrays ein (defektes) Speichermanagement besitzen und dieses Property somit nicht ReadOnly ist. |
AW: TList<>.OnBefore?
Jetzt weißt du auch warum Composition und nicht Inheritence :stupid:
|
AW: TList<>.OnBefore?
Wieso gibt es eigentlich kein
Delphi-Quellcode:
? Das ist doch eigentlich die Grundvoraussetzung für die erfolgreiche Verwendung bzw. nachträglichen Einsatz eines Composite? Kein Wunder, das so viele Delphianer immer noch auf Ableitungen setzen, man wird ja förmlich dazu gezwungen.
IList<T>
|
AW: TList<>.OnBefore?
Eben darüber habe ich mich in den ersten Delphi-Tagen auch gewundert. Nicht nur ich, sondern da wundern sich bis heute glaube ich eine Menge Leute drüber.
Man muss sich dann eben nicht an das mitgelieferte, sondern irgendein 3rd Party Framework für IEnumerable<T> <-- IList<T> usw. verwenden. |
AW: TList<>.OnBefore?
Warum?
Weil sich Generics und Interfaces nicht sonderlich doll mögen. Composition: Aber dann beschneide ich doch den Endbenutzer, außer ich kaufe mir jedes Jahr das neue Bugfix (Delphi) und erweitere mühsam den Code, der eigentlich aus nur einer überschriebenen Methode (oder Event) bestanden hätte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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-2025 by Thomas Breitkreuz