○第101回目 やはりエディタは重要
※QXマクロは、QXエディタ(テキストエディタ)で使用されるマクロのことです。
QXマクロでは、全角スペースはデータ以外は認められていません。コピーして使う場合は、必ず半角スペースに変えてください。
第90回から9回ほどエディタでのマクロを紹介しましたが、使っていますと、その重要性を痛感します。
事務屋としての仕事の半分ぐらいは、エクセルではなく文書の作成の人も多いのではないでしょうか。エディタは文書の体裁という面では弱いのですが、文書の内容を作るという面では非常に活用度が高いと思います。
そんな思いがつのりますので、紹介したQXエディタマクロの機能拡大を紹介します。
文書の編集としてのコピー等の機能です。第93回と第97回のものを中心にしています。
大まかな機能
コピー(移動を含む)と削除を切り替えられる(初期値はコピーとします)。
一字一字の削除は、処理区分にかかわらずdeleteキーでできる(下の場合を除く)。
先頭位置の指定後のdeleteキーは範囲指定の終了と見て指定範囲を削除する。
1回の処理ではなく、連続して処理ができる。
ウィンドウの移動ができる。
見出し一覧を表示し、そこから見出し単位で移動できる。
タスクバーに現在の処理の状態の表示がでる(コピーか移動か削除か。貼付位置の指定か、例えばコピー文字列の先頭の指定か、最後の指定か)。=⇒これは本論ではないので、簡素化するために省略します。
【キーの操作内容】
KEY_RETURN、KEY_SPACE=⇒場所の確定
KEY_PRIOR =⇒上に大きく画面を動かす
KEY_NEXT =⇒下に大きく画面を動かす
KEY_UP、KEY_DOWN、KEY_LEFT、KEY_RIGHT =⇒上下左右にカーソルを動かす
KEY_HOME、KEY_END=⇒文頭、文末にカーソルを動かす
KEY_TAB KEY_BACK =⇒単語単位で左右にカーソルを動かす
KEY_MULTIPLY =⇒コピー・移動の切替指示
KEY_SUBTRACT =⇒なし
KEY_F12 =⇒処理の終了
KEY_F1 =⇒ウィンドウを左に移動
KEY_F2 =⇒ウィンドウを右に移動
KEY_DELETE =⇒一字削除。先頭位置が指定されている場合は、範囲の確定及びその範囲を削除
KEY_SHIFT =⇒直前に修正した箇所に移動
&H43(C) =⇒削除からコピーに処理を切り替える
&H44(D) =⇒コピーから削除に処理を切り替える
&H4D(M) =⇒見出し一覧を表示する
流れです。
1.ウィンドウのハンドル名の取得と、現在のウィンドウの番号の取得
2.最初のカーソル行、場所の取得。使用するキーの指定。初期値の設定
3.大きなループ。F12が押された場合、終了
4.小さなループ。コピー、移動、削除。処理を行った後は指定回数を初期化する。
1.ウィンドウのハンドル名の取得と、現在のウィンドウの番号の取得
'現在のウインドのハンドル名を取得する
gen_hwnd = @hwnd
'全ウインドのハンドル名を取得する
j = 0
hwnd[j] = @@GetHwnd(2)
do while hwnd[j]<>0
j = j + 1
hwnd[j] = @@GetHwnd(0)
if hwnd[j] = gen_hwnd then hwnd_no=j '現在のウィンドウ番号を取得
loop
'全ウインドのハンドル名の数
hwnd_cnt = j
2.最初のカーソル行、場所の取得。使用するキーの指定。初期値の設定
'カーソル行及び場所(バイト数)を記憶
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換
p1=@BytePosCr
'キーの設定
call iskeypressed(KEY_RETURN)
call iskeypressed(KEY_SPACE)
《省略。【キーの操作内容】参照》
call iskeypressed(&H44)
call iskeypressed(&H4D) 'M
'初期値設定
j = hwnd_no 'ウィンドウの移動は、最初は現在のウィンドウを基準とする
flag = 1 '初期状態では、貼付場所が設定されているので、1回の指定がなされているという意味
kubun$ = "1" 'コピーということ
fugou = 1 '終了処理に利用
3.大きなループ。F12が押された場合、終了
do
小さなループ
loop while 1
4.小さなループ。コピー、移動、削除。処理を行った後は諸情報を初期化する。
どのキーが押されたのかは、3行目のようにif文でiskeypressed(KEY_RETURN)というふうにきいていく。
do
call _sleep(50) '無限ループなので、これがないとCPUが回りっぱなしになってしまいます。50とは千分率で、0.05秒休むという意味です。
if iskeypressed(KEY_RETURN) or iskeypressed(KEY_SPACE) then
if kubun$ <> "3" and flag=2 then exit do
if kubun$ = "3" and flag=1 then exit do
if kubun$ <> "3" and flag=0 then
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換
p1=@BytePosCr
gen_hwnd = @hwnd '現在のウィンドウのハンドル名を取得
elseif kubun$ = "3" and flag=0 then '削除処理で何も指定していない時
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換
p1=@BytePosCr
gen_hwnd = @hwnd
@BlockSelect
FOR i=1 to ll005
@MoveRightChar
next
else
@BlockSelect
end if
flag++
elseif iskeypressed(KEY_DELETE) then
if kubun$ = "3" and flag=1 then exit do
@DeleteChar
elseif iskeypressed(KEY_F12) then
fugou = 9 '終了
exit do
elseif iskeypressed(KEY_MULTIPLY) then '*が効く
if kubun$ = "1" then
kubun$ = "2" '移動
else
kubun$ = "1" 'コピー
end if
elseif iskeypressed(KEY_F1) then 'ウィンドウを左に移動
if kubun$ <> "3" or flag <> 1 then '削除で1回指定後は移動できない
j = j + hwnd_cnt - 1
j = j mod hwnd_cnt
@@Activehwnd hwnd[j]
end if
elseif iskeypressed(KEY_F2) then 'ウィンドウを右に移動
if kubun$ <> "3" or flag <> 1 then '削除で1回指定後は移動できない
j = j + 1
j = j mod hwnd_cnt
@@Activehwnd hwnd[j]
end if
elseif iskeypressed(KEY_SHIFT) then
@MoveLastModify '最後の修正があった場所に移動。意味が薄い。
elseif iskeypressed(&h43) then 'C
if kubun$ = "3" and flag = 0 then '3は削除のこと。ここでは、何も指定されていない時に、Cが押された。
kubun$ = "1"
elseif kubun$ = "3" and flag = 1 'ここでは、削除中で、先頭が指定されたいる時に、Cが押された。
kubun$ = "1"
@BlockSelect '選択を解除するという意味。
end if
elseif iskeypressed(&h44) then 'D
if kubun$ <> "3" and flag = 0 then
kubun$ = "3"
elseif kubun$ <> "3" and flag = 1 then
kubun$ = "3"
@BlockSelect
FOR i=1 to ll005
@MoveRightChar
next
end if
elseif iskeypressed(&h4D) then '見出し一覧表示
@ListCaption
elseIf iskeypressed(KEY_PRIOR) then
@ScrollUpHalfPage
elseif iskeypressed(KEY_NEXT) then
@ScrollDownHalfPage
elseif iskeypressed(KEY_LEFT) then
@MoveLeftChar
elseif iskeypressed(KEY_UP) then
@MoveUpChar
elseif iskeypressed(KEY_RIGHT) then
@MoveRightChar
elseif iskeypressed(KEY_DOWN) then
@MoveDownChar
elseif iskeypressed(KEY_END) then
@MoveEndLine
elseif iskeypressed(KEY_HOME) then
@MoveBeginningLine
elseif iskeypressed(KEY_TAB) then '逆にした。感覚的なもの
@MoveLeftWord
elseif iskeypressed(KEY_BACK) then '逆にした。感覚的なもの
@MoveRightWord
end if
loop while 1
if fugou = 9 then exit do '終了の場合
'指定範囲をクリップボードへ、クリックからコピー。削除は単純に削除する
if kubun$ = "1" or kubun$ = "2" then
if kubun$ = "1" then
@BlockClipboardCopy
elseif kubun$ = "2" then
@BlockClipboardCut
end if
@@Activehwnd gen_hwnd '貼付先のウィンドウに移動
@Line = @CrLineToScrLine(y_begin)
@BytePosCr=p1
@BlockClipboardPaste
else
@BlockDelete
end if
flag = 0
(この後に大きなループの loop while 1が続く)

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