TobjectList sort, valeur inaccessible

Signaler
Messages postés
4
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
3 avril 2006
-
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Bonjour,
j'ai un probleme en developpant une fonction de tri d'un TObjectList
C'est une liste de facture (TListFacture), chaque facture ayant des elements dont un IdBase (identifiant dans la base, integer).
Je desire appeler
MaListeDeFacture.TrieParID;
Mon code est le suivant:

function TListFacture.CompareId(Item1, Item2: Tfacture): Integer;
begin
if (Item1 <> nil) AND (Item2 <> nil) then
result := CompareValue(Item1.IDBase, Item2.IDBase );
end;

Procedure TListFacture.TrieParID;
begin
if (self.count > 1) then
self.FListFacture.Sort(@TListFacture.CompareId);
end;

Quand je click sur mon bouton j'appel la procedure TriParId .
Mais mon probleme c'est que quand je test j'ai Item2 = 'Valeur inaccessible' (en pas-a-pas), Item1 etant bien au premier element de ma liste, mais il lance quand meme le CompareValue(), et la ca plante.
Pourquoi?
Et qu'est ce que ca veut dire si c'est innaccessible mais non nil?
Merci d'avance.
michel

2 réponses

Messages postés
4
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
3 avril 2006

J'ai aussi essayé:
function TListFacture.CompareId(Item1, Item2: Pointer): Integer;
begin
if ((Item1 <> nil) AND (Item2 <> nil) ) then
result := CompareValue(Tfacture(Item1).IDBase, Tfacture(Item2).IDBase );
end;

Dans ce cas, en mode pas-a-pas, j'ai 'Item2=$1' et ca plante toujours (evidemment).
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Tout d'abord, la méthode Sort attend une fonction en argument, pas une méthode :
procedure Sort(Compare: TListSortCompare);

Et TListSortCompare est défini ainsi :
TListSortCompare =   function  (Item1, Item2: Pointer): Integer;

La solution se résume donc à ceci :

function CompareId(Item1, Item2: Pointer): Integer;
begin
  if Assigned(Item1) and Assigned(Item2) then
  begin
    if TFacture(Item1).IdBase < TFacture(Item2).IdBase then
      Result : = -1
    else
      if  TFacture(Item1).IdBase > TFacture(Item2).IdBase then
        Result :=  1
      else
        Result := 0;
  end
  else
     Raise  Exception.Create('Ni Item1 ni Item2 ne peuvent &#234;tre nuls');
end;

procedure TListFacture.TrieParId;
begin
  Sort(@CompareId);
end;


May Delphi be with you !

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.