// 演算子の前後を入れ替える。 // TAB=4 // 実行には PPA.DLL が必須です。PPA.DLL を入手して sakura.exe と同じフォルダに入れておいてください。 // マクロファイルの拡張子は .PPA でなくてはなりません。 // 文字列を範囲選択してから実行すると、選択範囲(先頭の1行のみ)内の文字列を // 演算子の前後を入れ替えます。例えば // ・if( ch <= 'A' ) // で「 ch <= 'A' 」を範囲選択してから実行すると // ・if( 'A' <= ch ) // となります。 // 演算子として判定されるのは、最も文字列の前方にある <=>! 何れかの文字列です。 var str:String; idt,p1,cnd,p2,bk:String; ch:String; pt,sh,nm:Integer; // for debug CRLF,mess:String; begin str := S_GetSelectedString(0); // 選択部分の文字列を取得 // 以降で、選択範囲文字列 str から // ・idt:先頭部分のタブ・スペース類 // ・p1 :演算子の前の文字列(先頭・末尾のタブ・スペース類を含まない) // ・cnd:演算子、及び、その前後のタブ・スペース類 // ・p2 :演算子の後ろの文字列(先頭・末尾のタブ・スペース類を含まない) // ・bk :末尾部分のタブ・スペース類 // に分けていく。 // 比較演算子の先頭位置を sh に取得する。 sh := Length(str); pt := Pos('<',str); if( (pt <> 0)and(pt < sh) ) then sh := pt; pt := Pos('>',str); if( (pt <> 0)and(pt < sh) ) then sh := pt; pt := Pos('=',str); if( (pt <> 0)and(pt < sh) ) then sh := pt; pt := Pos('!',str); if( (pt <> 0)and(pt < sh) ) then sh := pt; // sh = 演算子の先頭位置 // 演算子文字の文字数を nm に取得する。 nm := 0; for pt := sh to Length(str) do begin ch := Copy(str,pt,1); if( (ch <> '<')and(ch <> '>')and(ch <> '=')and(ch <> '!') ) then break; // 演算子文字でなければループ脱出 nm := nm + 1; end; p1 := Copy ( str , 1 , sh - 1 ); // p1 := 演算子の前まで(演算子含まない)の文字列 cnd := Copy ( str , sh , nm ); // cnd := 演算子部分の文字列 p2 := Delete( str , 1 , sh - 1 + nm ); // p2 := 演算子より後ろ(演算子含まない)の文字列 // *** p1 末尾のタブ・スペース類を cnd 先頭に移動する。 *** // str := p1; // str := p1 そのまま p1 := TrimRight(p1); // p1 := 末尾のタブ・スペース類を取り除いた文字列 // str と p1 の文字数の差が「元の p1 の末尾部分にあったタブ・スペース類の文字数」である。 // この値を利用して、末尾部分のタブ・スペース類を cnd 先頭に追加する。 cnd := Copy( str , Length(p1)+1 , Length(str)-Length(p1) ) + cnd; // *** p2 先頭のタブ・スペース類を cnd の末尾に移動する。 *** // str := p2; // str := p2 そのまま p2 := TrimLeft(p2); // p2 := 先頭のタブ・スペース類を取り除いた文字列 // str と p2 の文字数の差が「元の p2 の先頭部分にあったタブ・スペース類の文字数」である。 // この値を利用して、先頭部分のタブ・スペース類を cnd 末尾に追加する。 cnd := cnd + Copy( str , 1 , Length(str)-Length(p2) ); // *** p1 先頭のタブ・スペース類を idt に移動する。 *** // str := p1; // str := p1 そのまま p1 := TrimLeft(p1); // p1 := 先頭のタブ・スペース類を取り除いた文字列 // str と p1 の文字数の差が「元の p1 の先頭部分にあったタブ・スペース類の文字数」である。 // この値を利用して、先頭部分のタブ・スペース類を idt に格納する。 idt := Copy( str , 1 , Length(str)-Length(p1) ); // *** p2 末尾のタブ・スペース類を cnd 先頭に移動する。 *** // str := p2; // str := p2 そのまま p2 := TrimRight(p2); // p2 := 末尾のタブ・スペース類を取り除いた文字列 // str と p2 の文字数の差が「元の p2 の末尾部分にあったタブ・スペース類の文字数」である。 // この値を利用して、末尾部分のタブ・スペース類を cnd 先頭に追加する。 bk := Copy( str , Length(p2)+1 , Length(str)-Length(p2) ); // for Debug 取得した情報をダイアログに表示する。 CRLF := ' '; // mess := ''; // mess := mess + '[' + idt + ']' + CRLF; // mess := mess + '[' + p1 + ']' + CRLF; // mess := mess + '[' + cnd + ']' + CRLF; // mess := mess + '[' + p2 + ']' + CRLF; // mess := mess + '[' + bk + ']' + CRLF; // mess := mess + '--------------------' + CRLF; // mess := mess + '[' + str + ']' + CRLF; // MessageBox( mess,'Debug',0 ); // Exit(); if ( p1 = '' ) then Exit(); // p1 (演算子の前の物)が空なら何もせず終了 if ( cnd = '' ) then Exit(); // cnd (演算子部分)が空なら何もせず終了 if ( p2 = '' ) then Exit(); // p2 (演算子の後ろの物)が空なら何もせず終了 S_InsText( idt + p2 + cnd + p1 + bk ); // p1 と p2 を入れ替えてエディタへ書き出す。 end;