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... :ccool:
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[]...