Bonjour,
Je m'exerce en ce moment à convertir de vieux projets Delphi en Lazarus.
Le vieux petit programme FourCC Changer (d'ailleurs quasi inutile aujourd'hui me paraissait un exercice facile et la conversion proprement dite était sans difficultés. Il s'agit d'ouvrir un fichier AVI DivX, de lire quatre octets de l'en-tête à partir de 70 et quatre autres à partir de BC, puis éventuellement dans une autre procédure, de modifier ces huit octets.
Mais il semble qu'il y ait une différence de gestion des fichiers entre le Delphi d'il y a quinze ans et Lazarus.
J'ai donc deux procédures, qui constituent quasi tout le programme La première lit, la deuxième écrit :
Mais sous Windows, la première procédure arrive à afficher les huit octets dans les deux ComboBox, mais m'affiche ensuite une violation d'accès. Quand je veux modifier les chaînes, j'ai droit à "Access denied".
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 procedure TForm1.BrowseButtonClick(Sender: TObject); var F : File; S : String[4]; begin If OpenDialog1.Execute = True then Begin SetLength(S,4); {$I-} AssignFile(F,OpenDialog1.FileName); Reset(F,1); {$I+} If IOResult = 0 then Begin Seek(F,$70); BlockRead(F,S[1],4); ComboBox1.Text := S; Seek(F,$BC); BlockRead(F,S[1],4); ComboBox2.Text := S; AVIName.Text := ExtractFileName(OpenDialog1.FileName); AVIName.Hint := OpenDialog1.FileName; Button2.Enabled := True; CloseFile(F); End else Begin MessageDLG('Ouverture impossible. Lecture seule ?',mtError,[mbok],0); End; End; end; procedure TForm1.Button2Click(Sender: TObject); var F : File; S : String[4]; begin If (Length(ComboBox1.Text) = 4) and (Length(ComboBox2.Text) = 4) then Begin {$I-} AssignFile(F,OpenDialog1.FileName); Reset(F,1); {$I+} Seek(F,$70); S := ComboBox1.Text; BlockWrite(F,S[1],4); Seek(F,$BC); S := ComboBox2.Text; BlockWrite(F,S[1],4); CloseFile(F); MessageDLG('Code FourCC appliqué à ['+OpenDialog1.Filename+'].',mtInformation,[mbok],0); End else Begin MessageDLG('Le code FourCC a QUATRE caractères !',mtError,[mbok],0); End; end;
Le même code sous Linux affiche la violation d'accès aussi, mais il arrive ensuite à écrire dans le fichier sans problème. Donc ça marche, mais avec un message d'erreur.
En consultant les discussions de ce génial forum et le wiki de Lazarus, j'ai essayé de faire ce qui y était recommandé, en ouvrant le fichier selon la même démarche, mais dans un bloc try avec {$I+}, sans amélioration, au contraire, puisque la procédure est bloquée par le même violation d'accès, mais sans affichage des huit octets dans les ComboBox.
Ça n'a rien de vital, mais ça m'intéresserait, si quelqu'un comprenait ce qui se passe…
Merci.
Partager