Passer une Fonction en Paramètre [Résolu]

moldov 168 Messages postés mercredi 8 octobre 2003Date d'inscription 10 novembre 2008 Dernière intervention - 10 janv. 2006 à 15:02 - Dernière réponse : DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention
- 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
Afficher la suite 

14 réponses

Répondre au sujet
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 10 janv. 2006 à 20:41
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de florenth
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 12 janv. 2006 à 13:06
+3
Utile
Okay :) Merci pour cette précision. Quand je disais alias, je pensais justement à la déclaration que tu cites dans le Classes.pas
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de DeltaFX
Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention - 10 janv. 2006 à 16:03
0
Utile
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.
Commenter la réponse de Loulibier
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 10 janv. 2006 à 20:51
0
Utile
-->florenth ton doigt auarit-il déraper?

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

@+

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

gnh !
Commenter la réponse de DeltaFX
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 11 janv. 2006 à 20:56
0
Utile
@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.
Commenter la réponse de cs_Delphiprog
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 11 janv. 2006 à 22:29
0
Utile
@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 !
Commenter la réponse de DeltaFX
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 11 janv. 2006 à 23:22
0
Utile
@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.
Commenter la réponse de cs_Delphiprog
DeltaFX 459 Messages postés lundi 19 avril 2004Date d'inscription 8 avril 2009 Dernière intervention - 12 janv. 2006 à 10:09
0
Utile
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 !
Commenter la réponse de DeltaFX
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 12 janv. 2006 à 12:34
0
Utile
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.
Commenter la réponse de cs_Delphiprog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.