/***************************************************** SARI interface ISRSearch (ver.1.0)解説 1999/12 by Kazuhiro Kito_ *****************************************************/ 【概説】 SARIの検索・置換・強調単語などを扱うインターフェースです。 デュアルインターフェースです。 外部から直接生成することはできません。インターフェースを得るには、ISRAPL インターフェースのCreateSearchObjectメソッドを使います。 またSARIのメインウィンドウが作成された後でなければ、このインターフェース を取得することはできません。 (なをこの説明中に使うTRUEは0以外の数値, FALSEは0です。) 【メソッド】 HRESULT GetSearchFlag( [out, retval]long* plFlag // フラグ格納用 ); <説明> 現在設定されている検索フラグを得ます。次のフラグを公開します。検 索メソッドを使うため、一時的にフラグを変更しなければならない場合 が起きるかを思います。たとえば大文字小文字を区別するかどうか、な どです。 Bit 1:大文字小文字を区別しません。 Bit 2:正規表現による検索で半角全角を区別しません。 Bit 3:置換前に確認メッセージ表示します。 Bit 4:Grepで特定の文字列をスキップします。 Bit 5:Grepでサブディレクトリも検索します。 Bit 6:普通の検索でOR検索します。 Bit 7:普通の検索でAND検索します。 Bit 18:正規表現による検索で自動整形モード対応。 Bit 19:自動整形モードで全角空白もインデントに含める 各ビットの詳しい意味については、SARIのヘルプ「検索」の項も参考に してください。 HRESULT SetSearchFlag( [in]long lFlag //設定する検索フラグ値 ); <説明> 検索フラグを設定します。 各ビットの意味はGetSearchFlagの説明をごらんください。 HRESULT ExecSearch( [in]BSTR lpStr, // 検索文字列 [in]VARIANT_BOOL bForward, //前に検索するか後ろに検索するか。 [in]VARIANT_BOOL bSelect, //ヒット文字列を選択状態にするか。 [out]long* plARow,//ヒット文字列の一端の表示行番号 [out]long* plACol,//ヒット文字列の一端の表示桁数 [out]long* plBRow,//ヒット文字列の他の一端の表示行番号 [out]long* plBCol,//ヒット文字列の他の一端の表示桁数 [out,retval]VARIANT_BOOL* pbResult //見つかったかどうかを格納。 ); <説明> 「普通の検索を実行します。 実行時に検索フラグのBit1が立っていたら、大文字小文字を区別しませ ん。 またBit6が立っていたら、第一パラメータの文字列を「半角空白で区切 られた複数の検索文字列」と解し、OR検索を実行します。 同様にBit7が立っていたらAND検索を実行します。 第2パラメータがTRUEなら、カレット位置から行番号をふやす方向へ検 索を実行します。FALSEなら行番号をへらす方向へ検索します。 検索文字列が見つかったら、*pbResultにTRUEを入れ、かつヒットした部 分を[*pARow, *pACol]と[*plBRow, *plBCol]で示します。そのとき第3 パラメータ(bSelect)がTRUEなら、その部分を選択状態にします。 見つからなかったときは、*pbResultにFALSEが返ります。 このメソッドについては、SARIのヘルプ「検索」の項も参考にしてくだ さい。 HRESULT MakeDFATable( [in]BSTR lpRegExp, //正規表現 [out]long* plDFA, // 作成されたDFAを識別する値の格納用 [out]long* plRegExpFlag, //DFAを補助するフラグ [out,retval]VARIANT_BOOL* pbResult //結果格納用 ); <説明> 正規表現による検索・置換・グレップを行うために、DFAテーブルを作成 します。DFAは正規表現の効率よく処理するため道具です。作成に成功す ると、*plResultにTRUEがセットされ、かつ、そのDFAを識別するための long値が第2パラメターに格納されて返ります。第3パラメータはDFAを 補助するためのフラグです。この*plDFAと*plRegExpFlagの二つを、正規 表現による検索や置換を実行するときに使います。 正規表現の文法が間違っているなど、なんらかの理由でDFAの作成に失敗 したときは、*pbResultにFALSEが格納されて返ります。それ以外の場合 は、取得した*plDFAは、使用がおわったら必ずCloseDFATableメソッドで 解放するようにしてください。 HRESULT CloseDFATable( [in]long lDFA // MakeDFATableで得た値です。 ); <説明> DFAテーブルを解放します。 MakeDFATableメソッドの第2パラメータとして取得したDFA値は、使用が おわったら、必ず解放しなければなりません。 HRESULT ExecSearchByRegExp( [in]long lDFA, // DFA識別値。 [in]long lRegExpFlag,// DFA補助フラグ [in]VARIANT_BOOL bForward,//前に検索するか後ろに検索するか。 [in]VARIANT_BOOL bSelect,//ヒット文字列を選択状態にするか。 [in]short stPart,//取得する(選択状態にする)部分文字列 [out]long* plARow,//ヒット文字列の一端の表示行番号 [out]long* plACol,//ヒット文字列の一端の表示桁数 [out]long* plBRow,//ヒット文字列の他の一端の表示行番号 [out]long* plBCol,//ヒット文字列の他の一端の表示桁数 [out,retval]VARIANT_BOOL* pbResult //見つかったかどうかを格納 ); <説明> 正規表現による検索を実行します。 あらかじめMakeDFATableメソッドによってDFAを作成し、それを識別する 値と補助フラグのふたつを得ておかなければなりません。それらを第1 パラメータ、第2パラメータとして検索を実行します。 第3パラメータは検索方向を指定します。TRUEならカレット位置から行 番号をふやす方向へ検索し、FALSEならその逆方向へ検索します。 ヒットした文字列を選択状態にしたいときは第4パラメータ(bSelect)を TRUEにします。 第5パラメータには、取得したい部分文字列を、0から9までの数値で指 定します。ヒット文字列全体なら0です。それ以外なら、その番号に該 当する部分文字列を取得します。部分文字列とは、正規表現中の丸括弧 でまとめられた部分です。左から(を順に数え、それぞれ部分文字列1、 部分文字列2・・・と番号をふります。詳しくはSARIのヘルプの正規表 現の項をごらんください。 検索文字列が見つかったら、*pbResultにTRUEを入れ、かつヒットした部 分を[*pARow, *pACol]と[*plBRow, *plBCol]で示します。そのとき第3 パラメータ(bSelect)がTRUEなら、その部分を選択状態にします。 見つからなかったときは、*pbResultにFALSEが返ります。 このメソッドについては、SARIのヘルプ「検索」の項も参考にしてくだ さい。 HRESULT GetPartialString( [in]short stPart,//取得する部分文字列 [out]long* plARow,//ヒット文字列の一端の表示行番号 [out]long* plACol,//ヒット文字列の一端の表示桁数 [out]long* plBRow,ヒット文字列の他の一端の表示行番号 [out]long* plBCol,ヒット文字列の他の一端の表示桁番号 [out,retval]VARIANT_BOOL *pbResult // 結果格納用 ); <説明> このメソッドはExecSearchByRegExpメソッドを実行した直後に限り、正 常に機能します。 ExecSearchByRegExpは取得する部分文字列を第5パラメータで指定でき ますが、それ以外の部分文字列を得たいときに使います。 存在しない部分文字列を指定した場合などは、*pbResultにFALSEが返り ます。 HRESULT ExecReplace( [in]BSTR lpSearch, // 検索文字列 [in]BSTR lpReplace,// 置換文字列 [in]short stHow, // 置換方法の指定 [out,retval]VARIANT_BOOL *pbResult // 結果の格納用 ); <説明> 「普通」の置換を実行します。 第1パラメータで指定した文字列が見つかると、第2パラメータで指定 した文字列に置き換わります。検索には、設定されている検索フラグが 有効です。すなわち、実行時に検索フラグのBit1が立っていたら、大文 字小文字を区別しません。またBit6が立っていたら、第1パラメータの 文字列を「半角空白で区切られた複数の検索文字列」と解し、OR検索を 実行します。 第3パラメータには次の値のいずれかを指定します。 1 行番号をふやす方向へ検索し、見つかるとそれを置換し停止し   ます。置換の結果カレットは置換文字列の次の位置へ移動しま   す。 2 行番号をへらす方向へ検索し、見つかるとそれを置換し停止し   ます。置換の結果カレットは置換文字列の先頭をさす位置へ移   動します。 3 文書中のすべてのヒット文字列を置換します。 4 選択範囲内にあるすべてのヒット文字列を置換します。 ヒット文字列が見つからなかったときは、*pbResultにFALSEがセットさ れて返ります。 HRESULT MakeReplaceTableForRegExp( [in]BSTR lpReplace, // 置換文字列 [out]long* plRTBL, // 作成した置換表を識別する値の格納用 [in]long lDFA, // DFAテーブルを識別する値。 [out,retval]VARIANT_BOOL* pbResult // 結果格納用。 ); <置換> 正規表現を使った置換を実行するためにはふたつの前準備が必要です。 ひとつはMakeDFATableメソッドによって、DFAテーブルを識別する値と補 助フラグを得ることです。 他のひとつは、このMakeReplaceTableForRegExpメソッドによって置換表 を作成しておくことです。 第1パラメータには置換文字列を指定します。普通の文字列でももちろ んOKですし、検索結果として得られる部分文字列を置換文字列中に含め ることもできます。たとえば部分文字列2と部分文字列1を「あるい は」でつないだものを置換文字列にしたいなら、 CComBSTR bsReplace=_T("$2 + \"あるいは\" + $1"); とします。詳しくはSARIのヘルプ「置換」の項をごらんください。 メソッドが成功すると第2パラメータに置換表を識別する一意な数値が 格納されて返ります。 第3パラメータにはMakeDFATableメソッドで得たDFA値を指定します。 存在しない部分文字列を指定した場合など、なんらかの理由で置換表の 作成が失敗したときは*pbResultにFALSEがセットされて返ります。 なお作成した置換表は、使用がおわったら、CloseReplaceTableメソッド で解放しなければなりません。 HRESULT CloseReplaceTable( [in]long lRTBL // 置換表を識別する値 ); <説明> MakeReplaceTableForRegExpメソッドで得た置換表を解放します。 パラメータにはMakeReplaceTableForRegExpメソッドの第2パラメータに 格納して返された値を指定します。 HRESULT ExecReplaceByRegExp( [in]long lDFA, // DFAを識別する値 [in]long lRegExpFlag, // DFAの補助フラグ [in]short stPart, // 置換する部分の指定 [in]long lRTBL, // 置換表を識別する値 [in]short stHow, // 置換方法の指定 [out,retval]VARIANT_BOOL* pbResult //結果格納用 ); <説明> 正規表現による置換を実行します。 第1パラメータと第2パラメータには、MakeDFATableメソッドで得た値 を指定します。 第3パラメータは置換する部分を0から9までの数値で指定します。0なら ヒットした文字列全体を置換します。1なら部分文字列1、2なら部分文 字列2・・・を置換します。部分文字列については、 ExecSearchByRegExpメソッドの説明、およびSARIのヘルプの検索の項を 参照してください。 第4パラメータには、MakeReplaceTableForRegExpメソッドで得た、置換 表を識別する値を指定します。 第5パラメータは置換方法です。詳しくはExecReplaceメソッドの説明を ご覧ください。 ヒットする文字列が見つからなかったときは、*pbResultにFALSEがセッ トされて返ります。 HRESULT ExecSearchAll( [in]BSTR lpSearch, // 検索文字列 [in]long lFlag, //検索の動作を決定するフラグ [in]short stPart, // 正規表現の場合の選択部分指定 [out,retval]VARIANT_BOOL *pbResult // 結果格納用 ); <説明> 全検索を設定・実行します。 第1パラメータに検索文字列を指定します。正規表現も使用できます。 第2パラメータで検索動作を指定します。各ビットの意味は下記のとお りです。 Bit 1:大文字小文字を区別しない。 Bit 2:正規表現検索で半角全角を区別しない。 Bit 8:オンなら検索文字列を正規表現と解し、正規表現で検索しま    す。 他のビットは無視します。 第3パラメータは正規表現による検索(すなわち第2パラメータのビット 8が立っている)時のみ、意味をもちます。0-9の数字を指定します。0な らヒット文字列全体をハイライト表示します。1なら部分文字列1、2な ら部分文字列2・・・をハイライト表示します。 第4パラメータには全検索が成功したかどうかが返ります。 HRESULT HighlightSearchAll( [in] VARIANT_BOOL bHighlight //ハイライト表示するかどうか ); <説明> 全検索ヒット文字列のハイライト状態を変更します。パラメータがTRUE ならハイライト表示し、FALSEならハイライト表示しません。 HRESULT PriorSearchAll( [out,retval]VARIANT_BOOL *pbResult //結果の格納用 ); <説明> 全検索ヒット文字列を、行番号をへらす方向へ検索し、見つかればその 文字列を選択状態にします。見つからなければ*pbResultにFALSEが返り ます。 HRESULT NextSearchAll( [out,retval]VARIANT_BOOL *pbResult //結果の格納用 ); <説明> 全検索ヒット文字列を、行番号をふやす方向へ検索し、見つかればその 文字列を選択状態にします。見つからなければ*pbResultにFALSEが返り ます。 HRESULT QuitSearchAll(); <説明> 全検索を停止終了します。 HRESULT ExecGrep( [in]BSTR lpGrepStr,// 検索文字列 [in]BSTR lpDir, //グローバル検索を行うディレクトリ [in]BSTR lpFile,//グローバル検索を行うファイルの種類 [in]long lFlag, //検索動作の指定_ [out,retval]VARIANT_BOOL* pbResult //結果格納用 ); <説明> グローバル検索を実行します。 第4パラメータのフラグでは、次にビットが意味をもちます。 Bit 1:大文字小文字を区別しない。 Bit 2:半角全角を区別しない(正規表現) Bit 4:特定の文字をスキップして検索(正規表現) Bit 5:第2パラメータで指定したディレクトリだけでなく、その    サブディレクトリも検索します。 Bit 6:OR検索(普通の検索) Bit 7:AND検索(普通の検索) Bit 8:オンなら検索文字列を正規表現と解し、正規表現で検索しま    す。 Bit 18:自動整形モードに対応(正規表現) Bit 19:自動整形モード時に全角空白もインデントとする。 それぞれの意味については、SARIのヘルプの検索およびグレップの項も 参考にしてください。 存在しない検索ディレクトリを指定した場合など、グレップ動作そのも のが失敗した場合には、*pbResultにFALSEが返ります。グレップ動作が 正常に機能した場合は、ヒット文字列がなかってもTRUEが返ります。 なをグレップの結果は、ドキュメントが空の場合は現在のインスタンス に表示されますが、それ以外は、別にインスタンスを作り、そこに表示 されます。 HRESULT TagJump( [in]BSTR lpJumpTo,//タグを示す文字列 [out,retval]VARIANT_BOOL* pbResult //結果格納用 ); <説明> タグジャンプを実行します。 タグを示す文字列は 絶対パス(論理行番号) という形式で指定します。 ファイルが見つからない場合などは、*pbResultにFALSEが返ります。 HRESULT GetStressWords( [in]VARIANT_BOOL bRegExp,// 正規表現での強調単語かどうか [out, retval]BSTR* pListOfStressWords //強調単語のリスト格納用 ); <説明> 設定されている強調単語のリストを得ます。 強調単語のリストには、普通の検索用のものと、正規表現で検索するも のの2種類があります。 第1パラメータがTRUEなら正規表現用のリストが返ります。 FALSEなら普通の検索用のリストが返ります。 強調単語のリストは、\nをデリミタとして各単語をつないだ形で第2パ ラメータに格納されます。 HRESULT GetPartListOfStressWords( [out, retval]BSTR* pListOfPart //リスト格納用 ); <説明> 正規表現で検索する強調単語のリストにおいて、正規表現のどの部分を 強調するよう設定されているかを返します。すなわち0ならヒット文字列 全体ですし、1なら部分文字列1、2なら部分文字列2・・・です。 強調単語のリストの順に、\nをデリミタとして、指定されている部分を 示す数値を文字として連結したものが、返ります。"1\n0\n2"というよう な形です。 通常は強調単語のリストの要素数と、この指定部分のリストの要素数は 一致しますが、まれに、後者の要素数が少ないことがあります。その場 合は、足らない要素には0が指定されているものとします。 HRESULT SetStressWords( [in]VARIANT_BOOL bRegExp,// 正規表現での強調単語かどうか [in]BSTR lpListOfWords,//強調単語のリスト [in]BSTR lpListOfPart,//強調指定部分のリスト [in]VARIANT_BOOL bWriteToProfile,//プロファイルに書込むかどうか。 [out, retval]VARIANT_BOOL* pbResult //結果の格納用 ); <説明> 強調単語を設定します。 強調単語のリストには、普通の検索用のものと、正規表現で検索するも のの2種類があります。第1パラメータがTRUEなら正規表現用のリスト を設定します。FALSEなら普通の検索用のリストです。 リストは、各強調単語を\nをデリミタとして連結し、それを第2パラメ ータにします。 第3パラメータは正規表現の強調単語を設定する場合にのみ意味を持ち ます。強調する部分を0-9の数字で指定し、それを\nをデリミタとして連 結し、指定します。(GetStressWordsメソッドの説明を参照)。普通の 検索用の強調単語を設定する場合、この第3パラメータには空の文字列 を渡します。 第4パラメータをTRUEにすると、設定したリストはプロファイルに書込 まれ、その設定が次に起動するインスタンスにも受け継がれます。FALSE の場合は、そのインスタンスのみの一時的な変更になります。 指定した正規表現が間違っていたり、存在しない部分文字列を強調指定 したりした場合は、*pbResultにFALSEがセットされて返ります。 変更を反映させるためには、行属性を再構築する必要があります(後注 を参照)。 HRESULT ValidateStressWords( [in]VARIANT_BOOL bValidate //強調単語を強調するかどうか。 ); <説明> 設定されている強調単語の強調・非強調を切り替えます。 TRUEなら強調し、FALSEなら強調しません。 変更を反映させるためには、行属性を再構築する必要があります(後注 を参照)。 HRESULT IsStressWordsEffective( [out, retval]VARIANT_BOOL *pbResult //結果の格納用 ); <説明> 強調単語が強調されているかどうかを返します。 HRESULT GetRowCommentString( [out,retval]BSTR* pbsRowComment // 結果の格納用 ); <説明> 行コメントアウト開始文字列を得ます。 C++なら//です。 HRESULT GetCommentBeginString( [out,retval]BSTR* pbsCommentBegin // 結果の格納用 ); <説明> コメント開始文字列を得ます。 Cなら/*です。 HRESULT GetCommentEndString( [out,retval]BSTR* pbsCommentEnd // 結果の格納用 ); <説明> コメン終了文字列を得ます。 Cなら*/です。 HRESULT SetRowCommentString( [in]BSTR lpNew, // 新しい行コメントアウト文字列 [in]VARIANT_BOOL bWritePrilfe,//プロファイルに書込むかどうか [out,retval]VARIANT_BOOL *pbResult //結果の格納用 ); <説明> 新しい行コメントアウト文字列を設定します。 第2パラメータがTRUEなら、変更をプロファイルに書込みます。 なんらかの原因で変更に失敗したときは*pbResultにFALSEが返ります。 変更を反映させるためには、行属性を再構築する必要があります(後注 を参照)。 HRESULT SetCommentString( [in]BSTR lpBegin,// 新しいコメント開始文字列 [in]BSTR lpEnd,// 新しいコメント終了文字列 [in]VARIANT_BOOL bWritePrilfe ,//プロファイルに書込むかどうか [out,retval]VARIANT_BOOL *pbResult//結果の格納用 ); <説明> コメント文字列を設定します。 第2パラメータがTRUEなら、変更をプロファイルに書込みます。 なんらかの原因で変更に失敗したときは*pbResultにFALSEが返ります。 変更を反映させるためには、行属性を再構築する必要があります(後注 を参照)。 HRESULT ValidateCommentOut( [in]VARIANT_BOOL bValidate //有効にするかどうか ); <説明> パラメータがTRUEならコメントアウト部分の文字色変更機能を有効に し、FALSEなら無効にします。 変更を反映させるためには、行属性を再構築する必要があります(後注 を参照)。 HRESULT IsCommentOutEffective( [out, retval]VARIANT_BOOL *pbResult //結果の格納用 ); <説明> コメントアウト部分の文字色変更機能が有効かどうかを返します。 【行属性の再構築】  ISREditインターフェースのSetMaxColメソッドを使い、行折り処理をやりなお すことによって行います。たとえば、次のような関数を作り、これを呼び出せば いいでしょう。 BOOL RemakeRows(ISREdit *pIEdit) { long lCol; if(FAILED(pIEdit->GetMaxColumn(&lCold))) { MessageBox(NULL, "Failed in GetMaxColumn", "RemakeRows",MB_OK); return FALSE; } if(FAILED(pIEdit->SetMaxColumn(lCol, TRUE, &lCol))){ MessageBox(NULL, "Failed in SetMaxColumn", "RemakeRows",MB_OK); return FALSE; } return TRUE; }