Bonjour,
j'ai décidé de blinder une procédure toute simple
Bien sûr il faut passer par IOresult et comm' d'hab' le web est plein d'infos, à tel point que je viens vous solliciter, les lecteurs de diskettes ayant maintenant disparu, ce qui est bien regrettable parce que pour faire des tests avec pas de diskette, diskette write-protect ou diskette full, c'était bien pratique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 var // http://wiki.freepascal.org/File MyFile: file; Data: array [0..53] of Byte; // taille BitmapFileHeader + BitmapInfoHeader v1 begin AssignFile(MyFile, '/chemin/fichier'); Reset(MyFile, 1 { size of read chunk }); try BlockRead(MyFile, Data, SizeOf(Data)); finally CloseFile(MyFile); end; end;
Ça devient compliqué, maintenant, surtout quand on lit, dans deux sujets du même forum, ce genre de choses (c'est moi qui mets en gras) :
source 1re ligne -- source 2de lignemake sure you have called IOResult after your last file operation, but before the {$I+}
always read out IOResult after doing an {$I+}.
Pour ne pas prendre de risque, il faudrait donc écrire, en fin de procédure,
et tester le Error à chaque fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //... Closefile(f); Error := IOResult; // make sure you have called IOResult after your last file operation, but before the {$I+} -- http://forum.lazarus.freepascal.org/index.php?topic=38751.msg264193#msg264193 {$I+} Error := IOResult; // always read out IOResult after doing an {$I+}. -- http://forum.lazarus.freepascal.org/index.php/topic,26087.msg160078.html#msg160078
L'ennui c'est la règle trouvée dans le message indiqué juste au-dessus (So best practice is... keep your {$I-}/{$I+} as short as possible) qui en rajoute une couche parce que, partant de l'exemple donné dans ce post, je me demande si c'est comme ça qu'il faudrait faire :
Merci pour vos avis avisés,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
36 var s : string; f : textfile; Error : integer; procedure ManageError(E: integer); begin ShowMessage(IntToStr(E)); end; begin s := inputbox('Saisie de texte','Entrer une ligne de texte :','blabla'); if s <> '' then begin Error := IOResult; // use the IOResult before an IO-operation (to reset it). -- http://forum.lazarus.freepascal.org/index.php/topic,26087.msg160078.html#msg160078 {$I-} AssignFile(f,'/chemin/test.txt'); Error := IOResult; // make sure you have called IOResult after your last file operation, but before the {$I+} -- http://forum.lazarus.freepascal.org/index.php?topic=38751.msg264193#msg264193 {$I+} if bool(Error) then begin ManageError(Error); exit; end; {$I-} Rewrite(f); Error := IOResult; // make sure you have called IOResult after your last file operation, but before the {$I+} -- http://forum.lazarus.freepascal.org/index.php?topic=38751.msg264193#msg264193 {$I+} if bool(Error) then begin ManageError(Error); exit; end; {$I-} WriteLn(f,s); Error := IOResult; // make sure you have called IOResult after your last file operation, but before the {$I+} -- http://forum.lazarus.freepascal.org/index.php?topic=38751.msg264193#msg264193 {$I+} if bool(Error) then begin ManageError(Error); exit; end; {$I-} Closefile(f); Error := IOResult; // make sure you have called IOResult after your last file operation, but before the {$I+} -- http://forum.lazarus.freepascal.org/index.php?topic=38751.msg264193#msg264193 if bool(Error) then begin ManageError(Error); exit; end; {$I+} Error := IOResult; // always read out IOResult after doing an {$I+}. -- http://forum.lazarus.freepascal.org/index.php/topic,26087.msg160078.html#msg160078 if bool(Error) then begin ManageError(Error); exit; end; end; end;
Partager