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

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

Votre réponse

14 réponses

Meilleure réponse
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 10 janv. 2006 à 20:41
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
- 12 janv. 2006 à 13:06
3
Merci
Okay :) Merci pour cette précision. Quand je disais alias, je pensais justement à la déclaration que tu cites dans le Classes.pas

Merci DeltaFX 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de DeltaFX
Messages postés
323
Date d'inscription
jeudi 6 juin 2002
Dernière intervention
24 septembre 2008
- 10 janv. 2006 à 16:03
0
Merci
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
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
- 10 janv. 2006 à 20:51
0
Merci
-->florenth ton doigt auarit-il déraper?

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

@+

jlen
Commenter la réponse de jlen100
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 10 janv. 2006 à 21:02
0
Merci
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
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
- 10 janv. 2006 à 21:13
0
Merci
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
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
- 11 janv. 2006 à 13:35
0
Merci
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
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
- 11 janv. 2006 à 17:49
0
Merci
@ 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
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
- 11 janv. 2006 à 20:55
0
Merci
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
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 11 janv. 2006 à 20:56
0
Merci
@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
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
- 11 janv. 2006 à 22:29
0
Merci
@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
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 11 janv. 2006 à 23:22
0
Merci
@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
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Dernière intervention
8 avril 2009
- 12 janv. 2006 à 10:09
0
Merci
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
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 12 janv. 2006 à 12:34
0
Merci
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.