Salut,
L'appel à la fonction...
équivaut à
1 2
| cdelay(5000,false); { Si aucune touche n'a été préssée }
cdelay(5000,true); { Si touche déjà préssée } |
Mais il faut que la fonction (keypressed en l'occurence) soit appelée dans la procedure cdelay à chaque itération.
Dans la procedure nous pourrions faire...
if (keypressed=true) then break;
Mais (pour le fun) nous pouvons aussi passer en paramètre à la fonction cdelay une variable (de type sous-programme) contenant l'adresse d'une fonction booléenne. Cette dernière renvoyant le résultat de la fonction keypressed en l'occurence.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| program test;
uses crt;
{ Type sous-programme }
type
BooleanFunc=function:boolean;
{ La variable expression est destinée à contenir l'adresse d'une fonction booléenne sans paramètres }
var expression:BooleanFunc;
{ Important ! L'appel à cette fonction sera de type Far call }
function GetExpression:boolean;Far;
begin
GetExpression:=keypressed;
end;
procedure cdelay(t:integer; const exp:BooleanFunc); {t = temps du delay ; exp = Adresse de la fonction booléenne }
var
i:integer;
begin
for i := 1 to t do begin
delay(1);
if (exp=true) then break; { Appel la fonction "pointée" par exp }
end;
end;
begin
expression:=GetExpression; { expression contient l'adresse de la fonction GetExpression }
cdelay(5000,expression);
write('ok');
end. |
Partager