UDF > WinAPIEx > Dialog >


_WinAPI_ReplaceTextDlg

Cr�e une bo�te de dialogue de type modal, d�finie par le syst�me, qui permet � l'utilisateur de sp�cifier une cha�ne � rechercher et une cha�ne de remplacement

#include <WinAPIDlg.au3>
_WinAPI_ReplaceTextDlg ( $hOwner [, $sFindWhat = '' [, $sReplaceWith = '' [, $iFlags = 0 [, $pReplaceProc = 0 [, $lParam = 0]]]]] )

Param�tres

$hOwner Le handle de la fen�tre qui est propri�taire de la bo�te de dialogue.
La proc�dure fen�tre de la fen�tre sp�cifi�e re�oit les messages FINDMSGSTRING de la bo�te de dialogue.
Ce param�tre peut �tre n'importe quel handle de fen�tre valide, mais il ne doit pas �tre 0.
$sFindWhat [optionnel] La cha�ne � rechercher qui s'affiche lors de l'initialisation de la bo�te de dialogue.
$sReplaceWith [optionnel] La cha�ne de remplacement qui s'affiche lorsque vous initialisez la bo�te de dialogue.
$iFlags [optionnel] Un jeu de bits qui permet d'initialiser la bo�te de dialogue.
La bo�te de dialogue d�finit ces flags quand elle envoie le message inscrit FINDMSGSTRING pour indiquer l'entr�e de l'utilisateur.
Ce param�tre prendre une ou plusieurs des valeurs suivantes:
$FR_DIALOGTERM
$FR_DOWN
$FR_ENABLEHOOK
$FR_ENABLETEMPLATE
$FR_ENABLETEMPLATEHANDLE
$FR_FINDNEXT
$FR_HIDEUPDOWN
$FR_HIDEMATCHCASE
$FR_HIDEWHOLEWORD
$FR_MATCHCASE
$FR_NOMATCHCASE
$FR_NOUPDOWN
$FR_NOWHOLEWORD
$FR_REPLACE
$FR_REPLACEALL
$FR_SHOWHELP
$FR_WHOLEWORD
$pReplaceProc [optionnel] Pointeur sur une proc�dure hook qui peut traiter les messages destin�s � la bo�te de dialogue.
Ce param�tre est ignor� si le flag $FR_ENABLEHOOK n'est pas activ�.
(Voir MSDN pour plus d'informations)
$lParam [optionnel] Donn�es d�finies par l'application que le syst�me passe � la proc�dure hook.

Valeur de retour

Succ�s: Retourne le handle fen�tre de la bo�te de dialogue.
�chec: D�finit @error <> 0, @extended contient le code d'erreur de bo�te de dialogue.

Remarques

_WinAPI_ReplaceTextDlg() n'effectue pas une op�ration de remplacement de texte. A la place, la bo�te de dialogue envoie les messages inscrits FINDMSGSTRING � la proc�dure fen�tre de la fen�tre propri�taire de la bo�te de dialogue.

Avant d'appeler _WinAPI_ReplaceTextDlg(), vous devez appeler la fonction _WinAPI_RegisterWindowMessage() pour obtenir l'identifiant du message FINDMSGSTRING.
La proc�dure de la bo�te de dialogue utilise cet identifiant pour envoyer des messages lorsque l'utilisateur clique sur les boutons "Find Next", "Replace" ou "Replace All", ou quand la bo�te de dialogue se ferme.
Le param�tre "lParam" du message FINDMSGSTRING contient un pointeur sur une structure $tagFINDREPLACE.
Le membre "Flags" de cette structure indique l'�v�nement qui a provoqu� le message.
D'autres membres de la structure indiquent l'entr�e de l'utilisateur.

_WinAPI_ReplaceTextDlg() utilise une m�moire tampon interne pour contenir la cha�ne que l'utilisateur a tap� dans les contr�les d'�dition "Find What" et "Replace With".
Vous pouvez augmenter la taille de ce tampon en utilisant la fonction _WinAPI_SetFRBuffer().
En plus, pour lib�rer la m�moire allou�e pour le tampon interne, vous devez appeler _WinAPI_FlushFRBuffer() en r�ponse au message FINDMSGSTRING avec le flag $FR_DIALOGTERM activ�.

En relation

_WinAPI_FlushFRBuffer, _WinAPI_RegisterWindowMessage, _WinAPI_SetFRBuffer

Voir aussi

Consultez ReplaceText dans la librairie MSDN.

Exemple

#include <APIDlgConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <MsgBoxConstants.au3>
#include <SendMessage.au3>
#include <WinAPIDlg.au3>
#include <WinAPIGdi.au3>
#include <WinAPIMisc.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Local Const $sTxt = 'AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, self-contained and will run on all versions of Windows out-of-the-box with no annoying "runtimes" required!'& @CRLF & @CRLF & _
        'AutoIt was initially designed for PC "roll out" situations to reliably automate and configure thousands of PCs. Over time it has become a powerful language that supports complex expressions, user functions, loops and everything else that veteran scripters would expect.'

; Cr�e une GUI
Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 800, 600)

; Cr�e un menu principal
Local $idMenu = GUICtrlCreateMenu('&File')
Local $idExitItem = GUICtrlCreateMenuItem('E&xit...', $idMenu)
$idMenu = GUICtrlCreateMenu('&Edit')
Local $idFindItem = GUICtrlCreateMenuItem('&Find...', $idMenu)
Local $idReplaceItem = GUICtrlCreateMenuItem('R&eplace...', $idMenu)

