QX小物マクロ集

前のページに戻る




2003年4月29日 2003年10月12日

2002年に作ったマクロ

 

ファイルを閉じると同時に履歴からも除去

proc filecloseremovehistory()
    dim fn$,tmp
    if @hwnd=0 then end '文章を編集していない
    fn$=@pathname$
    tmp=@hwnd
    @fileclose
    if tmp=@hwnd then end '閉じなかった場合
    for tmp=1 to 60
        if ucase$(@@FileHistory$(tmp))=ucase$(fn$) then
            @@FileHistoryDelete tmp,0
            print fn$+"を履歴から除外しました。"
            end
        end if
    next
end proc

マクロ実行(@MacroExecMainの機能強化版) 

proc main
 
    'カレント文書が無ければ終了
    if @hwnd=0 then end
 
    'カレント文書がマクロなら同名保存したうえで実行
    if sub1(@pathname$)=TRUE then
        @filesave
        @@jumpmacro @pathname$+",main"
        end
    end if
 
    '変数の宣言
    dim handle[63] as hwnd
    dim nowhandle as hwnd
    dim macroname$[63]
    dim i,mx,mx2,ret
 
    'カレント文書のウィンドウハンドルを保存
    nowhandle=@hwnd
 
    '編集中の文書の全ウィンドウハンドルを取得
    mx=0
    handle[mx++]=@@gethwnd(1)
    do while handle[mx-1]
        handle[mx++]=@@gethwnd(0)
    loop
 
    '編集中の全文書のファイル名をチェック
    mx2=1
    for i=0 to mx-1
        @@Activehwnd2 handle[i]
        if sub1(@pathname$)=TRUE then
            macroname$[mx2++]=@pathname$
        end if
    next
    @@activehwnd2 nowhandle
 
    '編集中のファイル内にMACが幾つあるかで処理が変わる
    if mx2=1 then end 'マクロなし
    if mx2=2 then @@jumpmacro macroname$[1]+",main":end 'マクロ1つ
 
    'マクロが複数選択されているので選択して実行
    ret=popupmenu(macroname$,0,0)
    if macroname$[ret]="" then end
    @@jumpmacro macroname$[ret]+",main"
    end
end proc
 
function sub1(a$) '良い名前が浮かばなかったので適当
    if ucase$(a$)=ucase$(macrofilename$) then exit function
    if ucase$(mid$(a$,inrstr(a$,".")+1))="MAC"then
        sub1=TRUE
    end if
end function
 

アンインデントor常駐リストActive 

 
proc shift4tab
    '範囲選択しているならアンインデント
    '範囲選択していないなら常駐リストをアクティブに
    '管理人はShift+Tabに登録して使用しています。
    if @hwnd=0 then end
    if @select=0 then
        @ModeToolListActive
    else
        @blockunindent
    end if
end proc
 

フォント拡大

proc fontbig
    'フォントを引数に指定したドット数大きくします
    '引数を省略すると1ドットと見なします
    dim tmp
    if @hwnd = 0 then exit proc
    tmp=val(command$(1))
    if tmp=0 then tmp=1
    @redraw=0
    if @fontsize+tmp=<60 then 
        @fontsize=@fontsize+tmp
    end if
    @redraw=1
    print "FontSize="+str$(@fontsize)+"dots,1行"+str$(@width)+"文字."
end proc

フォント縮小

 
proc fontsmall
    'フォントを引数に指定したドット数小さくします
    '引数を省略すると1ドットと見なします
    dim tmp
    if @hwnd = 0 then exit proc
    tmp=val(command$(1))
    if tmp=0 then tmp=1
    @redraw=0
    if @fontsize-tmp>=10 then 
        @fontsize=@fontsize-tmp
    end if
    @redraw=1
    print "FontSize="+str$(@fontsize)+"dots,1行"+str$(@width)+"文字."
end proc

編集画面色反転

