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 :

Delphi 7, procedure d'objet


Sujet :

Langage Delphi

  1. #1
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut Delphi 7, procedure d'objet
    Hello,

    Il m'arrive un truc bête et je vais passer pour un débutant mais tant pis.

    Je veux créer une fonction dans une unité, cette fonction utilisant un objet qui nécessite de coder un évènement. Il s'agit du composant TSmtpCli des ICS.
    Dans la fonction, je crée mon objet et je peux assigner des valeurs aux propriétés. Pas de problème !
    Mais je veux coder l'évènement OnSessionConnected.
    Dans un Delphi "d'aujourd'hui", je déclarerai un type "reference to" et je m'en sortirai sans problème. Ou plus simplement avec une fonction anonyme.

    Mais dans un vieux Delphi (le 7 en l’occurrence), je ne sais plus faire :-(
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure MonOnSessionConnected(Sender: TObject; ErrCode: Word);
    begin
      // ............
    end;
     
    // puis
     
    FSmtpCli.OnSessionConnected := MonOnSessionConnected;
    Je ramasse une erreur de types incompatibles. Normal, ma procédure n'est pas une procédure d'objet. Et je ne sais plus comment faire ce genre de chose.

    Qui pourrait me sortir de mon ignorance svp ? :-)

    Papy

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    2 solutions

    1) créer un objet pour y mettre ta méthode

    2) dériver TSMTPCli pour surcharger la méthode qui gère le OnSessionConnected et y mettre ton traitement ou permettre l'appel à une procédure non objet.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    Créer un objet supplémentaire, j'y avais pensé mais j'imaginais une solution sans passer par là.

    Dériver le composant, j'ai essayé mais j'ai du faire une erreur quelque part.
    L’événement est bien déclenché mais le Sender était toujours nil dans le code implémenté.

    Je vais regarder ça de plus près aujourd'hui. Je serai mieux réveillé qu'hier soir

    Merci Paul.

    Sinon, j'avais trouvé ça sur Stackoverflow:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure MyClick(Self, Sender: TObject);
    begin
      //...
    end;
     
    var
      M: TMethod;
    begin
      M.Data := nil;
      M.Code := @MyClick;
      MyMenuItem.OnClick := TNotifyEvent(M);
    end;
    Qu'en penses-tu ? J'ai pas encore testé.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Une déclinaison du principe, au 4-2 de l'article de Laurent Dardenne, avec une fonction MakeProcedureOfObject élégante.
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    Joli

    Merci pour ce lien très intéressant !

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 426
    Points : 24 790
    Points
    24 790
    Par défaut
    Personnellement, je préfère encapulser par une autre classe
    Au lieu d'utiliser directement TSmtpCli dans le code, j'utilise une classe qui l'encapsule par composition (surtout pas héritage) et n'expose que les parties utiles
    Ainsi, demain, tu remplace TSmtpCli par TIdSmtp, sans devoir retoucher tous les codes appelants !

    Par expérience avec Indy qui change régulièrement, c'est la plaie de se taper tous les prototypes qui ont changés !

    Comme tu as encapsulé, tu as une classe et donc tu peux fournir un Event Handler

    La technique du TMethod comme trouvé sur Stackoverflow ou presenté par Laurent Dardenne est possible, c'est juste dommage de ne pas profiter de la OO en repassant en procédurale !
    En général, le retour procédurale te forcera à n'avoir qu'une seule instance de TSmtpCli
    Alors qu'en OO, tu pourrais conserver plusieurs TSmtpCli et plusieurs receveurs d'EventHandler pour ne mélanger les traitements

    Sinon en D7, tu peux fournir une class procedure ça passe normalement pour un TNotifyEvent
    Cela évite d'avoir une instance !

    Self en théorie devrait être la méta-classe, disons que j'éviterais de l'utiliser dans cette situation (même problématique qu'en procédure, perte du receveur de la méthode)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    implementation
     
    type
      TSmtpCliEventHander = class
      private
        class procedure MonOnSessionConnected(Sender: TObject; ErrCode: Word);
      end;
     
     
    class procedure TSmtpCliEventHander.MonOnSessionConnected(Sender: TObject; ErrCode: Word);
    begin
      // ............
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FSmtpCli.OnSessionConnected := TSmtpCliEventHander.MonOnSessionConnected;
    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

Discussions similaires

  1. Delphi, EDI pour Pascal Objet ?
    Par ertyup dans le forum EDI
    Réponses: 2
    Dernier message: 02/06/2010, 11h02
  2. Réponses: 3
    Dernier message: 04/01/2010, 20h32
  3. Delphi - FireBird - Instanciation d'objets à partir d'une BDD
    Par nowayyy36 dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/06/2007, 16h21
  4. Réponses: 3
    Dernier message: 16/10/2006, 12h06
  5. [procedure stockée] objet crypté
    Par hawax dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/04/2004, 18h44

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