; Cr�e un contr�le Rich Edit avec la s�lection de texte toujours visible, et d�finit la police  "Courier New" dans le contr�le
Local $hRichEdit = _GUICtrlRichEdit_Create($hForm, $sTxt, 0, 0, 800, 600, BitOR($ES_AUTOVSCROLL, $ES_NOHIDESEL, $ES_MULTILINE, $WS_VSCROLL), 0)
Local $hFont = _WinAPI_CreateFont(17, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, 'Courier New')
_SendMessage($hRichEdit, $WM_SETFONT, $hFont, 1)
_SendMessage($hRichEdit, $EM_SETSEL)

; Cr�e un message FINDMSGSTRING pour recevoir les messages de la bo�te de dialogue
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('commdlg_FindReplace'), 'WM_FINDMSGSTRING')

; Affiche la GUI
GUISetState(@SW_SHOW)

Global $g_hDlg
Local $iMsg = GUIGetMsg(), $sText

While $iMsg <> $GUI_EVENT_CLOSE And $iMsg <> $idExitItem
    Switch $iMsg
        Case $idFindItem, $idReplaceItem
            $sText = _GUICtrlRichEdit_GetSelText($hRichEdit)
            If @error Then
                $sText = ''
            EndIf
            ; D�sactive les �l�ments de menu "Find..." et "Replace...", sinon, le script peut se bloquer
            GUICtrlSetState($idFindItem, $GUI_DISABLE)
            GUICtrlSetState($idReplaceItem, $GUI_DISABLE)
            Switch $iMsg
                Case $idFindItem
                    $g_hDlg = _WinAPI_FindTextDlg($hForm, $sText, $FR_DOWN, 0, $hRichEdit)
                Case $idReplaceItem
                    $g_hDlg = _WinAPI_ReplaceTextDlg($hForm, $sText, '', 0, 0, $hRichEdit)
            EndSwitch
        Case $idReplaceItem
    EndSwitch
    $iMsg = GUIGetMsg()
WEnd

GUIDelete()

Func _IsMatchSelection($hWnd, $sText, $iBehavior)
    Local $aPos = _GUICtrlRichEdit_GetSel($hWnd)
    If @error Then Return 0

    $aPos = _GUICtrlRichEdit_FindTextInRange($hWnd, $sText, $aPos[0], $aPos[1], BitAND($iBehavior, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iBehavior, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iBehavior, BitOR($FR_MATCHALEFHAMZA, $FR_MATCHDIAC, $FR_MATCHKASHIDA)))
    If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then
        Return 0
    Else
        Return 1
    EndIf
EndFunc   ;==>_IsMatchSelection

Func WM_FINDMSGSTRING($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam

    Local $tFINDREPLACE = DllStructCreate($tagFINDREPLACE, $lParam)
    Local $sReplace = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'ReplaceWith'))
    Local $sFind = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'FindWhat'))
    Local $hRichEdit = Ptr(DllStructGetData($tFINDREPLACE, 'lParam'))
    Local $iFlags = DllStructGetData($tFINDREPLACE, 'Flags')
    Local $aPos, $iCur = -1

    Select
        ; L'utilisateur a cliqu� sur le bouton "Replace" dans une bo�te de dialogue Replace
        Case BitAND($iFlags, $FR_REPLACE)
            If _IsMatchSelection($hRichEdit, $sFind, $iFlags) Then
                _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace)
            EndIf
            ContinueCase
            ; L'utilisateur a cliqu� sur le bouton "Find Next" dans la bo�te de dialogue Find et  Replace
        Case BitAND($iFlags, $FR_FINDNEXT)
            $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
            If @error Then Return

            If BitAND($iFlags, $FR_DOWN) Then
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[1], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD)
            Else
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], 0, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iFlags, $FR_DOWN))
            EndIf
            If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then
                Local $iError = @error
                MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Cannot find "'& $sFind & '" ('& $iError & ')', 0, $g_hDlg)
                Return
            EndIf
            ; Ici et ci-dessous est utilis� le message EM_SETSEL directement parce _GUICtrlRichEdit_SetSel () d�finit le focus sur le contr�le Rich Edit
            _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1])
            ; _GUICtrlRichEdit_ScrollToCaret($HRichEdit)
            ; L'utilisateur a cliqu� sur le bouton "Replace All" dans la bo�te de dialogue Replace

        Case BitAND($iFlags, $FR_REPLACEALL)
            Dim $aPos[2] = [0, -1]
            While 1
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD)
                If ($aPos[0] = -1) Or ($aPos[1] = -1) Then
                    If $iCur = -1 Then
                        MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Impossible de trouver "'& $sFind & '"', 0, $g_hDlg)
                        Return
                    EndIf
                    ExitLoop
                EndIf
                If $iCur = -1 Then
                    _GUICtrlRichEdit_PauseRedraw($hRichEdit)
                EndIf
                _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1])
                If _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace) Then
                    $iCur = $aPos[0] + StringLen($sReplace)
                Else
                    ExitLoop
                EndIf
            WEnd
            _SendMessage($hRichEdit, $EM_SETSEL, $iCur, $iCur)
            ; _GUICtrlRichEdit_ScrollToCaret($HRichEdit)
            _GUICtrlRichEdit_ResumeRedraw($hRichEdit)
            ; La bo�te de dialogue est ferm�e

        Case BitAND($iFlags, $FR_DIALOGTERM)
            ; D�truit la m�moire tampon interne, et lib�re la m�moire allou�e
            _WinAPI_FlushFRBuffer()
            ; Active les �l�ments de menu "Find..." et "Replace..."
            GUICtrlSetState($idReplaceItem, $GUI_ENABLE)
            GUICtrlSetState($idFindItem, $GUI_ENABLE)
    EndSelect
EndFunc   ;==>WM_FINDMSGSTRING