プログラムランチャーを作る
ということで、ランチャーです。
作るに当たって、何をしなければならないかを書いていきます。
ここでは一般的な「ボタン型ランチャー」で書いていきます。
1.ドラッグアンドドロップでアプリの情報取得。
2.アプリのアイコンを抜いて、ボタンに描画。
3.データの保存と読み込み。 |
大きくわければこんなもんです。あとは好みでタスクバーへアイコンを
出したりボタン上で右クリックすると、内容の変更とかは簡単なので
書きません。ついでに今回はフリーのコンポは使いません。
DelphianWorldにあるランチャー用のコンポを使えば、かなり簡単に
なるのですが、そこまでやると考えるとこが無くなってしまいますので(^^;;;)
1.フォームのデザインと初期設定
*フォームへのドロップの許可
フォームにスピードボタンをペタペタと置き、きれいに並べましょう。
そしてフォームのonshowイベント時の中に、
dragacceptfiles(handle,true);
を追加します。Use節にshellapiの追加も忘れずに。
これは自分のフォームに対してドロップを許可する、という意味です。
逆にdragacceptfiles(handle,false);とすれば、
禁止にできます。
(注)handleについて
onshowやoncreateなどのイベントハンドラーは、プライベート宣言された中に、
ありますので、あえてdragacceptfiles(form1.handle,true);
などど書かなくても大丈夫です。handleと書けばそれはすなわち、
form1.handleと書いたのと同じ意味になります。
要はドロップを受け付けるフォームやコンポーネントのハンドルを指定します。
またプライベート宣言の中に
procedure WMDropFiles(var Msg:TWMDropFiles);message
WM_dropfiles;
を追加します。そして
implementation
uses Unit2, Unit3;
{$R *.DFM}
の後にプロシージャ本体を書きます。
*ボタンを配列化する
後々の処理のが楽になるように、ボタンを配列化して管理します。
public節に
Btn:array[1..10] of tspeedbutton;//スピードボタンで10個の配列化宣言する
を書き
oncreateイベントの中で
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1 to 10 do
Btn[i]:=findcomponent('SpeedButton'+inttostr(i)) as tspeedbutton;
end;
2.ドロップ後の処理
*どのボタンにドロップされたかを調べる
procedure tform1.WMDropFiles(var Msg:TWMDropFiles);
var pos:tpoint;
begin
dragquerypoint(msg.Drop,pos);//ドロップされた時の座標を取得
for i:=1to 10 do
begin
if finddragtarget(clienttoscreen(pos),false)=Btn[i] then
begin
いろいろな処理・・・
end;
dragfinish(msg.drop);//ドロップ終了
end;
*何のファイルがいくつ落とされたのかを調べる
これもprocedure tform1.WMDropFiles(var Msg:TWMDropFiles);
手続きの中で処理します。
procedure tform1.WMDropFiles(var Msg:TWMDropFiles);
var i:integer;
filename:array[0..255] of char;
fname:string;
begin
i:=dragQueryfile(msg.drop,-1,nil,0);
if i >= 2 then //2つ以上ドロップされたときの処理
begin
showmessage('2つも落としちゃだめ!!');
dragfinish(msg.drop);//ドロップ終了
exit;
end;
dragQueryfile(msg.drop,0,filename,256);//1番目のファイル名取得
fname:=strpas(filename);//string型にキャストするときは、こうします。
dragfinish(msg.drop);//ドロップ終了
end;
*ファイル名からアイコンを取り出して、ボタンに描画
(注)filenameにはフルパスでのファイル名が入っているとします。(string型)
またbtn[**]は先に書いたように、tspeedbuttonの配列化したものとします。
noもどのボタンかわかっているとして、その番号(integer型)が入っているとします。
Var ic:ticon;
begin
ic:=ticon.create;
ic.Handle:=extracticon(form1.handle,pchar(filename),0);
Btn[no].glyph:=nil;
Btn[no].glyph.height:=ic.Height;
Btn[no].glyph.Width:=ic.Width;
Btn[no].glyph.Canvas.Draw(0,0,ic);
ic.free;
Btn[no].caption:=extractfilename(filename);//ファイル名を表示
Btn[no].hint:=extractfilepath(filename);//Path情報をヒントで表示
end;
ご存じのようにアプリケーションの中のアイコンは1つだけとは決まってません。
しかし上記の例だと一番はじめのアイコンしか取り出していません。
ここからのアレンジは各自がんばってみてください。
3.データの保存
自分はレジストリを使うのが、好きじゃないので敢えてiniファイルを使います。
USE節にinifilesを追加します。
procedure savedata;
var i:integer;ini:tinifile;
Begin
ini:=tinifile.create(changefileext(application.exename,'.ini'));
//現在のアプリ名の拡張子を.iniに変えて作る
for i:=1 to 10 do
begin
ini.WriteString (inttostr(i)+'番目のボタンデータ','Programname',Btn[i].caption);
ini.WriteString (inttostr(i)+'番目のボタンデータ','ProgramPath',Btn[i].hint);
・・・
end;
ini.free;
End;
かなり手抜きですが、こんなふうにすれば良いんじゃないでしょうか。
その他何番目のアイコンを表示するか、コマンドラインオプションとか、
いろいろありますが、各自がんばってください。(^^;;;)
以上です。
尚ここのページに関する質問苦情はいっさい受け付けません(^^;;)
Last Update 2000/1/6
|