Ich habe es jetzt mal getestet. Wenn ich bei der Zeile
if Action = cnRemoved then
einen Breakpoint setze, steht der Count von der ObjectList um einen reduziert. Das heißt für mich, dass erst das Objekt gelöscht wird und dann Notify ausgeführt wird. Um das Ergebnis noch zu verifizieren, habe ich die Procedure Delete mit in meine abgeleitet Klasse übernommen. Es ist wirklich so, das erst die Delete Procedure ausgeführt wird und dann das Notify. Ich habe jetzt mal zusätzlich in der Delete-Procedure eine Abfrage auf Assigned(FOnDelete) gemacht. Auch hier wird ein False ausgegeben, wie kann das sein ?
Meine TCustomObjectList<T: class> sieht jetzt so aus :
Delphi-Quellcode:
TCustomObjectList<T: class> = class(TObjectList<T>)
private
FOnChange : TNotifyEvent;
FOnDelete : TNotifyEvent;
FModifyAction : TModifyActionList;
FNewRecord : Boolean;
procedure SetOnDelete(const Value: TNotifyEvent);
procedure SetOnChange(const Value: TNotifyEvent);
protected
function getItem(Index: Integer): T; virtual;
procedure setItem(Index: Integer; Objekt: T); virtual;
procedure Notify(const Item: T; Action: TCollectionNotification); override;
public
function Add(Objekt: T): Integer; virtual;
procedure Delete(Index: Integer); virtual;
function NewRecord(Objekt: T): Integer; virtual;
function Remove(Objekt: T): Integer; virtual;
function IndexOf(Objekt: T): Integer; virtual;
procedure Insert(Index: Integer; Objekt: T); virtual;
property Items[index: Integer]: T read getItem write setItem; default;
property ModifyAction : TModifyActionList read FModifyAction write FModifyAction;
property OnChange : TNotifyEvent read FOnChange write SetOnChange;
property OnDelete : TNotifyEvent read FOnDelete write SetOnDelete;
end;
{...}
{ TCustomObjectList<T> }
function TCustomObjectList<T>.Add(Objekt: T): Integer;
begin
FNewRecord := False;
Result := inherited Add(Objekt);
end;
procedure TCustomObjectList<T>.Delete(Index: Integer);
begin
if Assigned(FOnDelete) then
FOnDelete(Self);
inherited Delete(Index);
end;
function TCustomObjectList<T>.getItem(Index: Integer): T;
begin
Result := T(inherited Items[Index]);
end;
function TCustomObjectList<T>.IndexOf(Objekt: T): Integer;
begin
Result := inherited IndexOf(Objekt);
end;
procedure TCustomObjectList<T>.Insert(Index: Integer; Objekt: T);
begin
inherited Insert(Index, Objekt);
end;
function TCustomObjectList<T>.NewRecord(Objekt: T): Integer;
begin
FNewRecord := True;
Result := inherited Add(Objekt);
end;
procedure TCustomObjectList<T>.Notify(const Item: T;
Action: TCollectionNotification);
begin
if (Assigned(FOnChange)) and (FNewRecord) and (Action <> cnRemoved) then
begin
FNewRecord := False;
FOnChange(Self);
end;
inherited Notify(Item, Action);
end;
function TCustomObjectList<T>.Remove(Objekt: T): Integer;
begin
Result := inherited Remove(Objekt);
end;
procedure TCustomObjectList<T>.setItem(Index: Integer; Objekt: T);
begin
inherited Items[Index] := Objekt;
end;
procedure TCustomObjectList<T>.SetOnChange(const Value: TNotifyEvent);
begin
FOnChange := Value;
end;
procedure TCustomObjectList<T>.SetOnDelete(const Value: TNotifyEvent);
begin
FOnDelete := Value;
end;
Bei
if Assigned(FOnDelete) then
steht der Count von TCustomObjectList<TDegree> noch auf der vollen Anzahl Objekte. Entweder verstehe ich hier etwas nicht oder es läuft irgendwas schief.
Edit:
Im Anhang meine DegreeList, nach dem Befüllen mit Daten. So wie ich das sehe, ist doch alles korrekt oder ?