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 :

Récupérer le nom du programme


Sujet :

Langage Delphi

  1. #1
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut Récupérer le nom du programme
    Bonjour,

    après recherche infructueuse, je voudrais savoir s'il est possible de récupérer de façon dynamique (à l'exécution) le nom du fichier source dans lequel "se trouve" le programme ?

    Par exemple dans un écran codé dans le source toto.pas, dans le formshow, est il possible de faire afficher, à l'exécution "je suis dans toto.pas" ? Mais sans avoir à écrire en dur dans le source le fameux toto.pas ?

    Le but de ceci serait de pouvoir faire afficher dans tous les écran d'une appli existante qui en compte un paquet, à un endroit ou à un autre, le nom du programme source de l'écran en cours d'affichage.

    Ceci afin de permettre la maintenance de cette appli, car actuellement aucun moyen d'avoir cette info, il faut aller dans le projet, puis remonter via le code (le menu, puis tel ou tel ou bouton, appellant telle ou telle fonction, etc... pour avoir enfin le nom de l'écran sur lequel on a une modif à apporter ou un bug à corriger...).

    Je crains que cela soit impossible, car je suppose que dans le ".exe" final (avec dll ou pas, ici il n'y en a pas, juste un gros exe), on ait plus ce genre d'info, l'exe étant du code compilé... à part les notions d'objet courant et de classe parente, on doit plus avoir trace du nom du ".pas" duquel ce bout de code provient à l'origine...

    J'ai pour le moment comme seule possibilité l'info issue de la commande : TForm(Sender).className, ce qui me donne le nom de la classe parente de la fenêtre, mais pas du fichier source ".pas" (mais bon, c'est déjà pas mal, car cela donne le nom du ".pas" à quelques lettres près, dans la grande majorité des cas, dans cette appli).

    Ou alors, solution brutallement manuelle et fastidieuse, inscrire en dur dans chaque formshow (par exemple) de chaque écran le nom du fichier source dans le titre, ou dans le "hint", ou autre... y'a du choix quoi.

    Par ailleurs, chaque écran de l'appli héritant de TForm, savez vous s'il est possible de modifier le source Delphi de la classe TForm, afin de lui créer une nouvelle fonction, qui affecterait par exemple le "hint" avec une valeur (le className par exemple) ? Cela résoudrait d'un coup d'un seul le pb de la modification un à un des nombreux écrans.

    Merci de m'avoir lu jusqu'au bout.

    EDIT1 : je viens de tester cette possibilité avec les hotkeys :
    http://www.developpez.net/forums/d71...trl-p-alt-p-v/
    Et c'est plutôt un bon début, il me suffit de placer ce code dans la fenêtre principale, et ça répond depuis n'importe quelle autre sous fenêtre...

    EDIT 2 :

    en fait je bloque... après maintes recherches, je ne trouve pas la solution :
    j'ai codé ceci dans le main de l'appli, mais arrivé au casting de h, ça plante :

    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
    // TEST
    procedure TFmMain.WMHotKey(var Msg: TWMHotKey);
    var
      str : string;
      h   : THandle;
    begin
      if msg.HotKey = hotkey1 then
      begin
     
        str := 'Pas de fenêtre enfant détectée';
     
        h := GetForegroundWindow;
     
        if h <> 0 then
          try
            str := TControl(h).ClassName; // plante aussi avec TObject...
          except
          end;
     
        // On définit les action à faire
        ShowMessage(str);
      end;
    end;
    Je veux simplement récupérer par exemple le className de la fenêtre retournée par GetForegroundWindow, mais apparemment on ne peut pas exploiter aussi simplement le handle retourné par cette fonction.

    Quand je déclenche le hotkey, j'arrive bien dans cette procédure, et au moment du casting du handle de fenêtre en Tcontrol ou en TObject, ça plante (acces violation...).

    Quelque soit le casting de h, ça plante... je ne comprends pas pourquoi.

    Je n'ai pas trouvé de réponse en consultant les sujets du forum relatifs à la fonction GetForegroundWindow, ou alors j'ai mal cherché.

    Si vous pouvez m'aider, merci.

    EDIT 3 : PB résolu, mais je suis passé par l'exploitation de la variable Application.Components[]...

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Tu ne peux pas.

    Une application est diffusée sans .PAS ni .DCU ni .DPR etc.

    donc à moins de coder en dur et de logger ce qui ne vas pas, tu ne peux pas le savoir.


    exemple idiot :

    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
     
     
    function TForm.A(aS: string): integer;
    const Link=$010012;
    begin
      if not TryStrToInt(aS, result) then
        setLog(format('%.8x (%s, %d) fail',[Link, aS, result]));
    end;
     
     
    function TForm.B(a1,a2: extended): extended;
    const Link=$010013;
    begin
      try
        result := a1 * (a2*a2);
      except
        on EException do 
          setLog(format('%.8x (%f, %f, %f) fail',[Link, a1, a2, result]));
      end;
    end;
    attention, la chaine de formatage de format est visible dans un editeur hexadecimal !
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 32
    Points
    32
    Par défaut ou sinon...
    Effectivement, on ne peut pas de base...
    Sauf qu'on peut rajouter une constante dans le code source de chaque fichier qui a comme valeur le nom du fichier (en .Pas donc).
    Par la suite, on peut développer un script ou un programme qui parcourt l'intégralité du projet (donc tous les .Pas) pour y mettre dynamiquement la déclaration de la constante avec la valeur correspondant au nom du fichier...
    Un dev en plus donc, mais si le nombre de fichiers est si important, ça peut valoir le coup.

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Question bête : MadExcept sait pas le faire ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. Récupérer le nom du programme
    Par ChipsterJulien dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 10/01/2010, 18h36
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. Récupérer le nom du fichier qui a appelé mon programme
    Par newbiedelphi dans le forum Débuter
    Réponses: 3
    Dernier message: 28/04/2008, 22h59
  4. Réponses: 10
    Dernier message: 21/02/2007, 20h16
  5. Récupérer le nom de la machine locale
    Par Jflgb dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/05/2003, 09h25

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