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

 Delphi Discussion :

[D7] Régler en seulement 3 lignes le bug de l'InitialDir


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut [D7] Régler en seulement 3 lignes le bug de l'InitialDir
    Bonjour

    Je suis peut-être dans une phase de délire, mais suivant de multiples tests ce serait résolu facilement sans aucune manip en BdR ; ni code de dizaines de lignes de grande virtuosité

    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
    var
      sRuse: String;
    begin
      ...
      ...   
        //--- Contrer le bug de l'InitialDir en l'étourdissant ------//
        sRuse      := GetCurrentDir;
        InitialDir := GetCurrentDir;
        sRuse      := GetCurrentDir;
        //-----------------------------------------------------------//
    
        if (sRuse <> '') then
        if Execute then
        begin
          Try
    Merci de me dire si je rêve ou non, car je sais que ce problème peut rendre fou

    Je redonne la manip d'un exemple pour effectuer ce genre de test :

    Suffit d'ouvrir un fichier ailleurs que dans son répertoire et de le lire ; et de fermer ce programme.

    Ensuite de relancer ce programme et regarder le path affiché en OpenDialog.

    Si le path correspond effectivement au dossier contenant cet exe = OK RAS.
    (Sauf forçage prévu/programmé du path)

    Par contre, si le path affiché en OpenDialog est différent = devinez

    J'ai hâte de vous lire, car ce serait trop beau et facile.

  2. #2
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 510
    Par défaut
    Bonjour,

    Je n'ai pas testé ton code, mais regarde la fin de cette discussion pour récupérer le dernier répertoire utilisé

    A+
    Charly

  3. #3
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Charly,

    Oui oui je sais, puisque je pensais également à ce topic aux codes et programmeurs virtuoses

    Mais teste...

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    En D7, je ne sais pas mais en D10, suffit d'une fois pour qu'il prenne en compte le dossier souhaité et non le dernier dossier choisi par le OpenDialog (fonctionnalité OS et non VCL)

    Quel est le phénomène à constater ?
    Est-ce sRuse prend une valeur diffférente ?
    Est-ce Execute qui affiche un dossier différent ?

    Je suis parti sur Execute qui affiche un dossier différent !

    Personnellement, je ne laisse jamais l'InitialDir libre, je le fixe systèmatiquement, soit relatif à l'exe pour un petit programme interne soit stocké dans un système de préférence (un XML ou Ini pour un standalone, DB pour un connecté)

    Après tout, plus le projet grossi plus il y a de risque qu'un code nouveau ait un impact sur un code ancien, je n'utilise jamais les chemins relatifs
    Si j'utilise le dossier de démarrage (celui fourni par le raccourci), je préfère le stocker dès le début pour éviter que le CurrentDir change en cours de route,
    j'ai pris cette habitude, il y a presque 20 ans car en équipe, on ne maitrise pas l'insouciance des autres.


    Sinon en D10, ça suffit

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sRuse: String;
    begin
      with TOpenDialog.Create(nil) do
      try
        //--- Contrer le bug de l'InitialDir en l'étourdissant ------//
         //sRuse      := GetCurrentDir;
         InitialDir := GetCurrentDir;
         // InitialDir := ExtractFileDir(Application.ExeName); // Cette variante aurait de loin ma préférence
         //sRuse      := GetCurrentDir;
        //-----------------------------------------------------------//
     
        //if (sRuse <> '') then
          Execute
     
      finally
        Free();
      end;
    end;
    Comme je le disais GetCurrentDir va savoir si un autre code ailleurs ne vas pas le modifier et donc impact celui-ci.
    Si tu es seul sur ton projet, tu peux le maitriser à peu près mais un jour tu peux intégrer une lib externe, va savoir pourquoi, le dévéloppeur appel SetCurrentDirectory à un moment donnée, paf, code non maitrisé, comportement non maitrisé.

    Sans parler de l'OS qui ajoute un comportement imprévu à cause d'un code laxiste.
    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

  5. #5
    Membre éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Par défaut
    Je viens de tester, effectivement, le code suivant n'a pas le fonctionnement attendu.
    C'est toujours le dernier dossier utilisé qui s'ouvre, même après avoir fermer l'application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFrmMain1.btnOpenClick(Sender: TObject);
    begin
      OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
      OpenDialog1.Execute;
    end;

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    oneDev, as-tu testé en D7 ?

    Car même avec un Dialog posé sur la form (même si je n'en vois pas l'utilité vs le with TOpenDialog.Create(nil) do) en D10, aucun problème.
    Le code de oneDev en D10 a le comportement prévu.

    Après tout D7 date de 2002, des bugs liés à l'OS qui évolue ce n'est pas étrange.

    Mais as-tu testé la ruse aussi puisque c'est la question de ce sujet, le pourquoi du n'importe quoi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TFrmMain1.btnOpenClick(Sender: TObject);
    var
      sRuse: String;
    begin
      sRuse := GetCurrentDir();
      OpenDialog1.InitialDir := GetCurrentDir();
      sRuse := GetCurrentDir();
      OpenDialog1.Execute;
    end
    Si ce code corrige le problème, cela n'a aucun sens sauf si l'on regarde le code de GetCurrentDir

    En D10 GetCurrentDir c'est GetDir(0, Result); soit _WGetDir et c'est un bricolage GetCurrentDirectoryW et SetCurrentDirectoryW.
    En D7, si il y a le même bricolage, est-ce bien protégé sur le Drive 0, il n'y aurait pas un SetCurrentDirectoryA parasite ???
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Une macro pour copier seulement certaines lignes d'un fichier à un autre
    Par asgard78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/10/2010, 14h10
  2. executer un fichier .php seulement en ligne de commande
    Par navorinco dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 10/12/2009, 12h34
  3. Rerendre seulement une ligne d'une liste
    Par monstor dans le forum JSF
    Réponses: 0
    Dernier message: 25/02/2009, 17h31
  4. [ORACLE9i] oracle, seulement en ligne de commande ?
    Par maamar1979 dans le forum Oracle
    Réponses: 1
    Dernier message: 05/06/2006, 14h06
  5. Réponses: 8
    Dernier message: 17/03/2006, 08h06

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