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 :

Utiliser le with, ou pas pour un simple create


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut Utiliser le with, ou pas pour un simple create
    Bonjour

    Entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      with Vcl.SvcMgr.TEventLogger.Create(SrcEvent) do
        LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vcl.SvcMgr.TEventLogger.Create(SrcEvent).LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
    vous prenez quoi ?

    Quelle différence cachée cela peut-il engendrer ?


    D'ailleurs, en complément,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure WriteEventLog(Msg: string);
    begin
      with Vcl.SvcMgr.TEventLogger.Create(SrcEvent) do
        LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
    end;
    n'ajoute rien dans le journal de Windows. Une idée du pourquoi ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 831
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    TService a une méthode LogMessage, tu n'as pas besoin de créer toi-même un TEventLogger.

    Sinon, with doit apporter une simplification du code, éviter une répétition. Pour une utilisation unique, il est inutile.

    Mais dans ton cas, il manque la libération du TEventLogger, with devient obligatoire puisqu'il n'y a pas de variable assignée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure WriteEventLog(Msg: string);
    begin
      with Vcl.SvcMgr.TEventLogger.Create(SrcEvent) do
      try
        LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
      finally
        Free;
      end;
    end;
    A part ça, ce code est fonctionnel. Tu regarde bien sous Journaux Windows -> Application ?

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    TService a une méthode LogMessage, tu n'as pas besoin de créer toi-même un TEventLogger.


    A part ça, ce code est fonctionnel. Tu regarde bien sous Journaux Windows -> Application ?

    Oui je regarde bien au bon endroit du journal.

    et tu l'écrirais comment alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure WriteEventLog(Msg: string);
    begin
      with Vcl.SvcMgr.TService.Create(nil) do
      begin
        LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
        Free;
      end;
    end;
    retourne une erreur:

    ---------------------------
    Importlistener
    ---------------------------
    Ressource TService non trouvée.
    ---------------------------
    OK
    ---------------------------

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 831
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Est-ce un service que tu développes ou pas
    Tu n'as pas à instancier le service toi-même...

    Si ça n'en est pas un :
    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
    procedure LogEvent(aEventName, aText: string; aEventType :word = EVENTLOG_INFORMATION_TYPE);
    var
      Handle :THandle;
      PMsg   :PChar;
     
    begin
      Handle := RegisterEventSource(nil, PChar(aEventName));
     
      if Handle <> 0 then
      try
        PMsg := PChar(aText);
        ReportEvent(Handle, aEventType, 0, 1, nil, 1, 0, @PMsg, nil);
      finally
        DeregisterEventSource(Handle);
      end;
    end;
    Si tu ne vois toujours rien dans le journal, voir MSDN.

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    Ce n'est pas un service.

    Alors, ton code fonctionne. Mais je pige pas pourquoi le TEventLogger ne le fait pas.
    Si je vais dans le code de Vcl.SvcMgr , on trouve la même chose ( entre le $ELSE et le $ENDIF )

    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
     
    procedure TEventLogger.LogMessage(Message: String; EventType: DWord;
      Category: Word; ID: DWord);
    {$IF DEFINED(CLR)}
    var
      P, PP: IntPtr;
    begin
      if FEventLog = 0 then
        FEventLog := RegisterEventSource(nil, FName);
      P := Marshal.StringToHGlobalAuto(Message);
      try
        PP := Marshal.AllocHGlobal(SizeOf(IntPtr));
        try
          Marshal.WriteIntPtr(PP, P);
          ReportEvent(FEventLog, EventType, Category, ID, nil, 1, 0, PP, nil);
        finally
          Marshal.FreeHGlobal(PP);
        end;
      finally
        Marshal.FreeHGlobal(P);
      end;
    end;
    {$ELSE}
    var
      P: Pointer;
    begin
      P := PChar(Message);
      if FEventLog = 0 then
        FEventLog := RegisterEventSource(nil, PChar(FName));
      ReportEvent(FEventLog, EventType, Category, ID, nil, 1, 0, @P, nil);
    end;
    {$ENDIF}

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    argh .... Je viens de tester en modifiant le nom de la source et ça fonctionne.
    Le nom de l’événement comporte un & et dans ce cas ça ne fonctionne pas.
    Si je l'enlève, l’événement est bien dans le journal.

    C'est documenté quelque part ce truc là ?

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    et au bout du compte,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure WriteEventLog(Msg: string);
    begin
      with Vcl.SvcMgr.TEventLogger.Create(SrcEvent) do
      begin
        LogMessage(Msg, EVENTLOG_INFORMATION_TYPE);
        Free;
      end;
    end;
    fonctionne très bien.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 831
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    J'ai essayé ton code et il fonctionne.

    Donc à part un SrcEvent vide, je ne vois pas !

    EDIT: ok

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    essaie avec toto@machin dans le SrcEvent

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 831
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Ok avec @ mais pas &.

    Je peux pas t'en dire plus

  11. #11
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 502
    Points : 3 133
    Points
    3 133
    Par défaut
    ça ne fait que confirmer que j'ai pas de bol .

    le seul caractère à ne pas utiliser, je m'en suis servi

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

Discussions similaires

  1. Un batch simple enfin pas pour moi
    Par Louis Griffont dans le forum Linux
    Réponses: 9
    Dernier message: 14/10/2009, 12h49
  2. Réponses: 4
    Dernier message: 11/06/2009, 08h53
  3. Recherche d'une regex toute simple (mais pas pour moi)
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 15/04/2009, 16h23
  4. utilisation de WITH pour nommer un résultat
    Par adidmamah dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/01/2009, 17h45

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