○第91回目 QXマクロの紹介(その2)
※QXマクロは、QXエディタ(テキストエディタ)で使用されるマクロのことです。
QXマクロでは、全角スペースはデーター以外は認められていません。コピーして使う場合は、必ず半角スペースに変えてください。
まず、
3.前の行のあの部分をコピーしたい
5.あの行(複数の行も可能とする)をコピーしたい(それをもとに修正すれば早い)
を取り上げてみます。
簡単なほうから
5.あの行(全体)をコピーしたい(それをもとに修正すれば早い)
この機能の意味はお分かりでしょうか。
カーソルのある行を0とみたてて、前の行は、1、2、3…、後ろの行は-1、-2、-3…と数えることにします。
0-3とした場合=⇒現在行を含めて前の4行を現在行の前の行にコピーします。
2-3とした場合=⇒2行前と3行前の行を現在行の前の行にコピーします。
3とした場合=⇒3行前の行を現在行の前の行にコピーします。
後ろの場合はマイナスをつけるだけで指示は同様です。-0-3、-2-3、-3.
後ろの行をコピーする場合も、コピー文はカーソルのある行の前にコピーします。
では、0と指定した場合はどういう意味になるでしょうか。カーソルの行をカーソルの行の前にコピーすることにします。-3-(+2)というような意味合いの指定は出来ないこととします。
禁止事項はこれ以外にも、3-2、-3-2もダメとします。
(QXマクロの一般的なお約束事は第33回及び34回参照)
流れのポイントを見て行きます
1.カーソルのある行の行番号を取得する
2.コピーする箇所の入力。2-3など。
3.入力値の分解
4.コピーすべき行を配列変数に入れる(MAX100行としました)
5.カーソルを、最初の行の前に置く
6.コピーした文を貼付ける、改行を貼付ける。これを指定した回数繰りかえす。
7.貼付けた一群の行の先頭行の行頭にカーソルを置く
1.カーソルのある行の行数を取得する
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換
※@Lineそのものは物理的な行数(表示単位の行数)となっています。
2.コピーする箇所の入力
msg$ = "コピーしたい範囲の行数を入力してください。後ろの文章の場合はマイナス付き。例;3-5、-2-4、3、-3"
in1$ = inputbox$(msg$,,"0-2")
if in1$ = "99" then exit proc
99が入ってきた場合は終了としました。
3.入力値の分解。開始行、終了行の把握
入力値の中の"-"の位置を調べます。
ない場合…前の単一行の指定=⇒そのものが開始行であり終了行
ある場合でその場所が1ではない…前の複数行の指定=⇒"-"の前が終了行、後が開始行
ある場合でその場所が1でありほかに"-"がない…後ろの単一行の指定=⇒そのものが開始行であり終了行
ある場合でその場所が1でありほかに"-"がある…後ろの複数行の指定=⇒"-"の前が開始行、後が終了行
"-"の場所は、 p1=instr(in1$,"-")でもとめます。
二つ目の"-"の場所は、 p2=instr(mid$(in1$,p1+1),"-")でもとめます。
ここで使う変数は文字型なので、分解したあとvalで数字型にしておきます。
前の複数行指定の場合で、一つ目の"-"の前と後ろは、
in19 = val(left$(in1$,p1-1))*(-1)
in11 = val(mid$(in1$,p1+1))*(-1)
で取り出します。開始・終了行が逆のように見えるのに注意してください
後の複数行指定の場合では、一つ目の"-"が一つ余計についているので、
in11 = val(mid$(in1$,p1+1,p2-1))
in19 = val(mid$(in1$,p1+p2+1))
で取り出します。
4.該当する行を配列変数に入れる(MAX100行としました)
最初にカーソルがあった行からの相対的な位置は、in11とin19に入っています。
この場合は、前はマイナス、後はプラスの数値となっています。
コピーすべき行の相対的位置は、in11からin19になります。
それを配列変数に格納しておきます。
'コピーもとの行に移動
@Line = @CrLineToScrLine(y_begin+in11)
( )の中は論理行となっています。それを表示上の行にしています。
gyo_cnt = in19-in11+1
'格納処理。
for i = 1 to gyo_cnt
mm$[i] = @TextCr$(@Line) 論理的な一行分の取得はこうします。改行は含まれません
@MoveNextLineCr '次の行(論理行)へ
next
5.カーソルを、最初の行の行頭に置く
ここまでは、行を追加していませんので行の関係は最初のままです。
最初の行に制御を移します。
@Line = @CrLineToScrLine(y_begin)
6.コピーした文を貼付ける、改行を貼付ける。これを指定した回数繰りかえす。
@MoveBeginningLine
for i = 1 to gyo_cnt
@Insert mm$[i]
@InsertF "\n"
next
これは説明が不要だと思います。
7.カーソルを貼付けた一群の行の先頭行の行頭に置く
前の場合、後の場合とも、最初の行となります。。
したがって、
@Line = @CrLineToScrLine(y_begin)
となります。
結構かかりました。今回はここまでとします。

0 件のコメント:
コメントを投稿