IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Problème à l'ouverture d'un fichier


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 196
    Par défaut Problème à l'ouverture d'un fichier
    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.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Je ne sais pas si ça changera grand chose mais il me semble qu'il faudrait plutôt déclarer S de type string (et non pas string[4]), vu qu'on appelle ensuite la procédure SetLength().

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 196
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Je ne sais pas si ça changera grand chose mais il me semble qu'il faudrait plutôt déclarer S de type string (et non pas string[4]), vu qu'on appelle ensuite la procédure SetLength().
    J'ai fait un essai (sous Windows 64 bits et Ubuntu Studio 64 bits), mais ça ne change rien. L'auteur a dû vouloir réserver le moins de mémoire possible pour sa variable.

    Merci tout de même.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bopnjour,
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Je ne sais pas si ça changera grand chose mais il me semble qu'il faudrait plutôt déclarer S de type string (et non pas string[4]), vu qu'on appelle ensuite la procédure SetLength().
    Je plussoie !
    Avec Delphi, String[4] est un shortstring dont la mémoire est préallouée. Utiliser SetLength ensuite est donc pour le moins inutile !

    Citation Envoyé par Francois_C Voir le message
    L'auteur a dû vouloir réserver le moins de mémoire possible pour sa variable.
    Je me demande si l'auteur savait ce qu'il faisait...

    En effet, BlockRead renvoie également -bien qu'optionnellement- le nombre d'octets lus. Cette valeur doit être affectée à S[0] car avec un shortstring (aka string[4]), cette position contient la longueur réellement utilisé de la chaine.
    Aussi, j'écrirais (sous entendu à tester ) :
    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
    procedure TForm1.BrowseButtonClick(Sender: TObject);
    var
      F : File;
      S : String[4];
      // Ajout
      N : Integer;
    begin
      If OpenDialog1.Execute = True then
      Begin
        // Inutile
        //SetLength(S,4); 
        {$I-}
        AssignFile(F,OpenDialog1.FileName);
        Reset(F,1);
        {$I+}
        If IOResult = 0 then
        Begin
          Seek(F,$70);
          // Modification
          // BlockRead(F,S[1],4);
          BlockRead(F, S[1], 4, N);
          // Ajout  
          S[0] := Chr(N);  // S[0] := AnsiChar(Chr(N)); pour les Delphi 2009 + de mémoire car Chr est un widechar...
          ComboBox1.Text := S;
          Seek(F,$BC);
          // Modification
          // BlockRead(F,S[1],4);
          BlockRead(F, S[1], 4, N);
          // Ajout
          S[0] := Chr(N);  // S[0] := AnsiChar(Chr(N)); pour les Delphi 2009 + de mémoire car Chr est un widechar...
          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;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 196
    Par défaut
    Merci Philippe. J'avais aussi essayé en supprimant SetLength, sans résultat, sauf que ça avait l'air de lire au-delà des quatre caractères : j'avais un cinquième caractère non-ascii à la fin des chaînes affichées dans les ComboBox lors des essais Linux.

    J'ai copié-collé la proposition de modification sans avoir même à la vérifier. Pas une faute de syntaxe, ça compile du premier coup sans erreur, mais hélas, toujours la même violation d'accès...

    PS : C'était du Delphi d'avant 2000 (le binaire date de 2000, j'avais légèrement modifié le code source et recompilé à mon usage en 2003). Aucune modification n'est nécessaire ici du fait que je compile en 64 bits, je pense ?

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par Francois_C Voir le message
    Merci Philippe. J'avais aussi essayé en supprimant SetLength, sans résultat, sauf que ça avait l'air de lire au-delà des quatre caractères : j'avais un cinquième caractère non-ascii à la fin des chaînes affichées dans les ComboBox lors des essais Linux.

    J'ai copié-collé la proposition de modification sans avoir même à la vérifier. Pas une faute de syntaxe, ça compile du premier coup sans erreur, mais hélas, toujours la même violation d'accès...
    Ce soir -mais pas avant-, je regarderai ça, j'aurai Lazarus à disposition, sous windows et Linux...
    Citation Envoyé par Francois_C Voir le message
    PS : C'était du Delphi d'avant 2000 (le binaire date de 2000, j'avais légèrement modifié le code source et recompilé à mon usage en 2003). Aucune modification n'est nécessaire ici du fait que je compile en 64 bits, je pense ?
    Pas sur, les chaines "string" sous Lazarus sont de type utf8 et non ansi comme avec les versions de Delphi jusqu'à 2007 inclus; cela a peut-être une influence...

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 240
    Par défaut
    hello,
    tu as essayé en lazarus 32 bits ? parce qu'il peut y avoir des problèmes en 64 bits avec l'alignement des données.

    Ami calmant J.P

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2007, 09h22
  2. Problème d'ouverture d'un fichier
    Par vallgui dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 27/11/2006, 10h45
  3. [DOM XML] Ouverture d'un fichier xml en php4
    Par opeo dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/11/2006, 12h42
  4. Problème d'ouverture d'un fichier
    Par Matt2094 dans le forum Langage
    Réponses: 14
    Dernier message: 29/03/2006, 14h11
  5. problème d'ouverture d'un fichier EXCEL!!
    Par JauB dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/11/2005, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo