● 文字列置換ダイアログを表示する ●

検索をやったら置換もやらないとね。

基本的に文字列検索ダイアログと方法が同じなので定数、構造体、API関数はこちらを参考にしてちょ。そんなわけで今回の説明はかなり省略気味です。

それでは標準モジュールに次のAPI関数、外部変数、関数を付け足してね。

Private Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As FINDREPLACE) As Long

'置換文字
Private RpcString As String

'---------------------------------------------------------------------------
'  関数名 : ReplaceMyWord
'  機能   : 文字列置換ダイアログボックスを表示する
'  引数   : (in)hWnd … 対象ハンドル
'  返り値 : なし
'---------------------------------------------------------------------------
Public Sub ReplaceMyWord(ByVal hwnd As Long)

    With udtFINDREPLACE
        .lStructSize = Len(udtFINDREPLACE)
        .hInstance = App.hInstance
        .hwndOwner = hWnd

        fndString = String$(256, Chr$(0))
        RpcString = String$(256, Chr$(0))

        .lpstrFindWhat = StrPtr(fndString)
        .lpstrReplaceWith = StrPtr(RpcString)
        .wFindWhatLen = Len(fndString)
        .wReplaceWithLen = Len(RpcString)
        .flags = FR_FINDNEXT Or FR_MATCHCASE Or FR_HIDEWHOLEWORD Or FR_HIDEUPDOWN
    End With

    Call ReplaceText(udtFINDREPLACE)

End Sub

これは文字列検索ダイアログ のページの FindMyWord関数 とほぼ同じ。"置換後の文字" を受け取る FINDREPLACE構造体の lpstrReplaceWith に文字列のポインタを渡す処理を追加したことろが違うだけです。あとはウインドウメッセージ受け取り処理で、"置換して次に"と"すべて置換"を追加するだけ、簡単でしょ。

'---------------------------------------------------------------------------
'  関数名 : SearchGetString
'  機能   : 文字列を検索・置換する
'  引数   : (in) hWnd … オーナーウインドウのハンドル
'          (in) udtFRPtr … FINDREPLACE構造体へのポインタ
'  戻り値 : なし
'---------------------------------------------------------------------------
Public Sub SearchGetString(ByVal hwnd As Long, ByVal udtFRPtr As Long)

    Dim udtFR As FINDREPLACE

    'FINDREPLACE構造体情報をコピー
    Call CopyMemory(udtFR, ByVal udtFRPtr, Len(udtFR))

    If (udtFR.flags And FR_FINDNEXT) = FR_FINDNEXT Then
        '"次を検索"の処理を書く
    ElseIf (udtFR.flags And FR_REPLACE) = FR_REPLACE Then
        '"置換して次に"の処理を書く
    ElseIf (udtFR.flags And FR_REPLACEALL) = FR_REPLACEALL Then
        '"すべて置換"の処理を書く
    Else
        'キャンセル
    End If

End Sub

それぞれの処理は自分で書いてね。


戻る