proc colorreverse
    'フォント色と背景色などを反転させる
    '書式設定の設定は変更しません
    if @hwnd=0 then end
    @redraw=0
    '将来の仕様変更に合わせた追加変更を
    '容易に行うため、敢えて内容を羅列した。
    colorreverse_sub1"text"
    colorreverse_sub1"Article"
    colorreverse_sub1"ZenSpace"
    colorreverse_sub1"FontChar"
    colorreverse_sub1"FontCharHk"
    colorreverse_sub1"Search"
    colorreverse_sub1"Select"
    colorreverse_sub1"EOF"
    colorreverse_sub1"Url"
    colorreverse_sub1"Quote"
    colorreverse_sub1"Word1"
    colorreverse_sub1"Word2"
    colorreverse_sub1"Word3"
    colorreverse_sub1"Word4"
    colorreverse_sub1"Word5"
    colorreverse_sub1"Word6"
    colorreverse_sub1"Comment"
    colorreverse_sub1"String"
    colorreverse_sub1"Caption1"
    colorreverse_sub1"Caption2"
    colorreverse_sub1"Caption3"
    colorreverse_sub1"Caption4"
    colorreverse_sub1"Caption5"
    colorreverse_sub1"Caption6"
    colorreverse_sub1"Caption7"
    colorreverse_sub1"Caption8"
    colorreverse_sub1"Caption9"
    colorreverse_sub1"Caption10"
    colorreverse_sub1"CaptionNum"
    colorreverse_sub1"CaptionMNum"
    colorreverse_sub1"CaptionAlp"
    colorreverse_sub1"CaptionKana"
    colorreverse_sub1"CaptionDai"
    colorreverse_sub1"Memo"
    colorreverse_sub1"Code"
    colorreverse_sub1"Paren"
    colorreverse_sub1"CompList1"
    colorreverse_sub1"CompList2"
    colorreverse_sub1"CompList3"
    colorreverse_sub1"CompList4"
    colorreverse_sub1"CompList5"
    colorreverse_sub1"ToolList"
    colorreverse_sub1"Tooltip"
    colorreverse_sub1"Dictionary"
    colorreverse_sub2"Tab"
    colorreverse_sub2"Return"
    colorreverse_sub2"PReturn"
    colorreverse_sub2"ReturnLF"
    colorreverse_sub2"ReturnCr"
    colorreverse_sub2"FrmReturn"
    colorreverse_sub2"Fold"
    colorreverse_sub2"Modify"
    colorreverse_sub2"Modify2"
    colorreverse_sub2"Mark"
    colorreverse_sub2"NumLine"
    colorreverse_sub2"VertRule"
    colorreverse_sub2"LineRule"
    colorreverse_sub2"GenkoRule"
    colorreverse_sub2"GenkoPage"
    colorreverse_sub2"Underline"
    @redraw=1
end proc
 
sub colorreverse_sub2(a1$)
    dim n1,f1,c1,v[3]
    dim tmp$,tmp
    n1=@@ColorIndex(a1$)
    c1=@colorget(n1+2000)
    tmp$=right$("000000"+hex$(c1),6)
    v[1]=val("&H"+mid$(tmp$,1,2))
    v[2]=val("&H"+mid$(tmp$,3,2))
    v[3]=val("&H"+mid$(tmp$,5,2))
    for tmp=1 to 3
            v[tmp]=255-v[tmp]
    next
    @colorset n1,v[1]*65536+v[2]*256+v[3]
end sub
 
sub colorreverse_sub1(a1$)
    'フォント色と背景色を反転させる
    dim n1,c1,n2,c2
    dim a2$
    a2$=a1$+"back"
    n1=@@ColorIndex(a1$)
    c1=@colorget(n1+2000)
 
    n2=@@ColorIndex(a2$)
    c2=@colorget(n2+2000)
 
    @colorset n1,c2
    @colorset n2,c1
end sub

Clipモード

