今回はプログラムを簡単に登録できるランチャーを作ってみましょう。
最終的(初めからですが)には下記の形になります。

とりあえず一番簡単な形の物でよければ下記の方法でよいでしょう。
screen 0,300,200 title "ランチャー ver1.00" sdim touroku,32000 sdim execution,128 objsize 300,20 listbox index,160,touroku pos 0,160 : button "登録",entry pos 0,180 : button "実行",running stop *entry dialog "",16 if stat==0 : stop if touroku!="" : touroku+="\n" ; 登録されているアイテムが1以上だと変数に改行を追加しておく touroku+=refstr objprm 0,touroku stop *running if index==-1 : stop ; リストのアイテムがどれも選択されていない時は実行できなくしておく notesel touroku noteget execution,index exist execution if strsize==-1 : dialog ""+execution+"は存在しません" : stop exec execution,16 ; 関連付けられているプログラムで開く
当然改行2バイト含めて32000(厳密には31999)バイト超えてどうなってもしりません。
32000バイトを超えるようなら登録を拒否するかサイズを自動で変更するようにしましょう。
HSP2.6以上だとnoteselでメモリノートパッドに指定するとnoteadd機能が使用できますので
バッファサイズを自動で変更させる処理を書かなくてもいけます。
前回のプログラムを終了すると登録されているファイルインデックスは消滅してしまいました。
こういうソフトは一度登録したファイルは次の起動時にも情報が残っていますよね。
そういうことがしたいなら終了しても登録されているファイル名を保存しておく必要があります。
onexitを追加しておけば終了の際に指定したラベルにジャンプさせることができますので
ジャンプ先にbsaveで変数tourokuを保存してやればいいでしょう。
保存だけでなく、次回起動時にその作成したファイルをtourokuに読み込まなくてはなりません。
onexit *exit screen 0,300,200 title "ランチャー ver1.01" sdim touroku,32000 sdim execution,128 current=curdir ; exeファイルにしたらexedirでもよい exist "entryfiles.txt" if strsize!=-1 : bload "entryfiles.txt",touroku ; entryfiles.txtが存在すればロード ; 「objsize 300,20」から最後の行の「stop」までさっきと同じように書く *exit strlen size,touroku bsave current+"\\entryfiles.txt",touroku,size ; 終了時に毎回作成(上書き保存)する
登録ファイルを毎回登録ボタンからするのは面倒、ドラッグアンドドロップ(以下D&D)で登録したい、
そういう時はD&Dを可能にするDLLを使いましょう。
HSP2.6以上だと2.55までDLLだったloadlib.dllが内蔵されましたので標準だけでもできるようになりました。
作成したEXEファイルのアイコンにD&Dする場合はHSP標準命令だけでできます。
EXEファイルアイコンにD&Dするとシステム変数cmdlineにD&Dされたファイル名が入ります。
通常のファイル1つだけをD&Dした場合、そのままcmdlineに入りますが、
フルパス内に半角スペースを含む場合、OSによって入る形が変わるようです(全OS未確認)。
大体はダブルクォートでフルパス名が囲まれる形になります。
2つ以上のファイルをD&Dするとフルパス名とフルパス名の間に自動で半角スペースが入ります。
(例)「D:\aaa\bbb.txt "C:\program files\xxx\yyy.exe" C:\abc\xyz.as」
例を示すよりもご自分の目で確かめる方が早いですね。
下記のスクリプトをEXE化してみてください。
dialog ""+cmdline end
この方法を使用してランチャーにD&D機能を追加してみましょう。
ここでは複数ファイルがD&Dされたら全ファイル登録するようにしてみましょう。
screen 0,300,200
title "ランチャー ver2.00"
onexit *exit
sdim touroku,32000
exist "launcher.ini"
if strsize!=-1 : bload "launcher.ini",touroku
if cmdline!="" : gosub *dd ; 何かのファイルがD&Dされたとき
objsize 300,20
listbox index,180,touroku
pos 0,180 : button "実行",running
stop
*dd
sdim tmp,1600
sdim buf,128
tmp=cmdline
char=""
strlen allfilesize,tmp
repeat allfilesize+1 ; cmdlineの長さ分(+1)繰り返す
peek chk,tmp,cnt
if chk==34 : continue ; 現在調べている文字がダブルクォートなら飛ばす
if chk==32|(chk==0) { ; スペースか終端文字ならチェック
exist buf
if strsize!=-1 { ; cmdline内のスペースまでの文字列が存在する場合
if touroku!="" : touroku+="\n"
touroku+=buf ; 変数touroku(リスト)に追加する
memset buf,0,128 ; 一時変数を初期化しておく
continue cnt+1
}
}
poke char,0,chk
buf+=char
loop
objprm 0,touroku
return
*running
notesel touroku
noteget execution,index
exec execution,16
*exit
strlen len,touroku
bsave exedir+"\\launcher.ini",touroku,len
end
D&Dされたファイルを登録するときにダブルクォートを取り除いていますが、
調べていないのでわかりませんが全角文字の下位バイトが32や34になることがあるかもしれません。
TIPSの文字列編に登録してある、全角文字かどうかを調べる方法で回避しましょう。
今回作成したランチャーに登録削除を追加したり、複数同時起動機能をつけたり、
listboxでなくページ切り替え式の登録アイコンを押して起動できる物にしてみましょう。
ページをタブで管理してみたり実行履歴を付けてみるのも面白いかもしれません。
最後のスクリプトではD&Dに対応したけどボタンでの登録が出来なくなってしまいました。
この章のまとめスクリプトでは両方入ってますのでご安心を(?)。コチラからどうぞ。