TobjectList sort, valeur inaccessible

haldrix Messages postés 4 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 3 avril 2006 - 3 avril 2006 à 12:03
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 3 avril 2006 à 20:04
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

haldrix Messages postés 4 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 3 avril 2006
3 avril 2006 à 12:13
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).
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 avril 2006 à 20:04
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.
0
Rejoignez-nous