proc main
    if @canedit=0 then end
    call iskeypressed(0)
    print "Clipモード開始。終了はENTERキー。"
    clipboard$=""
    do while iskeypressed(KEY_RETURN)=0
        call _sleep(100)
        if val(clipboard$(-1))<>0 then 
            dim size
            size=val(clipboard$(-1))
            do
                call _sleep(200)
            loop while size<>val(clipboard$(-1))
            dim n,tmp$
            @charreturn
            @charreturn
            @input "------[ "+date0$+" "+time0$+" ]------"
            @charreturn
            @charreturn
            for n=1 to val(clipboard$(-2))
                tmp$=clipboard$(n)
                if right$(tmp$,1)=chr$(10)then tmp$=left$(tmp$,len(tmp$)-1)
                if right$(tmp$,1)=chr$(13)then tmp$=left$(tmp$,len(tmp$)-1)
                @input tmp$
                @charreturn2
            next
            beep
            clipboard$=""
            print "Clipモード開始。終了はENTERキー。"
        end if
    loop
    print"Clipモードを終了しました。"
end proc

2003年4月29日(火) 

 

ファイルバーの順番に編集ウィンドウを切り替える(04/29)

proc main
    if @hwnd=0 then exit sub
    dim hwnd[@@ParametersInfo(1)]
    dim i,n 'i...編集中の窓の数 n...何番目の編集窓なのか
    i=1
    hwnd[i]=@@gethwnd(2)
    do
        if @hwnd=hwnd[i] then n=i
        i++
        hwnd[i]=@@gethwnd(0)
    loop while hwnd[i]
    n++
    if n=i then n=1
    @@Activehwnd hwnd[n]
end proc

ファイルバーの逆順に編集ウィンドウを切り替える(04/29)

proc main
    if @hwnd=0 then exit sub
    dim hwnd[@@ParametersInfo(1)]
    dim i,n 'i...編集中の窓の数 n...何番目の編集窓なのか
    i=1
    hwnd[i]=@@gethwnd(2)
    do
        if @hwnd=hwnd[i] then n=i
        i++
        hwnd[i]=@@gethwnd(0)
    loop while hwnd[i]
    n--
    if n=0 then n=i-1
    @@Activehwnd hwnd[n]
end proc

2003年10月12日(日)

 

簡易ファイラ(開発途中のテスト版)

'QXマクロ上で動作する簡易ファイラ。機能の充実、速度の向上、エラー処理などが今後の課題。当然、未保証。

'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'QXマクロ上で動作する簡易ファイラ(α1版)2003/10/10
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'1.いわゆる1画面ファイラです。移動先や複写先の指定はフォルダリストで行います。
'2.機能は『QXで開く』『複写』『移動』『削除』『名前変更』のみ。
'3.SPACEでファイル選択しENTERでファイル処理メニューを表示。ESCで終了メニュー表示。
 
proc main()
 
'宣言と定数
dim wildcard$,currentfolder$                    'wildcard$は将来の拡張用
dim escmenu$[15],escmenucmd[15]                    'ESCメニュー
dim entermenu$[15],entermenucmd[15]                'ENTERメニュー
dim execlist$                                    'SHFileOperation用の作業対象ファイルリスト
dim viewlist$[1023],viewname$[1023]                'ViewList用
dim viewfolderflag[1023],viewchoiceflag[1023]    
dim viewmax
dim flagnorefresh                                '表示の行進をしないフラグ
dim tmp$,tmp,i,cmd                                '雑用
dim filename$,extname$                            '雑用2
 
'定数
const idviewlist        =100 'コントロール
const idadress            =101
const idstatus            =102
const idsort            =103
const ESC_CHRDIR        =  1 'ESCメニュー
const ESC_CLOSE            =  2
const ESC_NEWFILE        =  3
const ESC_NEWFOLDER        =  4
const ENTER_QXOPEN        =100 'ENTERメニュー
const ENTER_RENAME        =101
const ENTER_DELETE        =102
const ENTER_COPY        =103
const ENTER_MOVE        =104
 
