Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
4. Apr 2021
Die Idee hinter der Message ist ja gerade, dass der Sender nicht weiß, ob und wie diese Message vom Empfänger behandelt wird. Die Default-Implementierung in TObject macht einfach gar nichts. Solange also deine alternativen ParentObject-Instanzen keine Message mit der Message-ID cNotifyChanged implementieren kannst du den Aufruf ruhig auf alles loslassen.
Der Grund für diesen Ansatz war ja...
Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
4. Apr 2021
Wie lange programmierst du nun schon in Delphi und dann kommt immer noch sowas dabei heraus :shock:
var
lNamen: TNamen;
begin
lNamen.Create;
try
lNamen.Namen := 'NameOnly';
finally
lNamen.Free;
Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
3. Apr 2021
Ja, stimmt. Der generische Part der TObjectList<T> geht damit verloren. Wenn du das nicht nachbilden und trotzdem bei dem Ansatz mit dem ParentObject bleiben willst, kannst du entweder den HardCast auf TObjectList<TBase> vom Anfang machen oder über über ein OnChanged-Event oder ein Interface arbeiten.
Eine ganz andere Alternative wäre auch ein Message-Mechanismus:
const
cNotifyChanged =...
Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
3. Apr 2021
So sollte es auf der sicheren Seite sein:
type
TBase = class;
TBaseObjectList = class(TObjectList<TBase>)
private
FChanged: Boolean;
public
constructor Create(AOwnsObjects: Boolean = True); overload;
property Changed: Boolean read FChanged write FChanged;
Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
3. Apr 2021
Konsequenterweise sollte man die Liste auch so deklarieren: TBaseObjectList<T: TBase>
Forum: Object-Pascal / Delphi-Language
by Uwe Raabe,
3. Apr 2021
Versuch's mal so:
if (FParentObject is TBaseObjectList<TBase>) then
TBaseObjectList<TBase>(FParentObject).Changed := true;