shikaku anime トップページへ shikaku animeお気楽プログラム shikaku anime超ローテクDelphi講座 shikaku anime超低空飛行DelphiTip shikaku anime世界のVCL
shikaku anime復活畳の部屋 shikaku animeぶつぶつの部屋 shikaku animeおすすめLINK shikaku anime自己紹介 shikaku animeたたみやさんの伝言板
 

プログラムランチャーを作る

 

ということで、ランチャーです。
作るに当たって、何をしなければならないかを書いていきます。
ここでは一般的な「ボタン型ランチャー」で書いていきます。

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

2008 SugaharaTatamiten AllrightRecived