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 :

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;
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".

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.