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

Composants VCL Delphi Discussion :

TRichEdit beep sur Entrée


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 93
    Par défaut TRichEdit beep sur Entrée
    Bonjour.
    J'ai un contrôle TRichEdit en ReadOnly qui se comporte différemment entre D7 et D10.
    Il s'agit de l'utilisation de la touche Entrée.
    Sur D7, la touche Entrée ne génère pas de beep lorsqu'elle est interceptée par un OnKeyDown.
    Sur D10, la touche Entrée génère systématiquement un beep AVANT qu'elle soit interceptée par un OnKeyDown.
    Le Key:=#0 est inefficace car le beep est généré AVANT l'interception de la touche Entrée.
    (Toutes les autres touches génèrent des beeps mais c'est normal car le TRichEdit est en ReadOnly.)
    J'ai bien trouvé des solutions sur Internet pour carrément supprimer les beeps mais c'est en C++ / v.net et je ne maitrise pas.
    Bref, si quelqu'un a une solution simple pour supprimer ce beep sur la touche Entrée en D10, je suis preneur. Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Comme on a le code Delphi et que la différence est entre deux versions de Delphi et non entre deux versions de Windows, as-tu tenté de déboguer la VCL

    Le code .NET est hors sujet
    Le code C++ sur du WinForm Win32, c'est à voir mais si c'est sur un autre framework, cela ne sera pas applicable non plus.

    Key:=#0 ?
    #0 c'est pour OnKeyPress qui se produit après le OnKeyDown (lui est 0 et non #0 qu'il faut affecter)
    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
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 93
    Par défaut
    Bjr. OK pour key. J'ai fait des tas d'essais avec keydown et keypress mais pas moyen d'enlever ce beep sur la touche Entrée avec D10 alors que je ne l'ai pas avec D7.
    Un programmeur a fait du débogage et propose une solution en C++ sur stackoverflow, How to eliminate the MessageBeep from the RichEdit control. Mais ça dépasse mes capacités hi !!! Ce que je n'arrive pas trop à comprendre c'est pourquoi le comportement de cette touche Entrée est différent sur D7 et sur D10.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Ce n'est pas compatible

    la VCL utilise le RichEdit fenêtré RICHEDIT_CLASS de la DLL Riched20.dll

    Le code C++ fonctionne sur le RichEdit Léger MSFTEDIT_CLASS de la DLL Msftedit.dll


    Citation Envoyé par f6dqm1 Voir le message
    Ce que je n'arrive pas trop à comprendre c'est pourquoi le comportement de cette touche Entrée est différent sur D7 et sur D10.
    Il faut étudier le code mais cela peut venir de la DLL liée, en D7 je vois bien un "Rich Edit Version 1.0" de Riched32.dll contre un "Rich Edit Version 3.0" de Riched20.dll en D10
    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

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Même le RichEdit classique semble supporter les mêmes interfaces COM que le RichEdit léger


    Avant le Type de TForm dans interface:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TRichEdit = class(Vcl.ComCtrls.TRichEdit)
      protected
        procedure CreateWnd(); override;
      end;
    dans implementation

    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
    { TRichEdit }
     
    procedure TRichEdit.CreateWnd();
    const
      EM_GETOLEINTERFACE = WM_USER + 60;
    var
      Unknown: IUnknown;
      Services: ITextServices;
    begin
      inherited CreateWnd();
     
      if LongBool(SendMessage(Handle, EM_GETOLEINTERFACE, 0, LPARAM(@Unknown))) then
      begin
        if Supports(Unknown, ITextServices, Services) then
        begin
          Unknown := nil;
          Services.OnTxPropertyBitsChange(TXTBIT_ALLOWBEEP, 0);
        end;
      end;
    end;


    Juste le strict nécessaire :

    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
    unit RichEdit_TextServices;
     
    interface
     
    uses Windows, ActiveX, RichEdit, IMM;
     
    const
      SID_ITextHost = '{c5bdd8d0-d26e-11ce-a89e-00aa006cadc5}';
      SID_ITextServices = '{8d33f740-cf58-11ce-a89d-00aa006cadc5}';
      IID_ITextHost: TGUID = SID_ITextHost;
      IID_ITextServices: TGUID = SID_ITextServices;
     
    type
      PCharFormatW = ^TCharFormatW;
      PParaFormat = ^TParaFormat;
     
      TSizeL = TSize;
      TRectL = TRect;
     
    const
      TXTBIT_ALLOWBEEP = $800;
     
    type
      {$MINENUMSIZE 4}
      TTxtBackStyle = (txtBack_Transparent, txtBack_Opaque);
      TTxtView = (txtView_Active, txtView_Inactive);
     
      TTxDrawCallback = function(param: DWord): Bool; stdcall;
     
      ITextServices = interface
        [SID_ITextServices]
        function TxSendMessage(msg: UInt; wParam: wParam; lParam: lParam; out plresult: lResult): HResult; stdcall;
        function TxDraw(dwDrawAspect: DWord; lindex: LongInt; pvAspect: Pointer; ptd: PDVTargetDevice; hdcDraw, hicTargetDev: HDC; const lprcBounds, lprcWBounds: TRectL; const lprcUpdate: TRect; pfnContinue: TTxDrawCallback; dwContinue: DWord; lViewID: TTxtView): HResult; stdcall;
        function TxGetHScroll(out plMin, plMax, plPos, plPage: LongInt; out pfEnabled: Bool): HResult; stdcall;
        function TxGetVScroll(out plMin, plMax, plPos, plPage: LongInt; out pfEnabled: Bool): HResult; stdcall;
        function OnTxSetCursor(dwDrawAspect: DWord; lindex: LongInt; pvAspect: Pointer; ptd: PDVTargetDevice; hdcDraw, hicTargetDev: HDC; const lprcClient: TRect; x, y: Integer): HResult; stdcall;
        function TxQueryHitPoint(dwDrawAspect: DWord; lindex: LongInt; pvAspect: Pointer; ptd: PDVTargetDevice; hdcDraw, hicTargetDev: HDC; const lprcClient: TRect; x, y: Integer; out pHitResult: DWord): HResult; stdcall;
        function OnTxInPlaceActivate(const prcClient: TRect): HResult; stdcall;
        function OnTxInPlaceDeactivate: HResult; stdcall;
        function OnTxUIActivate: HResult; stdcall;
        function OnTxUIDeactivate: HResult; stdcall;
        function TxGetText(out pbstrText: TBStr): HResult; stdcall;
        function TxSetText(pszText: PWideChar): HResult; stdcall;
        function TxGetCurTargetX(out px: LongInt): HResult; stdcall;
        function TxGetBaselinePos(out pBaselinePos: LongInt): HResult; stdcall;
        function TxGetNaturalSize(dwAspect: DWord; hdcDraw, hicTargetDev: HDC; ptd: PDVTargetDevice; dwMode: DWord; const psizelExtent: TSizeL; var pwidth, pheight: LongInt): HResult; stdcall;
        function TxGetDropTarget(out ppDropTarget: IDropTarget): HResult; stdcall;
        function OnTxPropertyBitsChange(dwMask, dwBits: DWord): HResult; stdcall;
        function TxGetCachedSize(out pdwWidth, pdwHeight: DWord): HResult; stdcall;
      end;
     
      ITextHost = interface
        [SID_ITextHost]
        function TxGetDC: HDC; stdcall;
        function TxReleaseDC(hdc: HDC): Integer; stdcall;
        function TxShowScrollBar(fnBar: Integer; fShow: Bool): Bool; stdcall;
        function TxEnableScrollBar(fuSBFlags, fuArrowFlags: Integer): Bool; stdcall;
        function TxSetScrollRange(fnBar: Integer; nMinPos: LongInt; nMaxPos: Integer; fRedraw: Bool): Bool; stdcall;
        function TxSetScrollPos(fnBar, nPos: Integer; fRedraw: Bool): Bool; stdcall;
        procedure TxInvalidateRect(const prc: TRect; fMode: Bool); stdcall;
        procedure TxViewChange(fUpdate: Bool); stdcall;
        function TxCreateCaret(hbmp: hBitmap; xWidth, yHeight: Integer): Bool; stdcall;
        function TxShowCaret(fShow: Bool): Bool; stdcall;
        function TxSetCaretPos(x, y: Integer): Bool; stdcall;
        function TxSetTimer(idTimer, uTimeout: UInt): Bool; stdcall;
        procedure TxKillTimer(idTimer: UInt); stdcall;
        procedure TxScrollWindowEx(dx, dy: Integer; const lprcScroll, lprcClip: TRect; hrgnUpdate: HRgn; fuScroll: UInt); stdcall;
        procedure TxSetCapture(fCapture: Bool); stdcall;
        procedure TxSetFocus; stdcall;
        procedure TxSetCursor(hcur: hCursor; fText: Bool); stdcall;
        function TxScreenToClient(var lppt: TPoint): Bool; stdcall;
        function TxClientToScreen(var lppt: TPoint): Bool; stdcall;
        function TxActivate(out lpOldState: LongInt): HResult; stdcall;
        function TxDeactivate(lNewState: LongInt): HResult; stdcall;
        function TxGetClientRect(out prc: TRect): HResult; stdcall;
        function TxGetViewInset(out prc: TRect): HResult; stdcall;
        function TxGetCharFormat(out ppCF: PCharFormatW): HResult; stdcall;
        function TxGetParaFormat(out ppPF: PParaFormat): HResult; stdcall;
        function TxGetSysColor(nIndex: Integer): TColorRef; stdcall;
        function TxGetBackStyle(out pstyle: TTxtBackStyle): HResult; stdcall;
        function TxGetMaxLength(out pLength: DWord): HResult; stdcall;
        function TxGetScrollBars(out pdwScrollBar: DWord): HResult; stdcall;
        function TxGetPasswordChar(out pch: {Wide}Char): HResult; stdcall;
        function TxGetAcceleratorPos(out pcp: LongInt): HResult; stdcall;
        function TxGetExtent(out lpExtent: TSizeL): HResult; stdcall;
        function OnTxCharFormatChange(const pcf: TCharFormatW): HResult; stdcall;
        function OnTxParaFormatChange(const ppf: TParaFormat): HResult; stdcall;
        function TxGetPropertyBits(dwMask: DWord; out pdwBits: DWord): HResult; stdcall;
        function TxNotify(iNotify: DWord; pv: Pointer): HResult; stdcall;
        function TxImmGetContext: hIMC; stdcall;
        procedure TxImmReleaseContext(himc: hIMC); stdcall;
        function TxGetSelectionBarWidth(out lSelBarWidth: LongInt): HResult; stdcall;
      end;
     
    implementation
     
     
    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

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 93
    Par défaut
    Beau travail ... et vous avez essayé, ça supprime les beeps du Richedit en mode ReadOnly ?

  7. #7
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 506
    Par défaut
    Citation Envoyé par f6dqm1 Voir le message
    Bonjour.
    J'ai un contrôle TRichEdit en ReadOnly qui se comporte différemment entre D7 et D10.
    Il s'agit de l'utilisation de la touche Entrée.
    Sur D7, la touche Entrée ne génère pas de beep lorsqu'elle est interceptée par un OnKeyDown.
    Sur D10, la touche Entrée génère systématiquement un beep AVANT qu'elle soit interceptée par un OnKeyDown.
    Le Key:=#0 est inefficace car le beep est généré AVANT l'interception de la touche Entrée.
    (Toutes les autres touches génèrent des beeps mais c'est normal car le TRichEdit est en ReadOnly.)
    J'ai bien trouvé des solutions sur Internet pour carrément supprimer les beeps mais c'est en C++ / v.net et je ne maitrise pas.
    Bref, si quelqu'un a une solution simple pour supprimer ce beep sur la touche Entrée en D10, je suis preneur. Merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ord(Key) = VK_RETURN then
      begin
        Key := #0;
        SystemParametersInfo(SPI_SETBEEP, 0, nil, SPIF_SENDWININICHANGE);
      end;

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

Discussions similaires

  1. samba share sur entre debian7.5 et windows10
    Par strauss69400 dans le forum Linux
    Réponses: 2
    Dernier message: 26/10/2015, 18h15
  2. le code de l'appui sur entré en SDL
    Par dark_geek dans le forum SDL
    Réponses: 2
    Dernier message: 20/12/2008, 21h07
  3. Agir sur le texte entré dans un éditeur
    Par FatalError dans le forum C++
    Réponses: 1
    Dernier message: 24/10/2004, 14h54
  4. Comment savoir si les ScrollBar sont visibles sur un TRichEdit ?
    Par vanquish dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/10/2003, 10h28
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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