AW: Ein Object in TObjectList<T> löschen mit Ereignis
Im Beitrag 7, siehst Du im Anhang, wie der Setter von FOnDelete arbeitet. Ebenfalls im gleichen Beitrag hatte ich geschrieben, dass ein Assigned(FOnDelete) immer False ergibt.
Ich habe noch ein bisschen weiter getestet. Wenn ich die TCustomObjectList<T: class> für die Klasse TDegree folgendermaßen erstelle :
Delphi-Quellcode:
Funktioneren beide Quelltexte aus den Beiträgen 1 und 7 und die Funktion für FOnDelete wird ausgeführt. Lasse ich diese Zeile
DegreeList := TCustomObjectList<TDegree>.Create;
DegreeList.OnDelete := TableEntryDelete;
Delphi-Quellcode:
weg, dann wird FOnDelete nichtmehr ausgeführt oder es wird die Access Violation angezeigt, wenn die Abfrage auf Assigned(FOnDelete) fehlt. Deshalb gehe ich davon aus, das das FOnDelete im Notify auf das FOnDelete in der TCustomObjectList<T: class> zeigt.
DegreeList.OnDelete := TableEntryDelete;
Ich stelle mir jetzt nur die Frage, warum FOnChange so funktioniert und FOnDelete nicht ? |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Hat sich Dein Compiler irgendwie verschluckt?
Hast Du einen Compilerpoint (möglicher Breakpoint) in der Zeile? Hast Du mal Projekt bereinigen/bneu erzeugen versucht? |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
Zitat:
Zitat:
|
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Ich meinte den kleinen blauen Punkt vor jeder Befehlszeile (auf den man zum Setzen eines Breakpoints klickt).
Gelegentlich fehlten die bei mir schon mal, wenn der Compiler mit meinen Units nicht zurecht kam. :stupid: Es gibt noch die Projektoptionen Bereinigen, Erzeugen und ggf. Installieren (bei Packages). Vielleicht hilft davon ja etwas. |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
Trotzdem steht ja immer noch meine Frage im Raum, warum FOnChange so funktioniert und FOnDelete nicht. Ist mein Sourcecode denn überhaupt richtig oder habe ich einen Fehler gemacht ? |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
Dein Code aus Beitrag 1
Delphi-Quellcode:
Du prüfst, ob FOnChange zugewiesen ist, aber du prüfst nicht, ob FOnDelete zugewiesen ist und wunderst dich, dass es knallt, wenn du FOnDelete nichts zuweist?
procedure TCustomObjectList<T>.Notify(const Item: T;
Action: TCollectionNotification); begin if // Wenn Assigned( FOnChange ) // dem Event was zugewiesen ist and // und ( FNewRecord ) // FNewRecord wahr ist and // und ( Action <> cnRemoved ) // die Aktion <> Entfernt ist then // dann begin FNewRecord := False; FOnChange(Self); end; if // Wenn Action = cnRemoved // die Aktion = Entfernt ist then // dann begin FOnDelete(Item); // knallt es hier, wenn FOnDelete = nil ist !!!!! end; inherited Notify(Item, Action); // hier wird die Objekt-Instanz freigegeben, wenn OwnsObjects = True end; Warum hast du das Überprüfen weggelassen? Das kann ich irgendwie überhaupt nicht nachvollziehen, und schon gar nicht die Verwunderung, dass da mal eine AV kommt. Ich würde es bei dem Code eher erwarten und mich wundern wenn keine kommt. Bzgl. der Frage, wann die Objekt-Instanz freigegeben wird: In der überschriebenen Notify-Methode von TObjectList<T>. Wenn du also die Notify-Methode überschreibst und erst am Ende das
Delphi-Quellcode:
gibst, dann ist die Objekt-Instanz noch da.
inherited
|
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
|
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Ich habe das Problem so verstanden, dass Rolf die Methoden definitiv zuweist:
Delphi-Quellcode:
aber OnDelete dennoch nil ist.
Degree := TDegree.Create;
Degree.OnChange := TableEntryChange; Degree.OnDelete := TableEntryDelete; In dem Fall kann eigentlich ja nur der Compiler ein Problem haben. Wenn in Deiner Klasse keine Befehlszeilenpunkte stehen (und Deine Klasse benutzt Du doch!?) dann ist das bestimmt ein Problem mit dem Compiler. Hast Du Deine Unit irgendwie kopiert und IDE und Compiler greifen auf unterschiedliche Versionen zu? Ich würde mal schrittweise die relevanten Stellen durchlaufen... |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
TDegree ist ein einfaches Objekt und befindet sich nachher in der Liste, ist aber nicht die Liste selber ;) EDIT: Im Beitrag #7 da hat er ein schönes Bild angehängt, wo man auch sehr schön sehen kann, das FOnDelete den Wert nil hat, und den Items (TDegree) die Events zugewiesen wurden (<>nil) :) |
AW: Ein Object in TObjectList<T> löschen mit Ereignis
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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