2008年12月14日日曜日

第101回目 やはりエディタは重要

○第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 件のコメント: