検索をやったら置換もやらないとね。
基本的に文字列検索ダイアログと方法が同じなので定数、構造体、API関数はこちらを参考にしてちょ。そんなわけで今回の説明はかなり省略気味です。 それでは標準モジュールに次のAPI関数、外部変数、関数を付け足してね。 Private Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As FINDREPLACE) As Long
'置換文字
'--------------------------------------------------------------------------- ' 関数名 : 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 それぞれの処理は自分で書いてね。 |