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