Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre chevronné Avatar de peter27x
    Inscrit en
    janvier 2007
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : janvier 2007
    Messages : 1 024
    Points : 603
    Points
    603

    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 :
    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 Expert Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 162
    Points
    1 162

    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 :
    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 Thierry ZIG
    Inscrit en
    octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Nom : Thierry ZIG

    Informations forums :
    Inscription : octobre 2010
    Messages : 32
    Points : 25
    Points
    25

    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 Confirmé Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    mai 2002
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2002
    Messages : 2 245
    Points : 2 627
    Points
    2 627

    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.
    ______________________________________________________________________________________________________________________________________________________________

    Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise - Visual studio 2003
    Win XP Pro - OpenGL 2.1 - Oracle 10g - Firebird 2.5.0.2
    Écrivez dans un français correct !!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •