ListViewにファイルに関連づけられたアイコンを付けるには?

解決


武田  2005-05-01 07:30:26  No: 14562

皆様お世話になります。
ListViewをvsReportに設定して表示しているファイルに関連づけたれたアイコンを付けて表示したいのですが方法が解りません。
ListViewのLargeImagesプロパティにImageListコンポーネントを関連づけるのでは位は解る程度です。過去ログで1件だけありましたが難しくて解りませんでした。
入門講座の自作プログラムのアイコンがエクスプローラでも表示するのが不思議で仕方がありません。どこにも登録した覚えがないのに。
よろしくお願い致します。


通りすがり  2005-05-01 13:24:33  No: 14563

>入門講座って???

まぁ、いいとして、、、
方法論としては、対象ファイルのアイコンを取得して、ImageListに加えていく方法でしょうか。。

ExtractIconExで、小さいアイコンを取ってきて、それをImageList.AddIconで入れて、返ってきたアイコンのインデックスを当てはめて、、、

TListView(Sender).Items.Item[i].StateIndex := ImageList.AddIcon(ExtractIconEx());

みたいな...
こんなんでいいのかな?ExtractIconExとかは頑張って調べて下さい。
前は、「日本Delphi振興会」さんとこの「Delphi壁の穴」あたりに載っていたのですが、、、どうもアクセスできませんね。。。googleのキャッシュでも使うか、AboutDelphiとかで(^^;

余談ですけど、StateIndexだと、何故か14個くらいしかアイコンを保てないみたいですよ。ImageIndexを使わないとダメかな...


通りすがり  2005-05-01 13:26:03  No: 14564

よく読まなかった。。。
vsReportに設定してあるのであれば、LargeImagesにではなく、SmallImagesかStateImagesにImageListを指定してください。


武田  2005-05-01 21:35:09  No: 14565

通りすがりさんご指導ありがとうございます。長文になりますが、どこをはしょったらいいか解りませんので全文書きました。ごめん下さい。
私のDelphiは  WinXP 6 Personalフリー版です。方向性が見えましたので
下記の例を見つけましたので例1、例2をテストしました。
例1ではExtractIcon  は、作動しますが
ExtractIconEx()は第4パラメータでコンパイルできません。
エラー表示は、変数実パラメータと変数仮パラメータとは同一の型でなければなりません。と表示されます。

例2:関連付けされているファイルのアイコンを取得するには ExtractAssociatedIconを使用します。
とあるので実行しますとコンパイルはできますが、エラーも出ず実行しません。いずれも {ShellAPIを追加}

ListViewに貼り付けるアイコンは小さいアイコンでしょうか?
貼り付け方はご指導の通りやってみるつもりですが、肝心のExtractIconEx()が、作動しないためまだ実験はしておりません。
また入門講座とはあちこちのサイトを参考に独習しているのを自分の入門講座と称しております。
以上よろしくお願い致します。m(__)m
例1■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
小さいアイコン(16x16)も取り出したければ、ExtractIconExを使います。 
(略)
{オープンダイアログで指定したファイルのアイコンを描画}
procedure Form1.Button1Click(Sender: TObject);
var
 Icon:TIcon;
 hLarge,hSmall:THandle;
begin
    Icon:=TIcon.Create;
    // 大きいアイコンのみExtractIcon は、作動します。
    //Icon.Handle:=ExtractIcon(hInstance,PChar('D:\Borland\Bin\delphi32.exe'),0);

//小さいアイコンもは:hSmall引数でカーソルが止まりコンパイルできません。
    ExtractIconEx(PChar'D:\Borland\Bin\delphi32.exe'), 0, hLarge, hSmall, 1);
    Icon.Handle:=hSmall; {小さいアイコンを指定}

    if Icon.Handle<>0 then
     Image1.Canvas.Draw(0,0,Icon)
    else ShowMessage('アイコンがありません');
    Icon.Free;
end;
例2■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
procedure TForm1.Button1Click(Sender: TObject);
var
  icoData    :     TIcon;
  wrdIdx     :     word;
begin
  wrdIdx                :=     0; //アイコンのインデックス
  icoData               :=     TIcon.Create;
  icoData.Handle        :=     ExtractAssociatedIcon(hInstance,
                                     PChar('D:\Borland\Bin\D6RegClean.exe'),
                                     wrdIdx);
  Image1.Picture.Icon.Assign   (icoData);
  icoData.Free;
end;


Mr.XRAY  URL  2005-05-01 22:21:29  No: 14566

>ExtractIconEx(PChar'D:\Borland\Bin\delphi32.exe'), 0, hLarge, hSmall, 1);

