Passer une Fonction en Paramètre

[Résolu]
Signaler
Messages postés
165
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
10 novembre 2008
-
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
-
Bonjour,



je cherche un moyen de passer une fonction en parametre pour pouvoir
l'executer dans une autre fonction afin d'avoir un code plus propre.



Exemple :



procedure X;

var

status : integer

begin

status := 1;

while status <> 0 do


status:=DAQmxReadAnalogF64(TaskHandleAI[nDevice,nCanal],-1,10.0,DAQmx_Val_GroupByChannel,Buffer,NbMesures,@status1,nil);



status := 1;

while status <> 0 do status:=DAQmxStopTask(TaskHandleAI[nDevice,nCanal]);

end;



je voudrais a la place



procedure X;

begin

Y (DAQmxStopTask(TaskHandleAI[nDevice,nCanal]));

Y(DAQmxReadAnalogF64(TaskHandleAI[nDevice,nCanal],-1,10.0,DAQmx_Val_GroupByChannel,Buffer,NbMesures,@status1,nil));

end;



procedure Y(fct : ....)

var

status : integer;

begin

status : = 1;

while status <> 0 do

status := fct;

end;



Merci Beaucoup pour votre aide



Bonne Prog

14 réponses

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
type
{ Définition du type de fonction. }
TMyFonction = fonction (Parametres): Integer;

procedure Y(AFonction: TMyFonction);
var
Status : Integer;

begin
Status := 1;
while Status <> 0 do
Status : = AFonction(Parametres); // Appel de la fonction passée en parametre

end;

{ Procédure principale. }
procedure X;
begin
{ Appels à la procedure Y en lui passant un parametre fonction. }
Y(AFunc);
Y(AOtherFunc);
end;

Cet exemple te montre comment faire.
Evidemment, il faut que les fonctions AFunc et AOtherFunc soient déclarées avant la procédure X (ou en forward) et qu'elle soient bien du type TMyFonction.

++
Flo

Si tu ne te plantes pas ......
tu ne poussera jamais
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Okay :) Merci pour cette précision. Quand je disais alias, je pensais justement à la déclaration que tu cites dans le Classes.pas
Messages postés
309
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
2
Bonjour moldov,

Et pourquoi ne fais tu pas une function recursive ?

exemple :

procedure X;
begin
DAQmxReadAnalogF64(TaskHandleAI[nDevice,nCanal],-1,10.0,DAQmx_Val_GroupByChannel,Buffer,NbMesures,@status1,nil);
DAQmxStopTask(TaskHandleAI[nDevice,nCanal]);
end;

function DAQmxReadAnalogF64(TaskHandleAI[nDevice,nCanal], -1, 10.0, DAQmx_Val_GroupByChannel, Buffer, NbMesures, @status1, nil) : integer;
begin
// Traitement puis on traite le resultat si different de 0 alors on appel la même fonction.

if Result <> 0 then
Result := DAQmxReadAnalogF64(TaskHandleAI[nDevice,nCanal],-1,10.0,DAQmx_Val_GroupByChannel,Buffer,NbMesures,@status1,nil);
end;

function DAQmxStopTask(TaskHandleAI[nDevice,nCanal]): integer;
begin
// Traitement puis on traite le resultat si different de 0 alors on appel la même fonction.

if Result <> 0 then
Result := DAQmxStopTask(TaskHandleAI[nDevice,nCanal]);
end;

Bonne Prog,

Olivier

PS : Lorsqu'une réponse vous convient, n'oubliez pas de la valider.
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
-->florenth ton doigt auarit-il déraper?

TMyFonction fonction (Parametres): Integer;--TMyFonction fUnction (Parametres): Integer;

@+

jlen
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Oups .... vive le français !!!
Evidemment, il faut lire fUnction et non pas fOnction.
Merci de cette remarque jlen

Dérapé, mon doigt ... je ne crois pas. A moins que chez toi le ''u'' soit à côté du ''o'', mais ya le ''i''. Bref ...

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
ah les faux amis!!

non mon clavier est tout à fait standard mais mes doigts apparament beaucoup moins:

aurait est devenu auarit!!!! ou je suis devenu dyslexique.





@+

jlen
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Et :

Type TmyProc = procedure(Sender: TObject) of object;

si tu souhaites passer des fonction/procédure de la Form genre

procedure TForm.MachinOnDblClick(Sender: TObject);

gnh !
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
@ DeltaFX: je suis d'accord pour le "of object" mais par contre, le Sender n'est pas un parametre obligatoire. Ca sert, d'accord, mais pas toujours donc on peut l'ommetre (et rajouter d'autres parametres evidemment) si on le souhaite.

@jlen100: je penche plus pour la première raison quoi qu'une dyslexie n'est pas forcément grave ...
Par contre, dans ton premier post, ce n'est pas déraper mais derapé, ... aïe aïe aïe !!!

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Beuh, en fait j'ai juste fait un copy-paste depuis un de mes prog. J'avais le "of object " en bleu...

gnh !
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
@DeltaFx : le type de procédure que tu déclares existe déjà nativement avec Delphi et se nomme TNotifyEvent , lol.

@Moldov : en gros, tu voudrais utiliser ce que l'on appelle des fonction callback (de rappel in French). Ce type de fonction est très fréquemment utilisé dans la programmation Windows et permet une grande souplesse en passant, en argument, une fonction plutôt qu'une autre. L'essentiel étant de déclarer le type de la fonction passée avant de l'utiliser. C'est un principe intangible en Pascal (à quelques rares exceptions près) et tu le sais déjà.
<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
@Delphiprog : Hehehe quand je me suis trouvé confronté à l'ecriture de cette fonction, j'ai googlé, et j'ai trouvé que "procedure of object". Maintenant je saurai.

Y a une différence conceptuelle ou c'est juste un alias, procedure of objet et TnotifyEvent ?

gnh !
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
@DeltaFx : non, ce n'est pas un alias car les prototypes sont différents :
TNotifyEvent = procedure(Sender: TObject) of object;
TMaProc = procedure of object;
Dans les deux cas, on les appelle des méthodes, pour employer la terminologie objet, et c'est tout ce qu'elles ont de commun.

Si tu veux déclarer un type de procédure ou fonction "simple", il suffit de ne pas ajouter "Of Object" comme l'a très bien indiqué Florenth plus haut :
TMyFonction = fonction (Parametres): Integer;
Sauf qu'il a oublié de préciser que l'on devait fournir les types des arguments

<hr color ="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Oops j'étais pas clair. Donc TNotifyEvent & procedure(Sender: TObject) of object; sont strictement identiques, et l'un des deux est un alias
de l'autre ou bien me goure-je ?

gnh !
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Ce pourait être un alias si tu le déclarais ainsi :
Type
TMaProc = TNotifyEvent;

Le fait de déclarer deux choses identiques n'en fait pas des alias automatiquement. Pour cela, il faut utiliser la notation ci-dessus.
Mais, dans ce cas là, autant s'en dispenser et utiliser un TNotifyEvent directement.

Donc TNotifyEvent et "procedure(Sender: TObject) of object" sont strictement identiques puisque c'est TNotifyEvent est déclaré dans Classes.pas de la façon suivante :
TNotifyEvent = procedure(Sender: TObject) of object;

J'espère avoir éclairci un peu cette partie souvent laissée de côté par bon nombre d'entre nous.
<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.