Type d'une fonction interne (pointeur de methode, procedure normale, ...)

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 25 sept. 2008 à 14:05
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 1 oct. 2008 à 09:08
salut a tous.
Ce n'est pas un probleme que j'ai, c'est juste une question que je me pose.
Quel est le type d'une procedure interne?
je m'explique, si on prend  l'exemple de TListSortFunction (pour TList.sort), qui est un fonction.

quand je fais le code suivant :

function srtFncGlobale(i1, i2: pointer): integer;
begin
  Result := CompareValue(integer(i1), integer(i2));
end;

function TForm1.srtFncOfObject(i1, i2: pointer): integer;
begin
  Result := CompareValue(integer(i1), integer(i2));
end;

procedure TForm1.TestSort(mode: byte);
  function srtFncInterne(i1, i2: pointer): integer;
  begin
    Result := CompareValue(integer(i1), integer(i2));
  end;
var
  lst: TList;
  s: string;
  i: integer;
begin
  lst := tlist.Create;
  lst.Add(Pointer(3));
  lst.Add(Pointer(1));
  lst.Add(Pointer(2));

  s := '';
  for i := 0 to lst.Count-1 do
    s := s + IntToStr(integer(lst[i])) + '';

  s := s + ' -> ';

  case mode of
    0: lst.Sort(@srtFncInterne); //tri avec une fonction interne
    1: lst.Sort(@srtFncGlobale);//tri avec un fonction globale
//    2: lst.Sort(srtFncOfObject);//tri avec une fonction d'un objet -> incompatible
  end;

  for i := 0 to lst.Count-1 do
    s := s + IntToStr(integer(lst[i])) + '';

  ShowMessage(s);
  lst.Free;
end;
Le tri se passe bien si on utilise une fonction interne ou globale, mais incompilable sur une fonction d'un objet.
Pourtant, la fonction interne appartient a une fonction d'objet ("self" est valide dans cette fonction).
Cependant, l'appel a self dans la fonction interne provoquera une erreur si la fonction est appelé par TList.Sort.

Ma question est donc pourquoi ca marche, mais pas trop.
et aussi, comment faire pour avoir des parametres a une fonction de tri sans etre obligé d'utiliser des variables globales a cote de cette fonction?

Merci de votre aide

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 sept. 2008 à 14:15
2: lst.Sort(@srtFncOfObject);



compatible.

0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 sept. 2008 à 14:17
lst.Sort(srtFncOfObject); : Type incompatbile procedure normale et pointeur de fonction
lst.Sort(@srtFncOfObject); : variable requise
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 sept. 2008 à 15:20
effectivement, aprés test, je trouve pas de methode pour le faire avec une methode d'objet...

donc, faut utiliser une methode globale.

0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 sept. 2008 à 22:38
La méthode Sort de la classe TList est ainsi définie :
procedureSort(Compare:TListSortCompare);
Or, TListSortCompare est elle-même définie de la façon suivante :
TListSortCompare =function(Item1,Item2:Pointer):Integer;
Donc, l'argument à passer à la méthode Sort ne peut être du type "procedure of object" mais une fonction "simple" respectant la signature du type défini par TListSortCompare..
Un rapide coup d'oeil sur l'aide en ligne de Delphi t'aurait mis sur la voie.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
1 oct. 2008 à 09:08
@DelphiProg: en fait ca je le sais deja. ce qui m'intrigue, c'est que on peut aussi lui passer une sous-fonction d'une fonction d'un objet (la fonction "srtFncInterne") de mon post precedent.
Donc pourquoi puis-je passer cette fonction en tant que TListSortCompare, alors qu'elle a acces à self.
0
Rejoignez-nous