Delphi Tips
>> Index
● 06/27 システムアイコンをリフレッシュする
● 09/27 デスクトップにあるアイコンの数と位置を知りたい。
● 09/20 フォームのアイコンをアニメーションにしたい
● 02/11 エクスプローラで使われるアイコンを取得・変更する
● 02/08 NT のタスクマネージャにアプリケーションのアイコンが表示されない
最終更新: 7818 日前
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
Osamu Takeuchi osamu@big.or.jp
Tips
Delphi
Home