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 :

Gestion de messages personalisés.


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut Gestion de messages personalisés.
    J'aimerais creer une serie de messages personalisés qui seront envoyé au sein de mon application (et uniquement local a mon application).

    Ces messages seront envoyé par une sorte de EventManager et j'aimerais que les classes puissent executer les methodes associées et recuperer divers informations transmises.

    J'aimerais calquer mon modele sur celui des WMMouseDown, et du mot clef "message" qu'on associe a une methode....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  2. #2
    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
    Il me semble qu'il faille faire un TComponent posé sur une Form, les messages sont envoyés à la form (tu prend le handle de la form, il me semble TComponent n'a pas de handle, cela vient avec le control ou wincontrol), ensuite la form va se charger de dispatcher les events (regarde comme est fait un composant TClientSocket, pour le message de reception de donnée via OnRead ...), il me semble que c'est la seule méthode pour utiliser le mot clé message, mais je n'en suis absolement pas sur ...

    sinon, espire toi du TCustomWinSocket de ScktComp qui définie sa WndProc pour choper les messages (juste un Dispatch) qui renvoie les message aux méthodes ayant la directive message ... je pense que MakeObjectInstance devrait aussi t'intéresser ...
    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

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Un truc comme ça ?

    Effectivement comme le précise Shai, dans l'exemple ma classe hérite de TWinControl afin d'avoir un contôle fenêtrée.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    const
      WM_PERSO = WM_USER + 1;
     
    type
      TMaClasse = class(TWinControl)
      private
        procedure WMPerso(var Message: TMessage); message WM_PERSO;
      end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
        FMaClasse: TMaClasse;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TMaClasse }
     
    procedure TMaClasse.WMPerso(var Message: TMessage);
    begin
      ShowMessage('Réception de WM_PERSO' + #13#10 +
                  'WParam = ' + IntToStr(Message.WParam) + ', ' +
                  'LParam = ' + IntToStr(Message.LParam));
    end;
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FMaClasse := TMaClasse.Create(self);
      FMaClasse.Parent := self;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FMaClasse.Free;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Assigned(FMaClasse) then
        PostMessage(FMaClasse.Handle, WM_PERSO, $10, $00);
    end;
     
    end.
    [edit]
    Il est tout simple mon exemple, du coup je ne suis pas certain d'avoir bien répondu à ta question.
    [/edit]

    @+ Claudius

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok merci j'y vois deja plus clair.

    Le principe est le suivant : J'ai une Dll qui s'occupe de gerer la partie 3D d'une application.
    Mon application hote declare un composant "plugin" qui charge la Dll et sert de wrapper a l'interface exportee par la Dll pour piloter le "module".
    Voila pour la mise en situation.

    Au sein de cette Dll, je souhaite faire dialoguer plusieurs composants entre eux. Enfin composant au sens "briques" et non "component".
    Par exemple, quand uen frame doit etre dessiné, je dois executer plusieurs methodes situés sur differents objets : le rendu de base, le rendu es objets, le rendu de la skybox, le rendu de l'interface graphique, etc ...

    De la meme maniere, une serie d'evenements "mousemove", "mousedown", etc devront etre dispatché sur les differents objets de l'interface graphique de la 3D (menus, boutons, barre de devilement, ecran d'aide, etc ....) bref le GUI de la 3D.

    Dans mon application, j'ai un TPanel (ou TForm ou tout autre TWinControl) qui me sert de support de l'affichage de la 3D via sont handle transmis au module (qui lui meme le transmet aux APIS 3D utilisé).
    De ce fait, tous les evenements qui ont lieu sur le panel en particulier (mouseDown/Up, etc ...) vont etre transmis au plugin via des methodes FireEvent_XXXX corespondante (en transmettant ainsi les valeurs de l'evenement).

    Au sein de mon Plugin, j'ai une classe qui me sert de centrale d'evenement. le TEventManager, qui a la maniere du TApplciationMessage, recupere les "messages" envoyés a la Dll.
    Donc mes fonctions FireEvent_XXX de mon plugin, utilisent le TEventManager pour dispatcher les messages perso correspondant au sein de mon module.

    Je souhaiterais eviter que chaques composants soient obligé de s'enregistrer manuelement au sein du TEventManager comme desireux de recevoir tel ou tel evenements .... et ainsi de lancer un appel successif a toutes les procedures enregistrée dans le TEventManager sur cet evenement ...

    Note : Mes objets sont tous plus ou moins directement derivé de TObjets et surtout pas graphiques. donc TWinControl a proscrire ...
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    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
    On peut tout à fait intercepter des messages même lorsqu'on ne descend pas de TWinControl, en Delphi. La directive message peut être utilisée dans n'importe quelle classe. Son "argument" doit être un entier positif quelconque.

    Ce système de "messages" n'est pas directement lié aux messages Windows. Les messages Windows passent tous par une seule et unique routine WndProc. Cette routine, dans Delphi, se charge de "dispatcher" les messages vers les bons composants, et ce au moyen de la méthode Dispatch de TObject.

    Cette méthode prend en paramètre un paramètre var non typé. Vous pouvez transmettre n'importe quel type de valeur - de n'importe quelle taille -, mais les deux premiers octets doivent contenir l'ID du message, donc l'argument de message correspondant à ce que vous voulez faire.

    Vous pouvez réutiliser ce fonctionnement pour de nombreux autres cas, comme le tien, Clorish.

    Dans ce cas, les méthodes message doivent toujours prendre comme unique argument un paramètre var du type de votre choix - éventuellement non typé. Le contenu de ce paramètre sera ce que vous aurez envoyé comme paramètre à Dispatch.
    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.

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    cette methode m'interesse.
    Tu aurtais un petit exemple a appliquer a mon cas ?

    mais je vais voir un peu plus loin sur cette optique ...
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    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
    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
    const
      MsgPerso = 5;
     
    type
      TMessagePerso = record
        MsgID: Word;
        UnChampQuelconque: Integer;
      end;
     
      TTaClasse = class(TObject)
      private
        procedure MessagePerso(var Msg: TMessagePerso); message MsgPerso;
      end;
     
    implementation
     
    procedure TTaClasse.MessagePerso(var Msg: TMessagePerso);
    begin
      inherited;
      WriteLn(Msg.UnChampQuelconque);
    end;
     
    procedure DoSomething;
    var
      TaClasse: TTaClasse;
      Msg: TMessagePerso;
    begin
      // ...
      Msg.MsgID := MsgPerso;
      Msg.UnChampQuelconque := 456;
      TaClasse.Dispatch(Msg);
    end;
    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.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok, donc il faut faire appel directement a la methode Dispatch de l'objet .... donc lister dans mon EventManager tous les objets qui desirent etre avertit par au moins un des messages ....

    C'est embetant Mois que precedemetn car on ne gere qu'une seulle liste d'objets et non une par messages mais quand meme

    Apres bien sur, j'imagine qu'en surchargeant la methode dispatch de d'un objet, (mettons le TGUIScreen) on peut repercuter l'appel a dispatch dans les sous objets (GUIPAnels, GUILabels, GUIButtons, etc ... sans avoir a les ajouter au Event Manager ... non ?

    [EDIT] Tu parle de 5 comme code d'evenement .... par rapport a WM_USER ca a une importance ?
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Seb
    Merci (une fois de plus) pour toutes ces infos.

    Citation Envoyé par sjrd Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TTaClasse.MessagePerso(var Msg: TMessagePerso);
    begin
      inherited;
      WriteLn(Msg.UnChampQuelconque);
    end;
    Mais je ne saisi pas très bien l'utilisation d'inherited dans le cas présent. Est-ce parce qu'il s'agit d'une méthode message ?

    @+

  10. #10
    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
    Citation Envoyé par Clorish Voir le message
    Apres bien sur, j'imagine qu'en surchargeant la methode dispatch de d'un objet, (mettons le TGUIScreen) on peut repercuter l'appel a dispatch dans les sous objets (GUIPAnels, GUILabels, GUIButtons, etc ... sans avoir a les ajouter au Event Manager ... non ?
    En effet, c'est tout à fait possible
    Citation Envoyé par Clorish Voir le message
    Tu parle de 5 comme code d'evenement .... par rapport a WM_USER ca a une importance ?
    C'est bien un "code d'événement", ou plutôt "identificateur de message". Il ne doit être supérieur à WM_USER que si tes classes héritent de TWinControl, car dans ce cas il faut éviter la collision avec les messages prédéfinis. Mais sinon, comme je l'ai dit, c'est n'importe quel nombre positif.
    Citation Envoyé par Cl@udius Voir le message
    Mais je ne saisi pas très bien l'utilisation d'inherited dans le cas présent. Est-ce parce qu'il s'agit d'une méthode message ?
    Oui, lorsque tu écris une méthode de message, prends l'habitude d'appeler inherited, sauf si tu veux justement court-circuiter l'interception de ce message par la classe parente.
    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.

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    j'imagine que ca doit etre pour executer le code associé au message dans la classe parente.

    Si par exemple une classe reagit au message WM_MOUSEDOWN et que dans ue nsous classe on decide de reagir au meme evenement via l'interception du message, il faut faire appel a inherited pour executer celui de la classe parente sinon on pert le traitement parent.

    C'est surement pour ca que l'on implemente une methode DoEvenement surchargeable

    [Edit] Post croisé avec SJRD
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    @sjrd et clorish.

    Ok merci pour l'info, c'est bien noté !

    @+ Claudius

Discussions similaires

  1. gestion des messages d'erreurs
    Par keibenoit dans le forum Access
    Réponses: 2
    Dernier message: 31/05/2006, 14h49
  2. gestion photo - message d'erreur
    Par xboulney dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 12h45
  3. [debutant]gestion des messages des exceptions
    Par maxvador dans le forum Langage
    Réponses: 4
    Dernier message: 03/02/2006, 14h55
  4. Gestion du message WM_SYSCOLORCHANGE avec WndProc
    Par yousserr dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 29/07/2005, 08h59
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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