2008年6月22日日曜日

しばらく中断(第99回の一歩手前)

○しばらく中断(第99回の一歩手前)

 ここまで98回ほどやってきましたが、よくここまで題材があるという感じを持っています。
一方で、突っ走ってきた感じもしますので、これまでのことを整理したいと思います。後から見れば置き換えるべきところ、整理すべきところがありますので、これまでの内容をざっと見直していきたいと思っています。
 そのために、しばらく中断します。
 題材のほうはまだまだあるのですが、しばし、前に戻って。
 「伸びる前に屈せよ」

 ということで、しばらくは、これまでの整理の過程で気のついた点があれば、不定期的に載せていきたいと思います。

2008年6月14日土曜日

第98回目 QXマクロの紹介(その9)

○第98回目 QXマクロの紹介(その9)
 ※QXマクロは、QXエディタ(テキストエディタ)で使用されるマクロのことです。
  QXマクロでは、全角スペースはデータ以外は認められていません。コピーして使う場合は、必ず半角スペースに変えてください。

 13.あの行をコピーして、中を逆転させればいいのではないか(特にマクロでは、"="の前後を変えたいということがよく起こります)
 14.前後の行を逆転させたい。一行の移動も一種の逆転でしょうか。含めましょう。

 13.あの行をコピーして、中を逆転させればいいのではないか(特にマクロでは、"="の前後を変えたいということがよく起こります)

 どの文字を区切りとするかの指定が必要です。初期値としてはTABを設定します。
 複数行を対象にできたほうが便利かと思います。

 処理の中心部分は非常に簡単です。
 1.指定範囲の行数を取得する
 2.区切り記号を入力する
 3.行の内容を取得
 4.区切り記号がある場所を探す。
 5.区切り記号より後ろの文字列 & 区切り記号 & 区切り記号より前の文字列
 6.新しい文字列を書き込む。
 7.既存の行を削除する
 8.これを指定範囲内の行で行なう

 1.指定範囲の行数を取得する
 定番の処理です。
'選択範囲を記憶
y_begin = @SelectStartLine
y_end = @ScrLineToCrLine(@SelectEndLine) 'これは論理的行
@BlockSelectEnd
if y_begin = 0 then
y_begin = 1
y_end = @ScrLineToCrLine(@LastLine) 'これは論理的行
end if

 2.区切り記号を入力する
'指定文字の入力
msg$ = "区分となる指定文字列をいれてください;タブの場合は0"
in1$ = inputbox$(msg$,"QX 文字列の逆転","0")
if in1$ = "0" then
rr$ = chr$(&H 9)  'TABのこと
else
rr$ = in1$
end if
in11 = len(rr$)

 3.行の内容を取得
   a$ = @TextCr$(@Line)

 4.区切り記号がある場所を探す。
   p1 = instr(a$,rr$)

 5.区切り記号より後ろの文字列 & 区切り記号 & 区切り記号より前の文字列
if p1 <> 0 then
mm1$ = left$(a$,p1-1)
mm2$ = mid$(a$,p1+in11)

 6.新しい文字列を書き込む。
@MoveBeginningLine
@Insert mm2$
@Insert rr$
@Insert mm1$
@InsertF "\n"


 7.既存の行を削除する
@DeleteLineCr
@MoveUpChar
end if

 8.これを指定範囲内の行で行なう
do
 :
@MoveNextLineCr
loop while @ScrLineToCrLine(@Line) <>


 14.前後の行を逆転させたい。一行の移動も一種の逆転でしょうか。含めましょう。

 入力値を3とすれば、現在行を含めて下3行を対象にし逆転するという意味とします。
 入力値を*3とすれば、現在行を含めて3行下の行を現在行の上に移動するという意味とします。
 まず、入力値を分解し、逆転か移動かの区分、対象行数を取得します。行数の初期値としては、2が便利です。2行逆転はよく使います。
 次に、対象行を配列変数に格納します。最大20行もあればいいでしょう。
 現在行から見て、入力値の分だけ格納します。削除も同時に行います。
 挿入は、逆から行ないます。以下参照
 '読み込み処理。
for i = 0 to p1-1  'p1は入力された行数
mm$[i] = @TextCr$(@Line)
@DeleteLineCr '当該行を削除
next
'コピー
for i = p1 to 0
@Insert mm$[i]
@InsertF "\n"
next

 一行移動の場合も、読み込み処理までは同じで、コピーするときに、2,1,0と書き込む代わりに、2,0,1とすれば十分かと思われます。

 今のは下の行に対してですが、上の行に対しても考えてみてください。入力値は-3、*-3とかにします。
 成功を祈ります。

2008年6月7日土曜日

第97回目 QXマクロの紹介(その8)

○第97回目 QXマクロの紹介(その8)
 ※QXマクロは、QXエディタ(テキストエディタ)で使用されるマクロのことです。
  QXマクロでは、全角スペースはデータ以外は認められていません。コピーして使う場合は、必ず半角スペースに変えてください。

 QXはタブ形式のテキストエディタです。その一つ一つのタブを一つのウィンドウといいます。
 最高20まで開くことが出来るそうです(やったことはありませんが…)。
 あるウィンドウのある場所を、違うウィンドウのある場所にコピーする、というのが今回のテーマです。
 ウィンドウはどのようにして特定されているのか、その特定されたコードをどうやって全部取得することができるのか。今のウィンドウはどこに対応するものなのか。
 結果的には簡単でした。

'現在アクティブになっているウインドのハンドル名を取得する
gen_hwnd = @hwnd
'全ウインドのハンドル名を取得する
 j = 0
 hwnd[j] = @@GetHwnd(2) '表示されているタブの順番にハンドル名を取得という宣言で、一番目のハンドル名を取得
if hwnd[0] = gen_hwnd then j0=0 '現在
アクティブになっているウィンドウ番号を取得
 j = 0

 hwnd[j] = @@GetHwnd(2) '表示されているタブの順番にハンドル名を取得という宣言で一番目のハンドル名を取得
 do while hwnd[j]<>0  '二番目以降のハンドル名を取得
j = j + 1
hwnd[j] = @@GetHwnd(0)
if hwnd[j] = gen_hwnd then j0=j '現在アクティブになっているウィンドウ番号を取得
 loop
hwnd_cnt = j  '開かれているウィンドウ数
※ハンドル名はまったく意味不明な数値です。

 現在のウィンドウを選択
 j=j0
 @@Activehwnd hwnd[j]

 ウィンドウの移動
call iskeypressed(KEY_F1)
call iskeypressed(KEY_F2)
  :
  :
elseif iskeypressed(KEY_F1) then 'ウィンドウを左に移動
j = j + hwnd_cnt - 1 '左へ移動
j = j mod hwnd_cnt  'ウィンドウ数で割った余りでウィンドウを選択
@@Activehwnd hwnd[j]
elseif iskeypressed(KEY_F2) then 'ウィンドウを右に移動
j = j + 1
j = j mod hwnd_cnt
@@Activehwnd hwnd[j]
  :

 ここからは、ウィンドウ内の処理ですから、矢印キー等で貼り付け場所を指定します。
 EnterまたはSpaceキーで確定です。
 そこに、貼り付けます。
 クリップボードへのコピー、クリップボードからの貼り付けは前回どおりです。

※これまでのものにウィンドウを渡り歩くという機能をつけると、処理の幅広がります。