( が抜けています.ということはさておいて...
hLargeのところにカーソルを移動して[Ctrl]+[Shift]+[Space]
を置いて引数の型をみて下さい.HICONとなっています.
したがって,

hLarge,hSmall:HICON;

ですね.


Mr.XRAY  URL  2005-05-01 22:38:48  No: 14567

ExtractAssociatedIconのヘルプを読むと,

>アイコン ハンドルが実行可能ファイルから取得された場合、 関数は、 
>lpIconPathが指す文字列に、 その実行可能フルパスとファイル名を
>格納します。

とありますから,この引数には,例えば以下の様に変数を渡す必要があります.

procedure TForm1.Button1Click(Sender: TObject);
var
  icoData    :     TIcon;
  wrdIdx     :     word;
  FName: array[0..MAX_PATH] of char;
begin
   wrdIdx  := 0; //アイコンのインデックス
   icoData := TIcon.Create;
   try
     FName :='delphi32.exe';
     icoData.Handle  := ExtractAssociatedIcon(hInstance, FName, wrdIdx);
     Image1.Picture.Icon.Assign   (icoData);
   finally
     icoData.Free;
   end;
end;


Mr.XRAY  URL  2005-05-01 23:06:29  No: 14568

ついでなので,ファイルの情報も同時に取得したい場合など,以下の
SHGetFileInfoもよく利用されているようです.

procedure TForm1.Button1Click(Sender: TObject);
var
  Icon : TIcon;
  FName: String;
  SHFileInfo: TSHFileInfo;
begin
   Icon:= TIcon.Create;
   try
     FName :='C:\Program Files\Borland\Delphi5\Bin\delphi32.exe';
     SHGetFileInfo(PChar(FName),
                   0,
                   SHFileInfo,
                   SizeOf(SHFileInfo),
                   SHGFI_SMALLICON or SHGFI_ICON);
     Icon.Handle := SHFileInfo.hIcon;
     Image1.Picture.Icon.Assign(icon);
   finally
     icon.Free;
   end;
end;


武田  2005-05-02 03:40:01  No: 14569

Mr.XRAY さん、通りすがりさんご指導誠にありがとうございました。
両方ともうまく動きました。
これから、ListViewに表示するように、挑戦致します。
なお、「(」抜けは私めの転記ミスでした。

それから、ここで出くるようなAPI関数?は、小生のヘルプでは全部出ません。
やはり、有料版と無料版の違いなのでしょうか。
ただで使わせてもらっているので文句は言えませんが。
そして、日本振興会は閉鎖されたのか、見あたりませんでした。
また、教えてください。ありがとうございました。m(__)m


Mr.XRAY  URL  2005-05-02 05:08:28  No: 14570

>やはり、有料版と無料版の違いなのでしょうか。

Personla(無料)版にはWin32APIのHELPはないようです.

>そして、日本振興会は閉鎖されたのか、見あたりませんでした。

取敢えず以下のURLでしのいで下さい(インターネット図書館のサイト).
ただし全てが見られるわけではありません.念のため.

http://web.archive.org/web/20040603202328/http://hp.vector.co.jp/authors/VA009712/take/delphi/


通りすがり  2005-05-02 08:13:03  No: 14571

入門講座ってのがやおら気になるんですが、、、

ところで、WinAPIのHelpって、
Program Files\Borland Delphi Personal Installer\install\Common\Borland Shared\MSHelp\WIN32.HLP
では?
英語だけど、、、


武田  2005-05-04 06:04:37  No: 14572

Mr.XRAY さん、通りすがり さん、教えて頂いてありがとうございます。
本も買えないので、Delphi入門者向けサイトを探して、独習しています。
入門書代わりに、よく参考にするのは、例えば下記のようなサイトです。
http://kakinotane.s7.xrea.com/delphi/d2/toc.html
http://wblue.web.infoseek.co.jp/index.htm
http://www.h5.dion.ne.jp/~tuyano/DlphTutor/
http://oto.chu.jp/kujira/text/delphi/zero/index.htm
http://delphi.sakura.vg/index2.html
残念ながらDelphiの入門者向きのサイトは少ないのですが、多くは長期間更新されないで放置されているのが残念です。
以上を私の入門講座と称しています。
Delphiでは解説サイトを開いてすぐストップしているサイトが多いのが気になります。
ようやく、Tipsサイトの例を組み込んで使うことができる場合もありますが、まだDelphi Worldなどのコンポーネントを組み込んで使うことができません。例えばExtractIconEx()でアイコンを抽出できることは解りましたが、実際はお気に入りみたいなのを作りたいので、それにはTreeView,ListViewも理解しなくてはならない、実際組み込んで利用できるように奮闘することになります。実際その例があれば楽なんですけど。
一つ一つ前進するほかありません。
今後もご指導下さい。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加