Scheinbar hat hier oButton.Num nichts mit dem Index in der TObjectlist zu tun.
Ursache kann z.B. sein, das die Buttons nicht vollständig, doppelt oder nicht in der richtigen Reihenfolge eingefügt oder nach dem Einfügen nicht sortiert werden. Also sollte man den Index unberücksichtigt lassen, statt dessen nach dem richtigen Button suchen:
Delphi-Quellcode:
type
TMyColButtons = class(TObjectList)
private
function GetButton(ANum: Integer): TClsButtonInfo;
public
procedure Add(AButton: TClsButtonInfo);
procedure Remove(ANum: Integer);
property Button[ANum: Integer]: TClsButtonInfo read GetButton; default;
end;
function TMyColButtons.GetButton(ANum: Integer): TClsButtonInfo;
var
i: Integer;
begin
for i := 0 to Count - 1 do
begin
Result := TClsButtonInfo(Items[i]);
if Result.Num = ANum then
Exit;
end;
Result := nil;
end;
procedure TMyColButtons.Add(AButton: TClsButtonInfo);
begin
Remove(AButton.Num);
inherited Add(AButton);
end;
procedure TMyColButtons.Remove(ANum: Integer);
var
oButton: TClsButtonInfo;
begin
oButton := Button[ANum];
if Assigned(oButton) then
inherited Remove(oButton);
end;
Wichtig ist:
Wenn ein Button gelöscht werden soll, muss er aus der Liste entfernt werden,
bevor er freigegeben wird.