florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
Loulibier
Messages postés309Date d'inscriptionjeudi 6 juin 2002StatutMembreDernière intervention24 septembre 20082 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.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 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 ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 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 ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.