'WindowsAPIのファイル操作命令
Const LB_ADDSTRING = &H180
Const LB_INSERTSTRING = &H181
Const LB_DELETESTRING = &H182
Const LB_SELITEMRANGEEX = &H183
Const LB_RESETCONTENT = &H184
Const LB_SETSEL = &H185
Const LB_SETCURSEL = &H186
Const LB_GETSEL = &H187
Const LB_GETCURSEL = &H188
Const LB_GETTEXT = &H189
Const LB_GETTEXTLEN = &H18A
Const LB_GETCOUNT = &H18B
Const LB_SELECTSTRING = &H18C
Const LB_DIR = &H18D
Const LB_GETTOPINDEX = &H18E
Const LB_FINDSTRING = &H18F
Const LB_GETSELCOUNT = &H190
Const LB_GETSELITEMS = &H191
Const LB_SETTABSTOPS = &H192
Const LB_GETHORIZONTALEXTENT = &H193
Const LB_SETHORIZONTALEXTENT = &H194
Const LB_SETCOLUMNWIDTH = &H195
Const LB_ADDFILE = &H196
Const LB_SETTOPINDEX = &H197
Const LB_GETITEMRECT = &H198
Const LB_GETITEMDATA = &H199
Const LB_SETITEMDATA = &H19A
Const LB_SELITEMRANGE = &H19B
Const LB_SETANCHORINDEX = &H19C
Const LB_GETANCHORINDEX = &H19D
Const LB_SETCARETINDEX = &H19E
Const LB_GETCARETINDEX = &H19F
Const LB_SETITEMHEIGHT = &H1A0
Const LB_GETITEMHEIGHT = &H1A1
Const LB_FINDSTRINGEXACT = &H1A2
Const LB_SETLOCALE = &H1A5
Const LB_GETLOCALE = &H1A6
Const LB_SETCOUNT = &H1A7
Const LB_MSGMAX = &H1A8
Const FO_MOVE = &H1
Const FO_COPY = &H2
Const FO_DELETE = &H3
Const FO_RENAME = &H4
Const FOF_MULTIDESTFILES = &H1
Const FOF_CONFIRMMOUSE = &H2
Const FOF_SILENT = &H4                      '  don't create progress/report
Const FOF_RENAMEONCOLLISION = &H8
Const FOF_NOCONFIRMATION = &H10             '  Don't prompt the user.
Const FOF_WANTMAPPINGHANDLE = &H20          '  Fill in SHFILEOPSTRUCT.hNameMappings
Const FOF_ALLOWUNDO = &H40
Const FOF_FILESONLY = &H80                  '  on *.*, do only files
Const FOF_SIMPLEPROGRESS = &H100            '  means don't show names of files
Const FOF_NOCONFIRMMKDIR = &H200            '  don't confirm making any needed dirs
type SHFILEOPSTRUCT
    dhwnd                 as HWND
    wFunc                 as long'1:移動,2:複写,3:削除
    pFrom                 as long
    pTo                   as long
    fFlags                as integer
    fAnyOperationsAborted as long
    hNameMappings         as long
    lpszProgressTitle     as long
