Page 1 sur 1

[R] Récupérer la position du curseur dans un edit control

Posté : mer. 21 juin 2023 10:17
par jpascal
Bonjour,

Il est possible de modifier le texte d'un edit control d'une ComboBox avec la fonction _GUICtrlComboBox_SetEditSel()

Je souhaite, lorsque je clique sur un bouton, pouvoir ajouter du texte à cet edit control.
C'est plutôt simple :
$sAdd = 'NouveauTexte'
$sData = _GUICtrlComboBox_GetEditText($idCombo_Pattern)
_GUICtrlComboBox_SetEditText($idCombo_Pattern, $sData & $sAdd)

Là où cela se corse, c'est que je souhaite insérer le texte à la dernière position connue du curseur de cet edit control.

Je m'explique.
- Je tape "RiriLoulou" dans l'edit control.
- Je me positionne entre Riri et Loulou.
- Je clique sur un bouton.
- "Fifi" est inséré entre Riri et Loulou.

J'ai donc juste besoin de la fonction qui me donne la position du curseur que je stockerai dans une variable à chaque clic/modif dans/de l'edit control.

Je souhaite vraiment utiliser une ComboBox (ou autre liste comme ListView) et nom un simple contrôle Input.

Re: [..] Récupérer la position du curseur dans un edit control

Posté : jeu. 22 juin 2023 19:47
par jl56
Bonjour,

j'avais réalisé des choses assez particulière sur un edit comme coloriser des portions de texte

j'avais utilisé les fonctions 'Editeur enrichi"

Pour votre demande je pense que
vous sera utile ça vous donne le début d'une sélection et la fin et si vous n'avez rien sélectionné c'est la position du curseur


Regardez les exemples dans l'aide

Cordialement,

Jean-Luc

Re: [..] Récupérer la position du curseur dans un edit control

Posté : jeu. 22 juin 2023 22:40
par Nine
Voici un exemple simple pour émuler ce que tu veux obtenir. Évidemment, il y a encore du boulot, mais je voulais simplement te faire voir cette possibilité.

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <Constants.au3>

Example()

Func Example()
  Local $hGUI = GUICreate("Example", 400, 300)
  Local $idList = GUICtrlCreateList("", 2, 22, 394, 100)
  Local $idEdit = GUICtrlCreateInput("", 2, 2, 394, 20)
  Local $idButton = GUICtrlCreateButton("Add", 20, 120, 100, 20)
  GUISetState(@SW_SHOW)

  For $x = 0 To 8
    GUICtrlSetData($idList, StringFormat("%03d : string", $x))
  Next

  While True
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
        Exit
      Case $idButton
        GUICtrlSetData($idEdit, " Test ", "1")
      Case $idList
        GUICtrlSetData($idEdit, GUICtrlRead($idList))
    EndSwitch
  WEnd
EndFunc   ;==>Example

Re: [..] Récupérer la position du curseur dans un edit control

Posté : lun. 26 juin 2023 14:36
par TommyDDR
Merci Nine, je ne connaissais pas la feature avec le flag à "1" sur un edit !

Re: [..] Récupérer la position du curseur dans un edit control

Posté : mer. 28 juin 2023 12:17
par jpascal
Merci pour vos réponses.
J'ai cru un instant ne pas réussir à obtenir le résultat escompté mais finalement le but est atteint. :D

La solution

Définir une variable globale $g_iPosAddPattern = 0 correspondant à la position du curseur dans l'edit control de la ComboBox.

Utiliser une fonction WM_COMMAND() où l'on testera la "perte" de focus de la ComboBox.
On récupèrera alors la position du curseur :
Func WM_COMMAND($hwnd, $iMsg, $wParam, $lParam)
   #forceref $hwnd, $iMsg, $lParam
   Local $iIDFrom, $iCode
   $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
   $iCode = BitShift($wParam, 16) ; Hi Word

   Switch $iIDFrom
      Case $idCombo_Pattern
         Switch $iCode
            Case $CBN_SELENDCANCEL ; Sent when the user selects an item, but then selects another control or closes the dialog box
               Local $aSel = _GUICtrlComboBox_GetEditSel($idCombo_Pattern)
               If @error = 0 Then $g_iPosAddPattern = $aSel[0]
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Le clic sur un ou plusieurs boutons déclenchera l'exécution de la fonction ClickButton().
Le texte correspondant sera inséré à la position enregistrée g_iPosAddPattern
Func ClickButton()
   Local $sAdd = ''

   Switch @GUI_CtrlId
      Case $idButton_Toto
         $sAdd = '{Toto}'
      Case $idButton_Titi
         $sAdd = '{Titi}'
   EndSwitch

   Local $sData = _GUICtrlComboBox_GetEditText($idCombo)
   _GUICtrlComboBox_SetEditText($idCombo, StringMid($sData, 1, $g_iPosAddPattern) & $sAdd & StringTrimLeft($sData, $g_iPosAddPattern))
EndFunc   ;==>ClickButton