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 :

Récupérer le nom de l'unité et de la fonction en cours


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut Récupérer le nom de l'unité et de la fonction en cours
    Bonjour à tous ,

    Dans le code sur le lequel je travaille actuellement, tous les fonctions ou précédures sont codées à l'intérieur d'un try except.

    L'appel de la trace utilise le nom de l'unité en cours et le nom de la fonction en cours.

    Ces informations sont renseignés en dur lors de l'écriture d'une nouvelle fonction ou procédure et ceci pour dans toutes les unités

    Connaissez vous un moyen de récupperer dynamiquement ces informations ?

    Exemple d'une proc codée actuellement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    procedure TFrmTerminPort.TbShtIntegrationShow(Sender: TObject);
    begin
     
      try
        RafraichirListeColisaIntegrer;
      except
        ModFenetrePrincipale.GEClient.TraceErreur('FrmTerminPort',     Self.ClassName,
          'TbShtIntegrationShow');
        raise; //Redéclenchement de l'exception
      end;
    end;


    Merci d'avance

    A bientôt

    Pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Le nom de l'unité tu peux à la limite le récupérer au moyen des RTTI de la classe.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour Eric,

    Merci pour ton aide,

    Je viens de tester tes exemples,

    Pour info le 2ème où les instructions sont sur la même ligne
    cela ne fonctionnent pas chez moi. (Ma config Delphi 7.1 Entreprise / W2000 )

    Pas de problème par contre pour le premier exemple, mais je ne vois pas bien comment je peux le rapprocher de mon besoin.

    Il est vrai que je n'ai pas de compétence en assembleur.

    Je creuse encore le sujet...

    Le but étant de gagner en rédaction de procedure , en utilisant un template

    A+

    pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonsoir srjd,

    je regarde du coté des RTTI et, je te tiens au courant.

    Merci
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par pitango
    Pour info le 2ème où les instructions sont sur la même ligne
    cela ne fonctionnent pas chez moi. (Ma config Delphi 7.1 Entreprise / W2000 )
    Pour mon information personel, est-ce que tu peux être plus explicite lorsque
    tu dis que ca fonctionne pas...ca compile pas? ca donne pas le numéro de ligne ou voir même ca plante?

    Citation Envoyé par pitango
    mais je ne vois pas bien comment je peux le rapprocher de mon besoin.
    Si tu tiens absolument à afficher le nom de la fonction en cas de bug...
    c'est vrai que ca ne t'aidera pas... par contre, si tu affiche le numéro de ligne
    au lieux du nom de la fonction, un p'tit saut dans le code source et bingo!
    tu sais exactement où l'erreur c'est produite.

    ton code template à ce mement là va ressemenbler à ceci...:
    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
     
    try
        RafraichirListeColisaIntegrer;
      except
        //*********************************************
        //*** Recuperation du numero de ligne DEBUT ***
        {$IFOPT C- } {$C+} {$DEFINE RemettreAOff} {$ENDIF}
        Assert( TOUJOURS_UN=1); asm; @@bidon:; push edx; Push eax; mov edx,offset @@bidon; mov eax,cs:[edx-$13];mov dword ptr LineNumber,eax;pop eax;pop edx; end;
        {$IFDEF RemettreAOff} {$c-} {$ENDIF}      //***
        //*** Recuperation du numero de ligne FIN   ***
        //*********************************************
        ModFenetrePrincipale.GEClient.TraceErreur('FrmTerminPort',     Self.ClassName,
          'à la ligne: '+IntToStr(IntToStr(LineNumber) );
        raise; //Redéclenchement de l'exception
      end;
    si tu choisie cette voie, tu dois garder une copie du code telle que compilé...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Attention au "asm; @@bidon:; push edx;" qui ne compile pas il faut écrire "asm; @@bidon: push edx;"

    Ta demande pitango, m'a intéressé, j'ai donc pondu, avec l'aide des directives founi par Eric, ceci, sans passer par de l'assembleur mais le gestionnaire normale de delphi pour les Assertions ..., je l'avais déjà fait à la sauvage, mais je l'ai mis en forme proprement ce coup ci

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // Variable Globales déclarées dans une unité commune, pour ranger les choses ...
     
    const
      MSG_OVERLOAD_ASSERT_RAISE = '%s'#13#10'Unité : %s'#13#10'Ligne : %d'#13#10'Addresse : $%x';
    var
      SystemAssertErrorProc: TAssertErrorProc;
      FlagAssert: Boolean = False;
      AMessage, AFilename: string;
      ALineNumber: Integer;
      AErrorAddr: Pointer;
     
    procedure OverLoadAssertErrorProc(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
    begin
      AMessage := Message;
      AFilename := Filename;
      ALineNumber := LineNumber;
      AErrorAddr := ErrorAddr;
    end;
     
     
    // Code à recopier 
        {$IFOPT C- }
          {$DEFINE ASSERTIONS_WAS_OFF}
          {$C+}
        {$ENDIF}
        SystemAssertErrorProc := AssertErrorProc;
        try
          AssertErrorProc := OverLoadAssertErrorProc;
          Assert(FlagAssert, Exception(ExceptObject()).Message);
          raise ExceptClass(ExceptObject().ClassType).CreateFmt(MSG_OVERLOAD_ASSERT_RAISE, [AMessage, AFilename, ALineNumber, Integer(AErrorAddr)])
        finally
          AssertErrorProc := SystemAssertErrorProc;
        end;
        {$IFDEF ASSERTIONS_WAS_OFF}
          {$C-}
        {$ENDIF}
    Le Seule problème que j'ai avec cette méthode, c'est la duplication de code effroyable, dommage que la ligne c'est la ligne de l'Assert et non du code

    Donc tu ne peux pas l'utiliser dans OnException de l'application, dommage, c'est cela qui m'aurait interessé savoir où à eu lieu une exception non catché

    Donc, pour l'unité, tu peux utiliser ce Code (à recopier dans chaque unité, les variables si pas de multi thread on peut les mettre dans une seule unité), pour la Méthode, ... hum, je m'y suis penché dessus, faudrait déjà avoir des méthodes publiées dans un objet héritant de TPersistant (voir {$M+}) (published) pour récupérer l'info dans le RTTI, ensuite faudrait trouver l'@ de la proc en cours (en ASM surement, ça doit bien être empilé quelque part, probablement, un truc avec le RET)

    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
    function WhereIAm(): string;
    begin
      FlagAssert := False;
      {$IFOPT C- }
        {$DEFINE ASSERTIONS_WAS_OFF}
        {$C+}
      {$ENDIF}
      SystemAssertErrorProc := AssertErrorProc;
      try
        AssertErrorProc := OverLoadAssertErrorProc;
        Assert(FlagAssert);
        Result := AFilename;
        AMessage := '';
        AFilename := '';
        ALineNumber := 0;
        AErrorAddr := nil;
      finally
        AssertErrorProc := SystemAssertErrorProc;
      end;
      {$IFDEF ASSERTIONS_WAS_OFF}
        {$C-}
      {$ENDIF}
    end;
    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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Merci ShaiLeTroll pour ton aide,

    Pour Eric : Effectivement, je ne pouvais par compiler .

    Il vrai que je cherche vraiment à récupérer le nom de la fonction utilisé,
    car cela s'inscrit dans une maintenance. Et je dois garder certaines techniques de codage utilisées surtout que ce code a plusieurs années et des milliers de lignes, je me vois pas tout reprendre.

    Je ne pourrais pas le justfier.

    Surtout que c'est pour un confort de programmation et ne pas être obliger à chaque fois d'eefectuer la correction à la main.

    En tout cas, grace à ton code cela m'ouvre de nouvelles possibilité (peu être sur un autre projet)


    Je vais tiens au courant de mes recherches (je pourrais m'y remttre dans le week end)

    A+

    Pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Attention au "asm; @@bidon:; push edx;" qui ne compile pas il faut écrire "asm; @@bidon: push edx;"
    Mais ici avec D5 les 2 façons compiles.?.?.
    Merci! Je vais garder cependant cette correction!

    Ta façon sans assembleur m'intéresse beaucoup.
    j'ai cependant quelques difficulté à la mettre en oeuvre.

    Est-ce que tu peux me confirmer la définition de
    TAssertErrorProc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TAssertErrorProc = procedure (const Message, Filename: string;
                                      LineNumber: Integer; ErrorAddr: Pointer);
    lorsque j'appele ta fonction, j'ai une erreur :
    Access Violation at address 0048FA2A in module 'exename.exe'. Read of address 000004
    Citation Envoyé par pitango
    En tout cas, grace à ton code cela m'ouvre de nouvelles possibilité (peu être sur un autre projet)
    y a peut-être une autre passe passe à effectuer... si on pouvait facilement
    récupérer l'adresse de la fonction...avec self.MethodName() on pourrait
    alors convertire l'adresse en texte.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je suis en D6 Entreprise, pour info, et l'ASM semble plus tatillons donc ^_^, mais le ; n'a effectivement pas ça place puisque le label "fait partie" de l'instruction indiquée ...

    donc pour TAssertErrorProc, c'est bien ça, dans l'unité system (ligne 727 pour D6)

    Avec quelle fonction tu as une violation d'accès ? et à quelle endroit ?

    pour self.MethodName(), cela ne fonctionnera que si publié et hérité de TPersistent ... je suis en plein dedans en ce moment ...
    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

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    lorsque cette ligne s'execute...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Assert(FlagAssert, Exception(ExceptObject()).Message); //<-- Ici exception!
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Le probleme c'est que je l'appele lorsqu'il n'y a pas d'exeption en cours...

    donc ExceptObject() = nil;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    la fonction WhereIAm() (bloc 2 de code) peut être utilisé n'importe où ... (j'ai modifié hier le code, il n'y a pas de Message dans l'Assert)

    le code à recopier (bloc 1 de code) contenant "Assert(FlagAssert, Exception(ExceptObject()).Message);" est comme le tient, c'est dans un Try ... Except ... end; seulement

    méfie toi, j'ai édité mon message Hier à 20h40, donc tu as peut-être pris une version foireuse ...
    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

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Le Seule problème que j'ai avec cette méthode, c'est la duplication de code effroyable, dommage que la ligne c'est la ligne de l'Assert et non du
    l'idée c'est de tout mettre sur la même ligne...ca devient très utile de
    cette facon...

    Si je "travestie" ton code pour remplacer mon code assembleur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Type //Need it for D5
    TAssertErrorProc = procedure (const Message, Filename: string;
                                      LineNumber: Integer; ErrorAddr: Pointer);
    //variable global
    SAEP: TAssertErrorProc; //SAEP= SystemAssertErrorProc
    AMessage, AFilename: string;
    ALineNumber: Integer;
    AErrorAddr: Pointer;
    Procedure pour Overloader la procedure AssertErrorProc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure OverLoadAssertErrorProc(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
    begin
      AMessage := Message;
      AFilename := Filename;
      ALineNumber := LineNumber;
      AErrorAddr := ErrorAddr;
    end;
    et en recopiant ce code un peu partout, j'obtiens le noms du fichier
    et le numéro de la ligne sans avoir du code asm...et ce pour faire des log très intéressant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      //=== Recuperation des info debut ===
      {$IFOPT C- } {$DEFINE ASSERTIONS_WAS_OFF} {$C+} {$ENDIF}
      SAEP := AssertErrorProc; try AssertErrorProc := @OverLoadAssertErrorProc; Assert(FALSE); finally AssertErrorProc := @SAEP; end;
      {$IFDEF ASSERTIONS_WAS_OFF} {$C-} {$ENDIF}
      //=== Recuperation des info Fin ===
      LogToFile(Now(),AFilename,ALineNumber);
    Je vais modifier mon exemple et ressoumettre cette nouvelle procedure
    pour la FAQ. C'est beaucoup mieux ainsi....Merci ShaiLeTroll!

    Et Si jamais on vient à bout du nom de la procedure en plus, alors là!

    Personellement, je pense que ce serait bien que ca puisse fonctionner même
    si on n'est pas à l'intérieur d'un objet...mais bon c'est peut-être pas évident.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonsoir,

    et encore encore pour votre aide, je m'exerce à employer vos
    méthodes,mais malheuresement je peux pas pour le moment faire
    avancer le sujet qui est partie sur une voie un peu trop complexe pour moi.

    Je suis avec grand intérêt les avancements sur le sujet.

    Je laisse encore le post ouvert , par rapport au nom de la fonction.

    Pour le nom de l'unité et donc du fichier ainsi que pour le numéro de la ligne

    pas de problème, cela va être très utile.

    A bientôt

    Pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonjour,

    En ajoutant l'unité ExceptLog.pas, et en compilant ton projet avec les information de debugage TD32, tu recupéres un log de tes exceptions, avec toutes les informations nécessaires.
    Un exemple de fichier de sortie:
    --------------------------------------------------------
    New exception:
    Exception code: 3221225477
    Exception flags: 2
    Number of parameters: 2
    Routine @Controls@TControl@SetAlign Find error: 0042C140
    call stack - 0 : Routine @Forms@TCustomForm@AfterConstruction Find error: 00444873
    call stack - 1 : Routine @Forms@TApplication@CreateForm Find error: 0044BECC
    call stack - 2 : Module Project1.dpr Routine initialization Line 12 Find error: 004517C8
    call stack - 3 : (no debug info) Find error: 7C816FD3
    call stack - 4 : (no debug info) Find error: FFFFFFFC
    Pour que cela fonctionne, il faut aussi inclure l'unité MemCheck.

    Par contre cela ne fonctionne que pour les exceptions.

    Cordialement,
    Benjamin

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    à tous pour vos réponses

    J'ai utilisé l'unité easylog de Eric Boisvert pour obtenir les noms de fonctions ou procédures.

    http://www.developpez.net/forums/sho...ssertErrorProc
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

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

Discussions similaires

  1. 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
  2. Réponses: 10
    Dernier message: 21/02/2007, 20h16
  3. Récupérer le nom de domaine d'appartenance d'un serveur
    Par Laurent Dardenne dans le forum Windows
    Réponses: 2
    Dernier message: 26/01/2004, 17h01
  4. Récupérer le nom de l'utilisateur sous linux
    Par Michaël dans le forum POSIX
    Réponses: 7
    Dernier message: 25/12/2003, 21h38
  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