Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Langage
Langage Tout ce qui concerne le langage (POO, syntaxe, message d'erreur...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 14h16   #1
peter27x
Membre expérimenté
 
Avatar de peter27x
 
Inscription : janvier 2007
Messages : 997
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 997
Points : 573
Points : 573
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[]...
peter27x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 01h33   #2
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 16h39   #3
Ziginou
Nouveau Membre du Club
 
Thierry ZIG
Inscription : 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.
Ziginou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h19   #4
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

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

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 358
Points : 2 358
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
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h56.


 
 
 
 
Partenaires

Hébergement Web