Delphi Tips 
-----------------------------

キーワード:アイコン

>> Index

06/27 システムアイコンをリフレッシュする
09/27 デスクトップにあるアイコンの数と位置を知りたい。
09/20 フォームのアイコンをアニメーションにしたい
02/11 エクスプローラで使われるアイコンを取得・変更する
02/08 NT のタスクマネージャにアプリケーションのアイコンが表示されない

最終更新: 7819 日前

0175  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/03/08 osamu rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2003/06/27 osamu 編集
システムアイコンをリフレッシュする

フォルダのアイコンなど、システムで使われるアイコンを変更した後は、ちょっとしたトリックを使わないと画面に反映されません。
具体的には、一旦アイコンの大きさを変更してまた元に戻すのだそうです。ひきさんのページでサンプルコードを見ることができます。

[Delphi壁の穴]-[その二:システムを覗く]
http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#refreshsysicon
参照: <Windows> <バグ>

0108  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/27 西坂良幸 編集
デスクトップにあるアイコンの数と位置を知りたい。

通常デスクトップには色々なアイコンがありますが、それらの数とそれらが置かれている位置(X,Y座標)をアプリケーション中で把握したいのです。

デスクトップを覆っているリストビューコントロールに対して、メッセージを投げるなりAPIを発行するなりしてください。
Commctrl.pas の ListView_XXXXXX関数は、結構豊富です。テストすることをお勧めします。

以下サンプルプログラムです。

uses Commctrl;

// デスクトップリストビューのハンドル所得
function GetDesktopListView: HWnd;
var
  Hdl:HWnd;
begin
   Hdl := FindWindow('Progman', 'Program Manager');
   if not (Hdl = 0) then
   begin
     Hdl := FindWindowEx(Hdl, 0, 'SHELLDLL_DefView', '');
     if not (Hdl = 0) then
     begin
       result := FindWindowEx(Hdl, 0, 'SysListView32', '');
       exit;
     end;
   end;
   result := 0;
end;

// アイコンの表示数をえる
procedure TForm1.Button1Click(Sender: TObject);
var
  hLView:Hwnd;
begin
  hLView := GetDesktopListView;
  if not (hLView = 0) then
    Label1.Caption := AnsiString('Count: ')
       + IntToStr(ListView_GetItemCount(hLView))
  else
    Label1.Caption := 'ハンドルの取得に失敗しました';
end;


詳細は、Win32 SDK Referenceを調べてください。
また、IE4&Active Desktopをインストールしている環境では動かないかもしれません。
参照: [builder:5968] <Windows>

0265  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/19 西坂良幸 rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/20 西坂良幸 編集
フォームのアイコンをアニメーションにしたい

タイマーイベントを使って、AppliCationのアイコンをきりかえてやればアニメーションGIFのような効果ができます。

プロジェクトの*.resファイルに、アイコン'ICON1'-'ICON5'をアニメ風に作成して下さい。

フォームにStartBtn、StopBtn の2個のボタンとTTimer(Intervalプロパティを100程度)を貼り付けます。
  private 部に
    IconStat: integer;
    ICon1,ICon2,ICon3,ICon4,ICon5: TIcon;
と書き加えます。

// あらかじめリソースを参照するアイコンを作成
procedure TForm1.FormCreate(Sender: TObject);
begin
  ICon1 := TIcon.create;
  ICon1.Handle := LoadIcon(HInstance,'ICON1');
  ICon2 := TIcon.create;
  ICon2.Handle := LoadIcon(HInstance,'ICON2');
  ICon3 := TIcon.create;
  ICon3.Handle := LoadIcon(HInstance,'ICON3');
  ICon4 := TIcon.create;
  ICon4.Handle := LoadIcon(HInstance,'ICON4');
  ICon5 := TIcon.create;
  ICon5.Handle := LoadIcon(HInstance,'ICON5');
  Application.Icon.Handle := ICon1.Handle;
  IconStat := 1;
end;

// 破棄
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ICon1.Free;
  ICon2.Free;
  ICon3.Free;
  ICon4.Free;
  ICon5.Free;
end;

// スタート
procedure TForm1.StartBtnClick(Sender: TObject);
begin
  Timer1.Enabled := true;
end;

// ストップ
procedure TForm1.StopBtnClick(Sender: TObject);
begin
 Timer1.Enabled := false;
 IconStat := 1;
 Application.Icon.Handle := ICon1.Handle;
end;

// タイマーイベントでアイコンの切り替え
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  If IconStat = 5 then IconStat :=1
  else IconStat := IconStat + 1;
  Case IconStat of
  1: Application.Icon.Handle := ICon1.Handle;
  2: Application.Icon.Handle := ICon2.Handle;
  3: Application.Icon.Handle := ICon3.Handle;
  4: Application.Icon.Handle := ICon4.Handle;
  else Application.Icon.Handle := ICon5.Handle;
  end;
end;


4−5個アイコンを作るとスムースです。
注意事項として。resファイルを書き直した時は、[プロジェクトの再構築]を行ってから実行して下さい。resの変更が反映されません。また、アイコンの名称はイメージエディタでは、デフォルトでIcon?となりますので、オリジナルな名称に変えて下さい。

また、イメージリストを使えば、以下のようにすれば、ほぼ同じ結果が得られます。

var
  IconCount : integer;
procedure TForm1.Button1Click(Sender: TObject);  // start
begin
    Timer1.Interval := 100;
    Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    if IconCount >=ImageList1.Count then IconCount := 0;
    ImageList1.GetIcon(IconCount, Application.Icon);
    inc(IconCount);
end;

この場合は、使用するアイコンイメージは、リソースに入りませんので、プログラムアイコンとして使用出来ません。必要ならば、リソースからイメージリストへロードする処理を加えて下さい。
参照: [Delphi-ML:42725] [Delphi-ML:42748] <フォーム>

0153  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/11 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/11 osamu 編集
エクスプローラで使われるアイコンを取得・変更する

> Windowsでディレクトリなどに使われるアイコンを変更するなどの
> プログラムもあるみたいですが、そういったシステムで使われる
> アイコンを取得したいと思っています。

レジストリの HKEY_LOCAL_MACHINE の下に

Software\Microsoft\Windows\CurrentVersion\explorer\Shell Icons

というキーがあり、ここに番号の文字列を作り、アイコンのファイル名とインデックスを設定することによりアイコンが設定可能です。
参照: [Delphi-ML:26403] <Windows> <ファイル>

0103  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
NT のタスクマネージャにアプリケーションのアイコンが表示されない

Delphi で作られるソフトすべてでこの問題が発生します。ちなみに、Delphi 自身も同じ問題を抱えています。
アプリケーションのクラスアイコンをセットしたら表示されるようになると思います。
プロジェクトソースかメインフォームの OnCreate イベントで、

SetClassLong(Application.Handle,
             GCL_HICON,
             Application.Icon.Handle);

を実行して下さい。
参照: [Delphi-ML:21168] <その他Windows関連> <アプリケーション> <Windows> <バグ>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords

Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp