TList.Sort: After a while the sort-function receives a Item1=Nil
Hello,
I attached the following code.
The main-programm is a nip of a bigger programm which populates a
listview (elvPersonen) with some data save some additional data in the
Items.Data of the listview. Now I create a TList PersList and populate
it. After filling the TList I open a de{*word*81} window and access every
item of the PersList to see if it is assigned. All work fine. But if I
now call the sort-function the list begins to sort (i. e. the function
is called ~15 times) but suddenly at the 16th call the passed Item1 is
$76 or nil.
The sort-function looses mit entries!
Or do I make a mistake?
type
SitzEditPersData = record
PID, FRID, FID, sb, Anwesend, Abgerechnet:
Integer;
AnwVon, AnwBis: TTime;
Einladung: Integer;
Bemerkung, Titel: String;
// FReihenfolge wird in DSGPEinlesen gefllt,
damit
// auf die Liste ein CustomSort ausgefhrt
werden kann
// Sonst wird das nirgends verwendet und ist
auch nirgends initialisiert
FReihenfolge: Integer;
end;
pSitzEditPersData = ^SitzEditPersData;
SitzEditPers = record
Nachname, Vorname, Fraktion, Funktion: String;
Data: SitzEditPersData;
end;
function PersListFReihenfolgeSort(Item1, Item2: Pointer): Integer;
begin
// Result<0: Item1<Item2
// Result=0: Item1=Item2
// Result>0: Item1>Item2
if (pSitzEditPers(Item1)^.Data.FReihenfolge<1) or
(pSitzEditPers(Item1)^.Data.FReihenfolge>pSitzEditPers(Item2)^.Data.FReihenfolge)
then Result:=1
else if
pSitzEditPers(Item1)^.Data.FReihenfolge<pSitzEditPers(Item2)^.Data.FReihenfolge
then Result:=-1
else if
pSitzEditPers(Item1)^.Data.FReihenfolge=pSitzEditPers(Item2)^.Data.FReihenfolge
then Result:=0;
end;
var PersList: TList;
begin ... main-program...
for i:=0 to elvPersonen.Items.Count-1 do begin
New(pP);
with pP^ do begin
Nachname:=elvPersonen.Items[i].Caption;
Vorname:=elvPersonen.Items[i].SubItems[0];
Fraktion:=elvPersonen.Items[i].SubItems[1];
Funktion:=elvPersonen.Items[i].SubItems[2];
Data:=pSitzEditPersData(elvPersonen.Items[i].Data)^;
// Reihenfolge fr Funktion ermitteln
if pSitzEditPersData(elvPersonen.Items[i].Data)^.FID<>-1 then
begin // Funktion zugeordnet
tFunk:=TDBFunktion.Create(DBZugriffskomponente);
DBZugriffskomponente.StartTransaction;
tFunk.Open(['Reihenfolge'],
'FID='+IntToStr(pSitzEditPersData(elvPersonen.Items[i].Data)^.FID));
Data.FReihenfolge:=tFunk.Reihenfolge;
tFunk.Close;
DBZugriffskomponente.Commit;
tFunk.Free;
end
else Data.FReihenfolge:=-1; // Keine Funktion zugeordnet
end;
PersList.Add(pP);
end;
// if I now open a De{*word*81}-Window and do a
pSitzEditPers(PersList[0])^, pSitzEditPers(PersList[1])^, ...,
pSitzEditPers(PersList[PersList.Count-1])^
// all PersList[x] have an assigned pointer but when calling
PersListReihenfolgeSort suddenly (after some correct calls) Item1
becomes NIL
// or $76. ??? Is there a bug in Tlist or did I something wrong? I
have programmed a lot of TList.Sort-functions and all worked fine but
this?
PersList.Sort(PersListFReihenfolgeSort);
end