Page 1 sur 1

[R] Recherche dans Edit à l'ouverture du programme

Posté : sam. 16 avr. 2016 19:26
par GMH
Bonjour,

Lorsque je fais une recherche dans un Edit à partir d'une valeur entrée dans un Input et d'un clic sur un bouton, l'opération réussit.
Mais lorsque je souhaite que le programme lance une recherche dès son ouverture, sans que j'intervienne, la recherche ne s'effectue pas.
Voici le code que je teste :
- La variable $Recherche contient la valeur à trouver dans l'Edit
- $Editeur est l'identification du contrôle Edit
- $sText est le contenu de l'Edit

Code : Tout sélectionner

...
Global $Recherche = "Jean Valjean"
Parcourir()
...
Func Parcourir()
	GUICtrlEdit_FindText($Editeur)
EndFunc

Func GUICtrlEdit_FindText($hWnd)
	If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
	Local $sFind
	$sFind = StringStripWS($Recherche,3)
	Local $sText = GUICtrlEdit_GetText($hWnd)
	If $sFind <> "" Then
		$iPos = StringInStr($sText, $sFind)
		_GUICtrlEdit_SetSel($hWnd, $iPos - 1, ($iPos + StringLen($sFind)) - 1)
		_GUICtrlEdit_Scroll($hWnd, $__EDITCONSTANT_SB_SCROLLCARET)
	EndIf
EndFunc

Func GUICtrlEdit_GetText($hWnd)
	If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
	Local $iTextLen = _GUICtrlEdit_GetTextLen($hWnd) + 1
	Local $tText = DllStructCreate("wchar Text[" & $iTextLen & "]")
	_SendMessage($hWnd, $__EDITCONSTANT_WM_GETTEXT, $iTextLen, $tText, 0, "wparam", "struct*")
	Return DllStructGetData($tText, "Text")
EndFunc
Voyez-vous une erreur ou un oubli dans ce code ?

Je vous remercie.

Re: [..] Recherche dans Edit à l'ouverture du programme

Posté : sam. 16 avr. 2016 22:27
par mikell
à partir d'une valeur entrée dans un Input et d'un clic sur un bouton, l'opération réussit.
Si c'est le même code qui est utilisé, ça veut dire qu'il n'y a pas d'erreur, non ?

Re: [..] Recherche dans Edit à l'ouverture du programme

Posté : dim. 17 avr. 2016 09:36
par GMH
Bonjour,

Il n'y a, en effet, pas d'erreur à la compilation.
Si je change le contenu de la variable $Recherche en proposant un mot qui ne se trouve pas dans l'Edit, j'obtiens l'affichage de la MsgBox avertissant de l'échec de la recherche, programmée à cet effet.
Si le contenu de la variable $Recherche est bien présent dans l'Edit, la MsgBox d'échec ne s'affiche pas (j'en conclus que la recherche a réussi) mais le contenu de l'Edit ne scrolle pas.
Une MsgBox (0,"",$sFind & " " & $iPos - 1 & " " & ($iPos + StringLen($sFind)) - 1) placée après la ligne $iPos, affiche correctement la position dans l'Edit de $Recherche.
Si je passe par un Input dans lequel j'entre "Jean Valjean", et si je clique sur le bouton d'envoi, l'Edit scrolle.

Re: [..] Recherche dans Edit à l'ouverture du programme

Posté : dim. 17 avr. 2016 10:46
par GMH
Voici le code complet :

Code : Tout sélectionner

#Include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
#include <ScrollBarsConstants.au3> ;
Opt("GUIOnEventMode", 1)
Global $Recherche = "Jean Valjean"
Global $Contenu = ""
$MaGui = GUICreate("Test", 800, 340, 30, 10)
GuiSetOnEvent(-3, "_Close", $MaGui)
Global $Editeur = GUICtrlCreateEdit("", 10, 20, 600, 300)
_GUICtrlEdit_SetLimitText($Editeur, 0) ; 0 = nombre de caractères illimité dans l'Edit
GUICtrlSetData(-1, "")
GUICtrlSetFont(-1, 12, 400, 0, "Lucida console") ; police à chasse fixe
GUICtrlSetCursor(-1, 5)
GUICtrlCreateButton("Rechercher",630,20,150,30)
GUICtrlSetOnEvent(-1, "Parcourir")

For $i = 0 TO 50
	$Contenu = $Contenu & $i & @CRLF
Next
$Contenu = $Contenu & "51 Jean Valjean" & @CRLF
For $i = 52 TO 100
	$Contenu = $Contenu & $i & @CRLF
Next
GUICtrlSetData($Editeur, $Contenu)
Parcourir()

GUISetState(@SW_SHOW)

While 1
	Sleep(1000)
WEnd

Func _Close()
   Exit
EndFunc

Func Parcourir()
   GUICtrlEdit_FindText($Editeur)
EndFunc

Func GUICtrlEdit_FindText($hWnd)
   If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
   Local $sFind
   $sFind = StringStripWS($Recherche,3)
   Local $sText = GUICtrlEdit_GetText($hWnd)
   If $sFind <> "" Then
      $iPos = StringInStr($sText, $sFind)
      MsgBox (0,"",$sFind & " " & $iPos - 1 & " " & ($iPos + StringLen($sFind)) - 1) 
      _GUICtrlEdit_SetSel($hWnd, $iPos - 1, ($iPos + StringLen($sFind)) - 1)
      _GUICtrlEdit_Scroll($hWnd, $__EDITCONSTANT_SB_SCROLLCARET)
   EndIf
EndFunc

Func GUICtrlEdit_GetText($hWnd)
   If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
   Local $iTextLen = _GUICtrlEdit_GetTextLen($hWnd) + 1
   Local $tText = DllStructCreate("wchar Text[" & $iTextLen & "]")
   _SendMessage($hWnd, $__EDITCONSTANT_WM_GETTEXT, $iTextLen, $tText, 0, "wparam", "struct*")
   Return DllStructGetData($tText, "Text")
EndFunc

Re: [..] Recherche dans Edit à l'ouverture du programme

Posté : dim. 17 avr. 2016 18:46
par mikell
ça ne marche que si la fonction est lancée après le GUISetState()

Re: [..] Recherche dans Edit à l'ouverture du programme

Posté : dim. 17 avr. 2016 19:16
par GMH
Jamais je n'aurais imaginé une telle chose !
Je suis abasourdi par votre connaissance.
Grand merci Mikell pour le temps que vous avez pris à chercher une solution au problème, et votre solution.