Passer une Fonction en Paramètre

Résolu
moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008 - 10 janv. 2006 à 15:02
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 12 janv. 2006 à 13:06
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

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
10 janv. 2006 à 20:41
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
3
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
12 janv. 2006 à 13:06
Okay :) Merci pour cette précision. Quand je disais alias, je pensais justement à la déclaration que tu cites dans le Classes.pas
3
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
10 janv. 2006 à 16:03
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.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
10 janv. 2006 à 20:51
-->florenth ton doigt auarit-il déraper?

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

@+

jlen
0

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

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
10 janv. 2006 à 21:02
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
10 janv. 2006 à 21:13
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
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
11 janv. 2006 à 13:35
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 !
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
11 janv. 2006 à 17:49
@ 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
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
11 janv. 2006 à 20:55
Beuh, en fait j'ai juste fait un copy-paste depuis un de mes prog. J'avais le "of object " en bleu...

gnh !
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
11 janv. 2006 à 20:56
@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.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
11 janv. 2006 à 22:29
@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 !
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
11 janv. 2006 à 23:22
@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.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
12 janv. 2006 à 10:09
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 !
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 janv. 2006 à 12:34
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.
0