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

Lazarus Pascal Discussion :

Comment utiliser SendMessage ? [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Comment utiliser SendMessage ?
    Bonjour

    Je commence a utiliser Lazarus sous Ubuntu 64.

    Et d'aprés les exemples de la documentation je devrais pouvoir utiliser sendmessage. mais mon petit programme ne fonctionne pas.

    Dans une form j'ai mis in TEdit et un bouton el lorsque je fais click sur le bouton je veux que le char 'a' apparaisse dans le tEdit

    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
       PostMessage(Handle,LM_CHAR,ord('a'),0);
    end;

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Je pense qu'il faut que tu mettes le handle de ton TEdit comme premier paramètre.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Comment utiliser sendmessage?
    Citation Envoyé par wormful_sickfoot Voir le message
    Je pense qu'il faut que tu mettes le handle de ton TEdit comme premier paramètre.
    Je viens d'essayer avec Edit1.handle et ça ne marche pas no plus

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Tu as un lien vers la documentation à laquelle tu te réfères dans ton premier message ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    Tu as un lien vers la documentation à laquelle tu te réfères dans ton premier message ?
    oui.

    dans mon système UBuntu 64 lazarus est installé dans
    /usr/lib/lazarus

    et le projet que j'ai pris de base pour mon test se trouve dans
    /usr/lib/lazarus/0.9.28.2/examples/messages

    c'est l'example project1 il marche avec le message de l'example mais je n'arrive pas avec les messages du clavier.

    voila le code

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    unit Unit1; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
      LMessages, LCLIntf,LCLType, EditBtn;
     
    // jai ajouté LCLintf et LCLType 
     
    const
      LM_MY_MESSAGE = LM_USER + 1;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        procedure MyMessageHandler(var Message: TLMessage); message LM_MY_MESSAGE;
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1; 
     
    implementation
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      {
       SendMessage sends it directly to control without waiting while other events
       become processed. So SendMessage acts as Control.Perform()
     
       As result you will see in memo such lines:
         1. Sending message
         2. Got message
         3. Exiting Button.Click()
      }
      Memo1.Lines.Add('--------------------------------');
      Memo1.Lines.Add('Sending message by <SendMessage>');
      SendMessage(Handle, LM_MY_MESSAGE, 1, 0);
      Memo1.Lines.Add('Exiting Button.Click()');
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      {
       PostMessage add message at the bottom of message queue, so you will get it only
       after other events become processed. You can use PostMessage to postpone some
       operations.
     
       As result you will see in memo such lines:
         1. Sending message
         2. Exiting Button.Click()
         3. Got message
      }
      Memo1.Lines.Add('--------------------------------');
      Memo1.Lines.Add('Sending message by <PostMessage>');
      PostMessage(Handle, LM_MY_MESSAGE, 2, 0);
      Memo1.Lines.Add('Exiting Button.Click()');
    end;
     
    // Début Modification
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      PostMessage(edit1.Handle,LM_CHAR,ord('a'),0);   //ne marche pas
        SendMessage(Handle, LM_MY_MESSAGE, 1, 0);
        SendMessage(Memo1.Handle,LM_CHAR,ord('A'),0);   //ne marche pas
        SendMessage(edit1.Handle,LM_KEYDOWN,VK_A,0);   // ne marche pas no plus
    end;
     
    // fin modification 
     
    procedure TForm1.MyMessageHandler(var Message: TLMessage);
    var
      S: String;
    begin
      {
       Message handler
      }
      case Message.wParam of
        1: S := '<SendMessage>';
        2: S := '<PostMessage>';
      else
        S := '<unknown>'
      end;
      Memo1.Lines.Add('got message from: ' + S);
    end;
     
    initialization
      {$I unit1.lrs}
     
    end.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    J'ai réussi à faire marcher PostMessage avec le projet exemple. Voici ce que j'ai fait.

    1 - Avec l'inspecteur d'objet mettre la propriété ReadOnly du TMemo à false.

    2 - Ajouter le code pour envoyer le message à l'un des 2 boutons. Il faut utiliser le Handle du Memo ça ne marche pas avec celui de la fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(Memo1.Handle, LM_CHAR, ord('a'), 0);
    Je pense que ça doit fonctionner avec un TEdit mais je n'ai pas testé. Comme je suis au boulot j'ai fait le test sous Windows donc je ne sais pas si ça marche sous Linux.

  7. #7
    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 445
    Points
    28 445
    Par défaut
    Si tu regardes bien l'exemple donné, le message est traité dans l'exemple !

    c'est juste une démonstration de la différence entre SendMessage et PostMessage, mais ça n'a rien à voir avec les messages Windows

    le message est traité par MyMessageHandler, pas par le Memo
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Je viens d'essayer et ça ne marche pas.
    j'ai aussi modifié activecontrol dans la Form

    Activecontrol=memo1

    j'ai vérifié avec keypreview de la Form a true e a false et rien!!

  9. #9
    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 445
    Points
    28 445
    Par défaut
    normal, le Memo Linux ne gère pas les messages Windows

    Citation Envoyé par endaco Voir le message
    Je viens d'essayer et ça ne marche pas.
    j'ai aussi modifié activecontrol dans la Form

    Activecontrol=memo1

    j'ai vérifié avec keypreview de la Form a true e a false et rien!!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Si tu regardes bien l'exemple donné, le message est traité dans l'exemple !

    c'est juste une démonstration de la différence entre SendMessage et PostMessage, mais ça n'a rien à voir avec les messages Windows

    le message est traité par MyMessageHandler, pas par le Memo
    Je sais ce n'est pas windows. En windows cela devrait marcher parfaitement.

    Ce que j'essaye de savoir c'est si c'est possible de faire la meme chose mais en linux.

    J'ai regardé le code de TCalcEdit (la form de la calculatrice)

    Je voudrais faire queque chose de semblable mais directement dans un Tedit et sans avoir a recoder tout le traitement des touches.

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Je viens de tester avec un TEdit et ça fonctionne bien sous windows. Et ça n'a aucune chance de marcher sous autre chose que windows.

    Extrait du readme.txt du dossier du 'examples/messages' :
    The only use of PostMessage and SendMessage outside of Windows is to call your own custom message handlers.
    Ce qui me gène un peu la dedans c'est que si ça ne marche pas sous autre chose que Windows pourquoi toutes les contantes de message spécifiques à Windows ne sont pas uniquement définies sous Windows. Comme ça au moins ça compilerait pas...

  12. #12
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par endaco Voir le message
    Je sais ce n'est pas windows. En windows cela devrait marcher parfaitement.

    Ce que j'essaye de savoir c'est si c'est possible de faire la meme chose mais en linux.

    J'ai regardé le code de TCalcEdit (la form de la calculatrice)

    Je voudrais faire queque chose de semblable mais directement dans un Tedit et sans avoir a recoder tout le traitement des touches.
    probablement...mais je ne vois pas trop l'intérêt d'utiliser Lazarus ou la VCL de Delphi pour programmer en API système Au lieu d'avoir un code portable Delphi/Lazarus tu auras un truc spécifique Linux...et de tête Lazarus supporte différentes lib graphiques (Gnome , KDE...) qui n'auront pas la même gestion de message...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Tout a fait d'accord surrement je me suis mal exprimé ou alors je ne comprend pas bien comment cela fonctionne.

    Au lieu de linux j'aurais du dire lazarus.

    j'ai vu dans le code de TWINCONTROL et je crois que tedit est un descendant de TWINCONTROL qu'il y a ce code

    procedure WMChar(var Message: TLMChar); message LM_CHAR;

    Puis-je l'utiliser pour faire ce que je veux faire ou ce n'est pas la peine que j'essaye.

  14. #14
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par endaco Voir le message
    Tout a fait d'accord surrement je me suis mal exprimé ou alors je ne comprend pas bien comment cela fonctionne.

    Au lieu de linux j'aurais du dire lazarus.

    j'ai vu dans le code de TWINCONTROL et je crois que tedit est un descendant de TWINCONTROL qu'il y a ce code

    procedure WMChar(var Message: TLMChar); message LM_CHAR;

    Puis-je l'utiliser pour faire ce que je veux faire ou ce n'est pas la peine que j'essaye.
    aucune idée, mais il me parait plus simple de modifier le texte que de chercher à émuler une touche du clavier
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    aucune idée, mais il me parait plus simple de modifier le texte que de chercher à émuler une touche du clavier
    merci Paul

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 31
    Points : 41
    Points
    41
    Par défaut
    Bonjour Endaco,

    Paul Toth a raison, changer la propriété text du composant suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
       Edit1.text:='a';
    end;
    Tu devrais marquer ce problème 'résolu'.
    Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 09h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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