Board index » delphi » TList.Sort: After a while the sort-function receives a Item1=Nil

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

 

Re:TList.Sort: After a while the sort-function receives a Item1=Nil


I tested it further and if I modify the sort-proc as above all work
fine. Could anybody tell me why this works now, please?

Thanks

Stefan Westner

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} --> I comment
this out

(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;

On Sun, 17 Jan 1999 13:20:33 GMT, ste...@westner.de (Stefan Westner)
wrote:

Quote
>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

Other Threads