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

Langage Delphi Discussion :

Impossible de bloquer une exception : ERREUR JPEG #42


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut Impossible de bloquer une exception : ERREUR JPEG #42
    Bonjour,
    Voilà j'aimerais bloquer un message d'erreur causé lors de l'ouverture d'une image dans un TPicture. Si j'essaye d'ouvrir une image JPG de taille 0 octet, j'ai le message d'erreur suivant : "ERREUR JPEG #42".
    J'ai essayé le code suivant pour bloquer le message, mais ca ne fait rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ImgTest := TPicture.Create;
      Try       
        ImgTest.LoadFromFile(nomImg);
        Except
          On e : Exception do begin
            //
            end;
          end;
      FreeAndNil(ImgTest);
    J'ai l'impression que ce n'est pas une exception. Y a t-il un moyen de bloquer ce message? Sinon y a t-il un moyen de tester l'intergrité d'une image avant et l'ouvrir seulement si il n'y a pas d'erreur.

    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Peut-être ça :

    Ouvre le fichier nomImg dans un TFileStream... Vérifie que FileStream.Size est différent de 0, et si c'est bien le cas alors utilise la méthode TPicture.Graphic.LoadFromStream !

    Il me semble que ça devrait fonctionner...
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    If faut decocher l'option : "Options - Options du deboggeur - Exception du Language - Arreter sur Exception delphi"

    sinon les excpetion ne sont pas "captées" depuis l'IDE Delphi mem avec un Try. Mais lance l'exe sans passer par Delphi, Tes Exceptions seront captee par le Try.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    si tu es en mode debug, c'est normal . Ce problème survient-il lors de l'exécution "autonome" (sans passer par l'IDE Delphi) ?
    7 fois à terre, 8 fois debout

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Bestiol > Merci je suis désolé j'aurais du dire que je l'avais déjà fait. Ca marche, mais pour une autre erreur n'ayant pas de rapport avec la taille j'ai peur qu'il me renvoi une fenêtre.
    Le but était de bloquer l'erreur quelque soit cette erreur.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Clorish & Higgins > J'ai le message en mode debug et normal.

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Salut,

    c'est une erreur dans le source jpeg.pas qui n'est pas fournit avec Delphi : seul le dcu est fournit.
    Pour trapper l'exception il ne te reste que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.ApplicationOnException(Sender: TObject;
      E: Exception);
    begin
      if E.ClassName = 'EJPEG' then
        // Gérer l'erreur;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnException := ApplicationOnException;
    end;
    Remarque bien la classe EJPEG n'est pas accessible en dev, c'est pourquoi on passe par le nom de classe (classname).
    Comme le load d'un jpeg est multithreadé, il est asynchrone. Donc pour gérer l'erreur, il est nécessaire de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button4Click(Sender: TObject);
    var ImgTest : TImage;
    begin
      Try
        Image1.Picture.LoadFromFile('d:\essai.jpg');
      Except
        on e : EInvalidGraphic do
          showmessage(e.message);
      end;
      Application.Processmessages;
      Showmessage('fin de load image');
    end;
    Si tu ne mets pas le Application.processmessages tu vois apparaitre 'fin de load image' avant la gestion d'erreur.

    Bref, le mieux est de récupérer le fichier JPEG.pas quelque part et de regarder comment ca se comporte.
    Voici un lien qui explique un peu en anglais comment le recompiler pour pouvoir gérer l'exception EJPEG :
    http://groups.google.fr/groups?q=delphi+exception+ejpeg&hl=fr&lr=&selm=6ii99f%24o3314%40forums.borland.com&rnum=1

    Bon courage.

  8. #8
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    J'aimerais infirmer quelque chose :

    Citation Envoyé par ElNan
    le source jpeg.pas qui n'est pas fournit avec Delphi : seul le dcu est fournit
    Effectivement il n'est pas installé par défaut, ce .pas, mais il est dispo sur le CD de Delphi dans un répertoire "Info\Extras\jpeg" avec les sources en C également...

    Je parle pour ma part de D7 pro.

    Si jamais tu veux ce fichier YanK, je ne pense pas qu'il soit illégal que je te l'envoie ??
    Envoie-moi un MP avec ton mail si ça t'intéresse !

    Bonne prog' !
    Bestiol.
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    ElNan & Bestiol > Merci à tous les deux je vais chercher ce qu'il faut modifier avec tout ce que vous m'avez donné. Et je posterais ce que j'ai fait.
    ElNan > Merci pour ton lien je vais le lire attentivement.
    Bestiol > Merci beaucoup, j'ai aussi la version Pro et j'ai trouvé le fichier garce à ton aide.

  10. #10
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Très bien alors bon courage !
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Je crois que je me suis senti plus fort que ce que j'etais.
    Je ne trouve pas ce que je dois changer dans le jpg.pas pour qu'on puisse bloquer les exceptions.

  12. #12
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Hey hey !!

    Pas de découragement !

    Ce qu'il faut que tu fasses (d'après la lecture de la news sur google) :
    -faire une backup de JConsts.dcu et jpeg.dcu (ils seront remplacés par ta version) qui se trouvent dans le répertoire 'lib' et non dans 'bin' !
    -copie jconsts.pas et jpeg.pas de ton CD sur ton disque dur, dans le répertoire 'lib'
    -ouvre jpeg.pas et trouve, aux lignes 962/963 environ, ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      EJPEG = class(EInvalidGraphic);
    Il faut que tu déplaces ces deux lignes au niveau du "first type statement", donc j'imagine au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TJPEGData = class(TSharedImage)
    Ensuite tu recompiles, tu vérifies que les dcu ont bien été remplacés et tu devrais normalement pouvoir utiliser "on e: EJPEG do" dans un bloc "try..except" !

    Vala vala, j'espère que ça marchera !
    Bonne prog' !
    Bestiol.
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Je ne comprend pas il me dit "identificateur EJPEG non déclaré".

  14. #14
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Sur quelle ligne bloque-t-il quand il te dit ça ?!

    Je viens de tester, mais je me rends compte que j'ai oublié deux choses :
    Il faut que tu copies les fichiers obj du CD avec ton .pas, et aussi, bien sûr, ton code final au début doit être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      EJPEG = class(EInvalidGraphic);
     
      TJPEGData = class(TSharedImage)
      private
      ....
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Il bloque sur le EJPEG que j'ai dans mon code à moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ImgTest := TPicture.Create;
      Try
        ImgTest.LoadFromFile(nomImg);
        Except
          On e : EJPEG do begin
            ShowMessage('Mon message : '+e.Message);
            end;
          end;
      FreeAndNil(ImgTest);

  16. #16
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Ah...

    Si tu as bien le même code que celui que j'ai copié dans jpeg.pas, c'est que tu ne références pas la bonne unité dans les uses je pense !

    Supprime les fichier jconsts.dcu et jpeg.dcu et recompile... S'il ne trouve pas l'unité jpeg peut-être qu'il te faut ajouter 'lib' aux chemins de recherche !
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Je comprend plus rien
    Maintenant j'ai une erreur quand je compile jpeg.pas
    Il me dit ca: (ligne 873)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Déclaration forward ou external non satisfaite : 'jpeg_save_makers'
    [edit]
    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    external {$IFDEF JPEGSO} 'libjpeg.so' name 'jpeg_save_markers' {$ENDIF};

  18. #18
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut


    T'es sûr d'avoir bien touché uniquement au type EJPEG ???

    Tu as juste à faire un couper/coller de EJPEG = class(...); au desus de la définition de la première classe de l'unité, et à copier les bons fichiers... Ca ne devrait pas te donner ce genre d'erreur !
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 161
    Points : 116
    Points
    116
    Par défaut
    Oui c'est tout ce que j'ai fait un couper coller.
    Voila le debut de mon jpeg.pas :
    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
    unit jpeg;
     
    interface
     
    uses 
      Windows, SysUtils, Classes, Graphics;
     
    type
      EJPEG = class(EInvalidGraphic);
      TJPEGData = class(TSharedImage)
      private
        FData: TCustomMemoryStream;
        FHeight: Integer;
        FWidth: Integer;
        FGrayscale: Boolean;
      protected
        procedure FreeHandle; override;
      public
        destructor Destroy; override;
      end;

  20. #20
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Citation Envoyé par YanK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Déclaration forward ou external non satisfaite : 'jpeg_save_makers'
    Vérifie bien que tu n'aies pas sans le vouloir supprimé un 'r' à la ligne 872... car le nom de la procédure est jpeg_save_maRkers et non jpeg_save_makers !!!
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2011, 09h47
  2. Réponses: 4
    Dernier message: 02/12/2010, 14h38
  3. Réponses: 2
    Dernier message: 16/01/2008, 19h13
  4. erreur :"une exception s'est produite"
    Par leborg dans le forum ASP
    Réponses: 11
    Dernier message: 02/03/2004, 15h09
  5. Réponses: 3
    Dernier message: 01/11/2002, 14h30

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