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 :

IDFTP eAccess Violation


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut IDFTP eAccess Violation
    Bonjour tout le monde,

    J'essai d'utiliser le composant TIdFtp fournis avec Delphi 2009.

    pour info : Sous Delphi 7 je n'avais aucun problème

    Je réalise un Splashscreen, durant le démarrage de l'appli je me connect sur un serveur et je recherche la version disponible, si cette dernière est plus récente je propose de la télépcharger.

    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
    procedure TFSplashScreen.Version(Sender: TObject);
    Var
      Versionning: String;
    begin
      sLabel2.Caption := 'Recherche nouvelle version...';
      sLabel2.Visible := True;
      Update; // Me sert à conserve la fenêtre splashscreen par dessus
     
      Versionning := Logiciel.Version;
    // ici on va se connecter sur le serveur pour verifier la version
      Versionning := AnsiReplaceStr(VersionActuelle(Sender,''),'-','.');
     
      if Versionning <> 'erreur' then
      Begin
        if Versionning = Logiciel.Version then
        Begin
          sLabel2.Caption := 'Votre version est à jour.';
        end
        else
        begin
          sLabel2.Caption := 'Mise à jour disponible.';
          Sleep(1000);
          If Application.MessageBox(PWideChar(
          'Une nouvelle version est disponible.'+#13+
          'Version n° '+ Versionning+#13+
          'Voulez-vous la téléchargée ?'),
          PWideChar('Nouvelle version n° '+Versionning),
          MB_ICONQUESTION + MB_YESNO) = 6 then
          Begin
            // On télécharge la nouvelle version
            Cas := 2;
            Download(Sender,'MonLog.exe');
          end
          else
            sLabel2.Caption := 'Téléchargement annulé.';
        end;
      end
      else
        sLabel2.Caption := 'Info sur la version indisponible';
     
    end;
    cette procédure est lancée depuis le dpr par
    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
     
    // ...
     
    begin
      Application.CreateForm(TFPrincipal, FPrincipal);
      FSplashScreen := TFSplashScreen.Create(Application); // On crée la fenetre de Splash
     
      FSplashScreen.Show; // affichage de cette fenetre
     
      FSplashScreen.Update; // On force l'affichage de la fenetre (sinon elle n'apparait que partiellement)
     
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
     
      FSplashScreen.Version(nil);
     
    // ...
    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
    function TFSplashScreen.VersionActuelle(Sender: TObject;Host:String): String;
    Var
      i: integer;
      idFtpVersion : Tidftp;
    begin
      result := '';
      idFtpVersion := nil;
      Try
        Try
          idFtpVersion := TIdFTP.Create(Self);
          With idFtpVersion do
          begin
            Host := '*************';
            Username := ********;
            Password := ********;
            Connect;
            ChangeDir('monlog/version');
            List(nil);
            for i:=0 to Pred(DirectoryListing.Count) do
            Begin
    // ici on lit simplement le nom du fichier avec l'extension txt qui comporte la version.
              if (ExtractFileExt(DirectoryListing[i].FileName) = '.txt') and (DirectoryListing[i].ItemType = ditFile) then
                Result := ChangeFileExt(DirectoryListing[i].FileName,'');
            end;
          end;
        Except
          Result := 'erreur';
        end;
      finally
        if assigned(idFtpVersion) then idFtpVersion.Free;
      end;
    end;
    L'erreur apparait au moment ou je fais le application.Messagebox d'ailleur j'ai tenter de placer un showmessage juste avant la ligne
    Versionning := AnsiReplaceStr(VersionActuelle(Sender,''),'-','.');

    Figurez-vous que je vois mon showmessage, mais là même pas le temps de faire Ok que j'ia un beau AccessViolation, et même au pire je le place juste après la ligne et bien mon showmessage s'affiche et boom même problème.

    Alors là je nage dans le délire, je peux même pas essayer de détecter l'endroit de mon erreur, aucun showmessage ou autre application.messagebow apparait, je me demande même si c'est carrément pas eux qui génére les bug ?

    Auriez-vous une idée ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 519
    Points : 25 037
    Points
    25 037
    Par défaut
    Utilise OutputDebugString et le Journal d'Evènement de Delphi pour débugger ...

    sLabel2 ? c'est vilain comme nommage, lblStatutMessage aurait été plus pertinent non ?

    A quoi ces Sender ?
    C'est pas un évènement, tu encombre ton code pour rien

    Ne joue pas avec les PWideChar et le Ansi en Delphi 2009 ... normalement une constante chaine en 2009 set une UniCodeString ... essaye autre chose que MessageBox, un MessageDlg, c'est quand même plus lisible d'utiliser du String que du PChar, ... utilise aussi un Format, c'est encore plus simple ...

    AnsiReplaceStr gère le multi-octet, je n'ai pas 2009 et j'ai encore installé 2010(pourtant j'ai une licence archi)

    c'est vilain tes libérations, les try sont mis en dépit du bon sens ...

    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
    try  
      idFtpVersion := TIdFTP.Create(nil); // Pourquoi ajouter le compo dans Self, et jouer avec les notifications, c'est source de soucis ça ! et cela prend du temps pour rien ... allez Owner à nil ... 
      Try
          With idFtpVersion do
          begin
            Host := '*************';
            Username := ********;
            ...
          end;
      finally
         idFtpVersion.Free;
      end;
    Except
      on E: EOutOfMemory do // ouais c'est rarement maintenant ...
        ... 
      on E: EIdException do // erreur générique Indy ...
        ...
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bien,

    Merci de ton aide.

    Pour la petit histroire des Try finnaly except... euh je suis pas trop d'accord.
    Le finnaly s'éxecutant dans tous les cas (même en cas de déclenchement d'une erreur) je suis sur que le Free se fera.

    J'ai changer mon Self en nil dans la création du IdFtp, j'ai tout de même mis les finnaly et except pour voir. et bien toujours pareil (avec showmessage, messagedlg ou messagebox

    En fait si je retire absolument tout les messagedlg dans mon Splashscreen, et bien il télécharge le fichier, avec ma fenêtre de splashscreen qui reste bloqué sans m'informer de l'avancement (et pourtant j'ai tout bien mis dans les 3 évenement du download !!) hallucinant

    Dés que j'essai de placer un quelqueconque messagebox, j'ai instantanément une erreur... et même si je place un Opendialog.execute boom même problème.


    Je me demande pourquoi !! alors que sous delphi 7 je le faisais sans aucun souci ?
    exist-t-il des probleme sous D2009 lié à un splashscreen issu du dpr qui enverrais des erreurs sur les evenements de messagebox ?

    Merci.

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Re,

    Je viens de detecter la source du problème.

    Dans mon DRP je fais cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // ...
    {$R *.res}
     
    begin
      Application.CreateForm(TFPrincipal, FPrincipal);
      FSplashScreen := TFSplashScreen.Create(Application); // On crée la fenetre de Splash
     
      FSplashScreen.Show; // affichage de cette fenetre
     
      FSplashScreen.Update; // On force l'affichage de la fenetre (sinon elle n'apparait que partiellement)
     
     // ...
    Si je mets en commentaire la ligne
    Application.CreateForm(TFPrincipal, FPrincipal);
    Cela fonctionne, tous les message apparaisse et le download également.

    J'ai essayer de vider le create de la FPrincipal, mais rien y fait.

    Comment résoudre ce phénomène ?

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 065
    Points
    41 065
    Billets dans le blog
    62
    Par défaut
    suggestion bête ?
    pourquoi ne pas descendre le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Application.CreateForm(TFPrincipal, FPrincipal);
    sous
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Serge, comment va...

    En fait cela fonctionne maintenant et j'ai effectivement déplacer la createform principal apres la fermeture du splashscreen.
    Mais cela ma obligée d'ajouter des composants qui était utiliser dans le create de la form principal, c'est un moindre mal.

    J'ai laissé ouvert ce poste juste pour savoir pourkoi avec un splashscreen les dialogs délire, si quelqu'un avait eu ce genre de problème.

    A plus.

Discussions similaires

  1. EAccess violation a la fermeture de l'application
    Par mat777 dans le forum Langage
    Réponses: 27
    Dernier message: 20/05/2008, 19h47
  2. Delphi 7, Indy 10, IdFTP.pas et Access violation
    Par kernigansnotdead dans le forum Composants VCL
    Réponses: 4
    Dernier message: 04/02/2008, 09h10
  3. erreur Eaccess violation dans module ntdll.dll
    Par cilies38 dans le forum Langage
    Réponses: 1
    Dernier message: 05/05/2006, 20h12
  4. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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