end type
dllname "SHELL32.DLL"
cdeclare long SHFileOperation(SHFILEOPSTRUCT *)
dim shfo as SHFILEOPSTRUCT
 
 
'初期化
if @hwnd<>0 then 
    currentfolder$=@pathname$
    currentfolder$=left$(currentfolder$,inrstr(currentfolder$,"\"))
end if
if currentfolder$="" then currentfolder$=@@qxdirectory$
wildcard$="*.*"
i=1 'ESCメニュー
escmenucmd[i]=ESC_CHRDIR    :escmenu$[i++]="フォルダ変更(&M)"
escmenucmd[i]=0                :escmenu$[i++]="-"
escmenucmd[i]=ESC_NEWFILE    :escmenu$[i++]="空ファイルの作成(&N)"
escmenucmd[i]=ESC_NEWFOLDER    :escmenu$[i++]="フォルダの作成(&F)"
escmenucmd[i]=0                :escmenu$[i++]="-"
escmenucmd[i]=ESC_CLOSE        :escmenu$[i++]="閉じる(&C)"
i=1 'ENTERメニュー
entermenucmd[i]=ENTER_QXOPEN    :entermenu$[i++]="QXで開く(&Q)"
entermenucmd[i]=ENTER_RENAME    :entermenu$[i++]="名前変更(&R)"
entermenucmd[i]=0                :entermenu$[i++]="-"
entermenucmd[i]=ENTER_MOVE        :entermenu$[i++]="移動(&M)"
entermenucmd[i]=ENTER_COPY        :entermenu$[i++]="複写(&C)"
entermenucmd[i]=0                :entermenu$[i++]="-"
entermenucmd[i]=ENTER_DELETE    :entermenu$[i++]="削除(&D)"
'ダイアログの作成
dialog "簡易ファイラ",0,0,50*4,17*8,0,"FixedSys"
control "",idviewlist,"LISTBOX",WS_HSCROLL+WS_VSCROLL+LBS_MULTIPLESEL+ _
    LBS_DISABLENOSCROLL+WS_BORDER,4,12,48*4,14*8
control "OK",IDOK,"BUTTON",BS_PUSHBUTTON,100*4,100*8,8*4,2*8
control "Menu",IDCANCEL,"BUTTON",BS_PUSHBUTTON,100*4,15*8,8*4,2*8
control "Help:SPACEで選択しENTERでファイルを操作。ESCで特殊機能。",idstatus,"STATUSBAR",0,0,0,0,0
control "",idadress,"STATIC",0,4,2,50*4,10
control "SORT用",idsort,"LISTBOX",LBS_SORT,100*4,0,0,0
 
do while -1 'とりあえず無限ループ
    'ファイルリストの作成
    if flagnorefresh=1 then 
        flagnorefresh=0
    else
        print "ファイル情報を取得中..."
        if right$(currentfolder$,1)<>"\" then currentfolder$=currentfolder$+"\"
        tmp$=dir$(currentfolder$+wildcard$)
        i=0
        do while tmp$<>""
            if tmp$="." or ((tmp$="RECYCLED" or tmp$="..") and len(currentfolder$)=3) then 
            else
                i=i+1
                viewname$(i)=tmp$
            end if
            tmp$=dir$()
        loop
        viewmax=i
        for i=1 to viewmax
            tmp$=viewname$[i]
            'ファイル名と拡張子を分ける
            if instr(tmp$,".")=0 then
                filename$=tmp$
                extname$=""
            elseif tmp$=".."then
                filename$=".."
                extname$=""
            else
                filename$=left$(tmp$,inrstr(tmp$,".")-1)
                extname$=mid$(tmp$,inrstr(tmp$,".")+1)
            end if
            'ファイル名
            viewlist$(i)=leftb$(leftb$(filename$,15)+space$(15),15)
            if lenb(tmp$)>19 then 
                viewlist$[i]=viewlist$[i]+"~ "
            else
                viewlist$[i]=viewlist$[i]+"  "
            end if
            '拡張子
            viewlist$(i)=viewlist$(i)+leftb$(leftb$(extname$,4)+space$(5),5)
            'サイズ
            tmp=getattr(currentfolder$+tmp$)
            if(tmp and &H10) then 
                tmp$="<<Dir>>"
                tmp$=leftb$("<<Dir>>"+space$(10),10)
                viewfolderflag[i]=1
            else
                if filelen(currentfolder$+viewname$[i])=0 then 
                    tmp$="0"
                else
                    tmp$=str$(filelen(currentfolder$+viewname$[i])/1024+1)
                end if
                tmp$=rightb$(rightb$(space$(9)+tmp$+" k",10),10)
                viewfolderflag[i]=0
            end if
            viewlist$[i]=viewlist$[i]+tmp$
            '日付
            tmp$=filedatetime$(currentfolder$+viewname$[i])
            viewlist$[i]=viewlist$[i]+" "+tmp$
            if i mod 20=0 then print str$(i)+"件目のファイル情報を取得中..."
        next
        print
        viewmax=i
        i++:viewlist$(i)=""
        dlglistboxarray idviewlist,viewlist$
        dlgtext$ idadress,currentfolder$+wildcard$
        dlgvalue idviewlist,1
    end if
    'ユーザー操作
    cmd=dialog(1+DLGN_DOUBLECLICKED)
    if cmd=IDOK then 'ENTERを押したとき
        tmp=dlgitemcmd(idviewlist,LB_GETSELCOUNT,0,0)
        if tmp=0 then '選択せずにENTER
            tmp=dlgvalue(idviewlist)+1
            if viewfolderflag[tmp]=1 then 'フォルダ移動
                if viewname$[tmp]=".." then 
                    currentfolder$=left$(currentfolder$,len(currentfolder$)-1)
                    currentfolder$=left$(currentfolder$,inrstr(currentfolder$,"\"))
                else
                    currentfolder$=currentfolder$+viewname$[tmp]+"\"
                end if
            else 'ファイルをQXで開く
                call @@openfile(currentfolder$+viewname$[tmp])
                end
            end if
        else '選択してENTER
            cmd=entermenucmd[popupmenu(entermenu$,0,0)]
            execlist$=""
            for i=1 to viewmax
                if dlgitemcmd(idviewlist,LB_GETSEL,i-1,0)>0 then 
                    execlist$=execlist$+currentfolder$+viewname$[i]+chr$(0)
                end if
            next
            execlist$=execlist$+chr$(0)
            if cmd=ENTER_QXOPEN then 
                for i=1 to viewmax
                    if dlgitemcmd(idviewlist,LB_GETSEL,i-1,0)>0 then 
                        call @@openfile(currentfolder$+viewname$[i])
                    end if
                next
                end
            elseif cmd=ENTER_RENAME or cmd=ENTER_DELETE or _
                    cmd=ENTER_MOVE or cmd=ENTER_COPY then
                if cmd=ENTER_RENAME and tmp<>1 then 
                    call msgbox("ファイルが複数選択されています。")
                else
                    if cmd=ENTER_RENAME then 
                            tmp$=left$(execlist$,len(execlist$)-2)
                            tmp$=mid$(tmp$,inrstr(tmp$,"\")+1)
                            tmp$=inputbox$("新しい名前を入力してください。","名前の変更",tmp$,"")
                            tmp$=currentfolder$+tmp$
                            tmp=4
                    elseif cmd=ENTER_MOVE then 
                            tmp$ = getfolder$("移動先のフォルダを選んで下さい。",currentfolder$)
                            tmp=1
                    elseif cmd=ENTER_COPY then 
                            tmp$ = getfolder$("複写先のフォルダを選んで下さい。",currentfolder$)
                            tmp=2
                    elseif cmd=ENTER_DELETE then 
                            tmp$=chr$(0)
                            tmp=3
                    end if
                end if
                if tmp$<>"" then
                    tmp$=tmp$+chr$(0)
                    shfo.dhwnd        =@@hwnd
                    shfo.wFunc        =tmp'1:移動,2:複写,3:削除,4:名前変更
                    shfo.pFrom        =varptr(execlist$)
                    shfo.pTo        =varptr(tmp$)
                    shfo.fFlags        =FOF_ALLOWUNDO
                    call SHFileOperation(shfo)
                    beep
                end if
            end if
        end if
    elseif cmd=IDCANCEL then 'ESCを押したとき
        cmd=escmenucmd[popupmenu(escmenu$,0,0)]
        if cmd=ESC_CLOSE then 
            end
        elseif cmd=ESC_CHRDIR then
            tmp$ = getfolder$("表示したいフォルダを選んで下さい。",currentfolder$)
            if tmp$<>"" then currentfolder$=tmp$
            if right$(currentfolder$,1)<>"\" then currentfolder$=currentfolder$+"\"
        elseif cmd=ESC_NEWFILE then
            tmp$=inputbox$("ファイル名を入力してください。","空ファイルの新規作成","","")
            if tmp$<>"" then
                open currentfolder$+tmp$ for output as #1
                close#1
            end if
        elseif cmd=ESC_NEWFOLDER then
            tmp$=inputbox$("フォルダ名を入力してください。","フォルダの新規作成","","")
            if tmp$<>"" then
                mkdir currentfolder$+tmp$
            end if
        end if
        if cmd=0 then
            flagnorefresh=1
        end if
    end if
loop
end proc


前のページに戻る
トップページに飛ぶ