'検索&置換ダイアログ ' ' '特徴 '1.検索と置換をシームレスに使用可能 '2.正規表現一覧を気軽に参照できる ' 'バージョン履歴 '08/11…カーソル上の単語や選択範囲をデフォルトとして扱うようにした ' proc main '主な変数の宣言 dim maxhis,his$[100] '履歴の最大数と個々の履歴 dim bigdlg '大きいダイアログのフラグ dim info$ '参考資料 dim title$ 'タイトル dim flag_aimai '曖昧検索をデフォルトにする dim cnt,tmp,tmp$,ret$,ret '雑用 dim fnum 'FreeFile()用 dim find_case,find_aimai,find_regexp'検索オプション dim fontname$,fontsize dim aimai$[1] aimai$[0]="厳格な" aimai$[1]="曖昧" '0/-1を簡単にON/OFFに変換するための配列 dim onoff$[1] onoff$[0]="OFF" onoff$[1]="ON" '設定ファイル名の取得 dim ininame$ ininame$=macrofilename$ ininame$=left$(ininame$,inrstr(ininame$,"."))+"ini" 'もしINIファイルが無い場合は新規作成 tmp$=getprofile$("基本情報","タイトル",ininame$) if tmp$="" then writeprofile "基本情報" ,"タイトル","検索&置換ダイアログ",ininame$ writeprofile "基本情報" ,"INIバージョン","05/30/2002版",ininame$ writeprofile "ダイアログ","大きいダイアログ(ON/OFF)","ON",ininame$ writeprofile "参考資料" ,"参考表示ファイル(“nothing”で内部テキストを使用)","nothing",ininame$ writeprofile "検索" ,"曖昧検索をデフォルトにする(ON/OFF)","ON",ininame$ writeprofile "フォント" ,"フォント名","FixedSys",ininame$ writeprofile "フォント" ,"フォントサイズ(単位は1/10ポイント)","120",ininame$ writeprofile "履歴" ,"最大個数(5〜80)","10",ininame$ end if 'INIファイルの読み込み maxhis=val(getprofile$("履歴","最大個数(5〜80)",ininame$)) info$=getprofile$("参考資料","参考表示ファイル(“nothing”で内部テキストを使用)",ininame$) title$=getprofile$("基本情報","タイトル",ininame$) fontname$=getprofile$("フォント","フォント名",ininame$) fontsize=val(getprofile$("フォント","フォントサイズ(単位は1/10ポイント)",ininame$)) bigdlg=get_onoff(getprofile$("ダイアログ","大きいダイアログ(ON/OFF)",ininame$)) flag_aimai=get_onoff(getprofile$("検索","曖昧検索をデフォルトにする(ON/OFF)",ininame$)) '個々の履歴の取得 for cnt=1 to maxhis his$[cnt]=getprofile$("履歴","履歴"+trim$(str$(cnt)),ininame$) next 'ダイアログ作成の下準備 dim combo_mode,combo_height,combo_height_true print bigdlg if bigdlg=1 then combo_mode=CBS_SIMPLE combo_height_true=8 combo_height=8 else combo_mode=CBS_DROPDOWN combo_height_true=8 combo_height=2 '各種ボタンをcomboboxの何文字分下に配置するか end if 'ダイアログの作成 dialog title$,8*2,8*3,8*32+4,8*(combo_height+7),0,fontname$,fontsize CONTROL "空白(全角も可)で区切って2つ単語を書けば", -1, "STATIC", SS_LEFT, 8*1,8*1,8*19,8 CONTROL "置換、単語1つなら"+aimai$[flag_aimai]+"検索を行います。", -1, "STATIC", SS_LEFT, 8*1,8*2,8*19,8 CONTROL "※SHIFT+ENTERで"+aimai$[1-flag_aimai]+"検索を行います。", -1, "STATIC", SS_LEFT, 8*1,8*3,8*19,8 CONTROL "", 101, "COMBOBOX", combo_mode | WS_TABSTOP | WS_VSCROLL | CBS_AUTOHSCROLL,8*1,8*4+4,8*18,8*combo_height_true CONTROL "", 102, "EDIT", ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_BORDER | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | ES_READONLY, 8*20,8*0+4, 8*12, 8*(6+combo_height) control "設定",200,"BUTTON",WS_TABSTOP, 8*1,8*(4+combo_height)+4, 8*2+4, 8*2 control "OK",IDOK,"BUTTON",BS_DEFPUSHBUTTON | WS_TABSTOP, 8*10+4,8*(4+combo_height)+4, 8*4, 8*2 control "CANCEL",IDCANCEL,"BUTTON",WS_TABSTOP, 8*15,8*(4+combo_height)+4, 8*4, 8*2 'コンボボックスに履歴を代入 dlglistboxarray 101,his$ 'info作成 dim n$ if info$="" or ucase$(trim$(info$))="NOTHING" then n$= "(参考)正規表現一覧|\s,半角空白(※)|\z,全角空白(※)|" n$=n$+"^,行頭|$,行末|\t,タブ|\n,改行|\00,AsciiCode指定|" n$=n$+"*,直前0字以上|+,直前1字以上|?,直前2字未満|.,任意の1文字|" n$=n$+"[xxx],任意の文字|,[a-cx-z]等の|,指定も可能|[^xxx],[xxx]の逆|" n$=n$+"\,直後の特殊な|,記号を普通の|,文字として|,扱う|※(※)があるものは|" n$=n$+" 当マクロ専用の特殊| 文字です。||" n$=n$+"(例1)[0-9]+|任意の数値列にマッチ||" n$=n$+"(例2)エディッ?ト|エディト、エディット|双方にマッチ||" n$=n$+"【タグ付き正規表現】|置換時のみ使用可能。|" n$=n$+"\(.?\}:\{.?\} \2:\1|などと表記。|" n$=n$+"\(と\)で囲まれた間を|\1 \2 \3などで対応。|" n$=replace$(n$,"|",chr$(13)+chr$(10)) n$=replace$(n$,",",chr$(9)) info$=n$ '↑長すぎ…。かといって行を増やすのもアレだし '別ファイルにするのはスマートじゃないし…。 'ま、いっか(^_^;) 。 else fnum=freefile open info$ for input as #fnum do while eof(fnum)=0 lineinput#1,tmp$ n$=n$+tmp$+chr$(13)+chr$(10) loop end if DlgText$ 102, n$ '08/11 追加 if @textselect$<>"" then DlgText$ 101,@textselect$ '08/11 追加 @select=0 '08/25 追加 else DlgText$ 101,@GetCursorWord3$("@") end if 'ダイアログの表示と実行 ret=dialog(1) if @@shift=1 then flag_aimai=1-flag_aimai call dialog(0) 'ダイアログを非表示にする '「設定」を選んだ場合は設定ファイルを開く if ret=200 then ret=@@openfile(ininame$) if ret=0 then msgbox"設定ファイルを開けませんでした。" end end if '「CANCEL」を選んだ場合は終了する if ret=IDCANCEL then end '「OK」を選んだ場合は処理を継続 ret$=dlgtext$(101) if trim$(ret$)="" then end '文字列が入力されていないので終了 '全角空白を半角空白に変換 06/24/2002 ret$=replace$(ret$," "," ") '入力した文字列のエラーチェック if instr(ret$," ")<>inrstr(ret$," ")then '←個人的に閃いて嬉しかった一文 tmp$= "入力された文字列に空白が2つ以上" tmp$=tmp$+"存在するため正常に処理できません。" tmp$=tmp$+"マクロを終了します。" call msgbox(tmp$,MB_ICONSTOP,title$) end end if if left$(ret$,1)=" "then tmp$= "入力された文字列の先頭が空白" tmp$=tmp$+"であるため正常に処理できません。" tmp$=tmp$+"マクロを終了します。" call msgbox(tmp$,MB_ICONSTOP,title$) end end if '履歴の更新 tmp$=chr$(13) for cnt=1 to maxhis tmp$=tmp$+his$[cnt]+chr$(13) next tmp$=replace$(tmp$,chr$(13)+ret$+chr$(13),chr$(13)) tmp$=ret$+tmp$ for cnt=1 to maxhis his$[cnt]=left$(tmp$,instr(tmp$,chr$(13))-1) tmp$=mid$(tmp$,instr(tmp$,chr$(13))+1) writeprofile "履歴","履歴"+trim$(str$(cnt)),chr$(34)+his$[cnt]+chr$(34),ininame$ next '曖昧検索or厳格検索 if flag_aimai=1 then '曖昧検索 @@FindCaseSensitive=0 '英大小文字を区別する @@FindAimai=-1 '曖昧検索 @@FindSame1=-1 '同一視検索 @@FindRegExp=-1 else '厳格検索 @@FindCaseSensitive=-1 @@FindAimai=0 @@FindSame1=0 @@FindRegExp=-1 '正規表現は適用 end if findexec ret$ '実処理に飛ぶ end proc sub findexec(a$) dim b$,r_flag a$=ltrim$(a$) a$=replace$(a$," ",chr$(1)) a$=replace$(a$,"\\",chr$(2)) a$=replace$(a$,"\z"," ") a$=replace$(a$,"\s"," ") a$=replace$(a$,chr$(2),"\\") if instr(a$,chr$(1))<>0 then b$=mid$(a$,instr(a$,chr$(1))+1) a$=left$(a$,instr(a$,chr$(1))-1) r_flag=1 end if if r_flag=0 then 'Find @FindStringBottom a$ else 'Search @ReplaceString2 a$,b$,0 end if end proc '汎用ルーチン dim icut$ function replace$(a$,b$,c$) dim d$,e do while instr(a$,b$)<>0 d$=ileft$(a$,b$):a$=icut$ a$=d$+c$+a$ loop replace$=a$ end function function ileft$(a$,b$) dim c,e$ c=instr(a$,b$) if c=0 then a$=a$:e$="" else e$=mid$(a$,c+len(b$)) a$=left$(a$,c-1) end if icut$=e$ '05/30/2002 icut$関数をileft$に併合 ileft$=a$ end function function get_onoff(a$) '05/30/20002 get_onoff=0 'デフォルト if ucase$(trim$(a$))="ON" then get_onoff=1 if ucase$(trim$(a$))="TRUE" then get_onoff=1 if ucase$(trim$(a$))="YES" then get_onoff=1 if ucase$(trim$(a$))="OK" then get_onoff=1 if ucase$(trim$(a$))="-1" then get_onoff=1 if ucase$(trim$(a$))="1" then get_onoff=1 end function