全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2189
推到 Plurk!
推到 Facebook!

Listview怎样获得系统默认的图标?

缺席
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-24 08:53:01 IP:218.80.xxx.xxx 未訂閱
我把各种各样的文件存入数据库的一个字段中,Listview怎样获得系统默认的图标?把它们显示出来?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-24 19:46:27 IP:202.39.xxx.xxx 未訂閱
參考 show files and their associated Icons in a Listview: http://www.swissdelphicenter.ch/en/showcode.php?id=421
{ 
  The following example shows how to show all files and their 
  associated icons of a folder in a TListView. 
  To test the code, you need a ListView1 and a ImageList1 where the icons are stored.       Im folgenden Beispiel werden alle Dateien & zugehörigen 
  Icons eines Verzeichnisses in einer TListView angezeigt. 
  Um das Beispiel zu testen, braucht man eine ListView1 und eine ImageList1 
  Komponente, wo die Icons gespeichert werden. 
}     uses 
  ShellApi;     procedure LV_InsertFiles(strPath: string; ListView: TListView; ImageList: TImageList); 
var 
  i: Integer; 
  Icon: TIcon; 
  SearchRec: TSearchRec; 
  ListItem: TListItem; 
  FileInfo: SHFILEINFO; 
begin 
  // Create a temporary TIcon 
  Icon := TIcon.Create; 
  ListView.Items.BeginUpdate; 
  try 
    // search for the first file 
    i := FindFirst(strPath   '*.*', faAnyFile, SearchRec); 
    while i = 0 do 
    begin 
      with ListView do 
      begin 
        // On directories and volumes 
        if ((SearchRec.Attr and FaDirectory <> FaDirectory) and 
          (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then 
        begin 
          ListItem := ListView.Items.Add; 
          //Get The DisplayName 
          SHGetFileInfo(PChar(strPath   SearchRec.Name), 0, FileInfo, 
            SizeOf(FileInfo), SHGFI_DISPLAYNAME); 
          Listitem.Caption := FileInfo.szDisplayName; 
          // Get The TypeName 
          SHGetFileInfo(PChar(strPath   SearchRec.Name), 0, FileInfo, 
            SizeOf(FileInfo), SHGFI_TYPENAME); 
          ListItem.SubItems.Add(FileInfo.szTypeName); 
          //Get The Icon That Represents The File 
          SHGetFileInfo(PChar(strPath   SearchRec.Name), 0, FileInfo, 
            SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON); 
          icon.Handle := FileInfo.hIcon; 
          ListItem.ImageIndex := ImageList.AddIcon(Icon); 
          // Destroy the Icon 
          DestroyIcon(FileInfo.hIcon); 
        end; 
      end; 
      i := FindNext(SearchRec); 
    end; 
  finally 
    Icon.Free; 
    ListView.Items.EndUpdate; 
  end; 
end;     procedure TForm1.Button1Click(Sender: TObject); 
begin 
  // Assign a Imagelist to the ListView 
  ListView1.SmallImages := ImageList1; 
  // Show Listview in Report Style and add 2 Columns 
  ListView1.ViewStyle := vsReport; 
  ListView1.Columns.Add; 
  ListView1.Columns.Add; 
  LV_InsertFiles('C:\Windows\', ListView1, ImageList1); 
end; 
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-25 09:04:21 IP:218.80.xxx.xxx 未訂閱
请问大大,上面程序是不是也是把一些系统图标放在IMAGELIST中,然后调用它?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-25 09:31:51 IP:202.39.xxx.xxx 未訂閱
引言: 请问大大,上面程序是不是也是把一些系统图标放在IMAGELIST中,然后调用它?
什麼是系統圖標? 例子是把 C:\Windows 目錄下所有檔案加至 ListView1 中 並取出每個檔案的 Icon 後, 加至 ImageList1 中來顯示.
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-25 09:32:56 IP:218.80.xxx.xxx 未訂閱
我IMAGELIST2里没有放任何图标 我的代码如下: //lvMessageParts是LISTVIEW的控件名称 procedure TFrmOAMail.DBGridEh1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Li: TListItem; begin inherited; with (FDmdMant as TDmdOAMail) do begin lvMessageParts.Items.Clear; QryAttach.Active := False; QryAttach.ParamByName('pripkey').AsInteger := QryMaster.FieldByName('Pkey').AsInteger;//点击一条记录判断是否有附件 QryAttach.Active := True; if QryAttach.RecordCount <> 0 then//有附件就把它添加进LISTVIEW begin QryAttach.First; while not QryAttach.Eof do begin li := lvMessageParts.Items.Add; li.Caption := QryAttach.FieldByName('AttachName').AsString; li.SubItems.Append(QryAttach.FieldByName('Attach').AsString); li.SubItems.Append(QryAttach.FieldByName('pkey').AsString); QryAttach.Next; lvMessageParts.SmallImages := ImageList2; // Show Listview in Report Style and add 2 Columns lvMessageParts.ViewStyle := vsIcon; // ListView1.Columns.Add; // ListView1.Columns.Add; LV_InsertFiles('C:\Windows\', lvMessageParts, ImageList2); end; end else begin lvMessageParts.Items.Clear; end; end; end; 上面的那个LV_InsertFiles过程没有作任何改动,但是运行结果并没有图标显示出来 请问是哪里问题?谢谢
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-25 09:42:29 IP:202.39.xxx.xxx 未訂閱
程式碼沒縮排, 很難看得出來.
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-25 10:05:13 IP:218.80.xxx.xxx 未訂閱
我的意思是我把WORD或者JPG或者RAR等各种文件都放入一个数据库字段中,然后我点一条记录,保存在里面的那个文件就显示在LISTVIEW中,如果是WORD文件的就显示WORD的图标和文件名,是RAR的就显示RAR的图标及文件,就象OUTLOOK或FOXMAIL里附件的显示形式一样,请问改如何解决,谢谢
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-27 17:26:46 IP:218.80.xxx.xxx 未訂閱
谢谢大家赶快给我帮助
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-27 17:51:14 IP:202.39.xxx.xxx 未訂閱
uses ShellApi;    procedure TForm1.Button Click(Sender: TObject);
var
  Icon: hIcon;
  IconIndex: word;
begin
 Icon := ExtractAssociatedIcon(HInstance,
                               'C:\SomePath\SomeFile.ext',
                               IconIndex);
end;
先把在資料庫欄位的檔案先在硬碟存一個暫存檔 用如下的方式取得 Icon, 並加入 TImageList 中, 再把暫存檔刪除.
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-27 17:58:35 IP:218.80.xxx.xxx 未訂閱
我的程式如下:    QryAttach.Active := False;     QryAttach.ParamByName('pripkey').AsInteger := QryMaster.FieldByName('Pkey').AsInteger;     QryAttach.Active := True;     if QryAttach.RecordCount <> 0 then     begin       QryAttach.First;       while not QryAttach.Eof do       begin         li := lvMessageParts.Items.Add;         li.Caption := QryAttach.FieldByName('AttachName').AsString;         li.SubItems.Append(QryAttach.FieldByName('Attach').AsString);         li.SubItems.Append(QryAttach.FieldByName('pkey').AsString);            Icon := ExtractAssociatedIcon(HInstance, 'C:\SomePath\SomeFile.ext', IconIndex);            QryAttach.Next; 我通过点击一条记录取的该条记录下有个附件,把它依次显示在listview中,按大大方法并不能把图标显示上去,请问哪里还有问题?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-27 18:07:31 IP:202.39.xxx.xxx 未訂閱
哇咧! 同學, 您也太誇張了吧! Icon := ExtractAssociatedIcon(HInstance, 'C:\SomePath\SomeFile.ext', IconIndex); 您怎麼原封不動把範例中的字串代入? 這句中的 'C:\SomePath\SomeFile.Txt' 的這個參數 就是要您把資料庫中的附檔存在硬碟後, 再用儲存的檔名存入 至於怎麼儲存, 可以參考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18188 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34637 發表人 - hagar 於 2004/05/27 18:08:54
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-28 11:19:25 IP:218.80.xxx.xxx 未訂閱
但是我存档的附件可能随便会变动文件夹呀?应该怎么控制
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-31 08:52:04 IP:218.80.xxx.xxx 未訂閱
???
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-06-01 07:59:21 IP:202.39.xxx.xxx 未訂閱
您不是一開頭就說所有附件都存至資料庫中嗎? 那要取出附件的 icon 時, 就先找一個任意目錄儲存 (此時是您決定要儲存在哪一個目錄的, 應該知道怎麼取出目錄) 取出 icon 後, 再將其刪除.
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-06-01 08:56:35 IP:218.80.xxx.xxx 未訂閱
谢谢大大回复,还有个问题,我很多附件是挂在一条主记录下的,如果不用SAVEDIALOG应该怎么对其进行保存呢,而且保存的文件名称应该怎么取得?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-06-01 09:00:34 IP:202.39.xxx.xxx 未訂閱
引言: 谢谢大大回复,还有个问题,我很多附件是挂在一条主记录下的,如果不用SAVEDIALOG应该怎么对其进行保存呢,而且保存的文件名称应该怎么取得?
檔名不是 QryAttach.FieldByName('AttachName').AsString 加上路徑嗎? 存檔是用 TBlobField(...).SaveToFile('檔名') 嗎? 這樣不須 TSaveDialog 吧?!
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-06-01 09:01:28 IP:218.80.xxx.xxx 未訂閱
而且保存进去的都是2进制的代码,我该如何去找哪个是文件名称,哪个是ICON?
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-06-01 09:24:00 IP:218.80.xxx.xxx 未訂閱
大大我这么写 TBlobField(QryAttach.FieldByName('Attach')).savetofile('c:\winnt\temp\' ExtractFileName(AttachName)); Icon := ExtractAssociatedIcon(HInstance, 'C:\SomePath\SomeFile.ext', IconIndex); 但是不知道怎么去和你说的'C:\SomePath\SomeFile.ext'去匹配起来,请教?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-06-01 09:27:59 IP:202.39.xxx.xxx 未訂閱
引言: 而且保存进去的都是2进制的代码,我该如何去找哪个是文件名称,哪个是ICON?
您的資料庫 table 應該有欄位記錄附件的檔名, 有欄位儲存附件的實體 就是用檔名欄位來儲存實體後, 再用 ExtractAssociatedIcon(路徑 檔名) 取得 icon
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-06-01 09:31:00 IP:202.39.xxx.xxx 未訂閱
引言: 大大我这么写 TBlobField(QryAttach.FieldByName('Attach')).savetofile('c:\winnt\temp\' ExtractFileName(AttachName)); Icon := ExtractAssociatedIcon(HInstance, 'C:\SomePath\SomeFile.ext', IconIndex); 但是不知道怎么去和你说的'C:\SomePath\SomeFile.ext'去匹配起来,请教?
'C:\SomePath\SomeFile.ext' 用 'c:\winnt\temp\' ExtractFileName(AttachName) 取代
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-06-01 09:36:32 IP:218.80.xxx.xxx 未訂閱
我是这么写的 TBlobField(QryAttach.FieldByName('Attach')).savetofile('c:\winnt\temp\' ExtractFileName(QryAttach.FieldByName('AttachName').AsString)); Icon := ExtractAssociatedIcon(HInstance, 'c:\winnt\temp\' ExtractFileName(QryAttach.FieldByName('AttachName').AsString), IconIndex); 运行后说Incompatible type:'String' and 'PChar'请问应该怎么转换 是错在Icon := ExtractAssociatedIcon(HInstance, 'c:\winnt\temp\' ExtractFileName(QryAttach.FieldByName('AttachName').AsString), IconIndex); 这句上
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-06-01 09:43:35 IP:202.39.xxx.xxx 未訂閱
Icon := ExtractAssociatedIcon(HInstance, PChar('c:\winnt\temp\' ExtractFileName(QryAttach.FieldByName('AttachName').AsString)), IconIndex);
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#23 引用回覆 回覆 發表時間:2004-06-01 09:50:03 IP:218.80.xxx.xxx 未訂閱
编译成功了,但是没有图标出来嘛,是不是在属性里还要设置的吗
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#24 引用回覆 回覆 發表時間:2004-06-01 13:21:52 IP:202.39.xxx.xxx 未訂閱
搭配第一篇回覆中的做法
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#25 引用回覆 回覆 發表時間:2004-06-02 08:58:10 IP:218.80.xxx.xxx 未訂閱
请教大大,Icon := ExtractAssociatedIcon(HInstance, PChar('c:\winnt\temp\' ExtractFileName(QryAttach.FieldByName('AttachName').AsString)), IconIndex); 怎么和第一次回复的连接起来? 是和procedure TForm1.Button1Click(Sender: TObject); 里的事件结合起来吗?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#26 引用回覆 回覆 發表時間:2004-06-02 14:29:12 IP:202.39.xxx.xxx 未訂閱
大概這樣吧:
var
  Icon_h: hIcon;
  Icon: TIcon;
  IconIndex: word;
  li: TListItem;
begin
  Icon := TIcon.Create;      QryAttach.Active := False;
  QryAttach.ParamByName('pripkey').AsInteger := QryMaster.FieldByName('Pkey').AsInteger;
  QryAttach.Active := True;
  if QryAttach.RecordCount <> 0 then
  begin
    QryAttach.First;
    while not QryAttach.Eof do
    begin
      li := lvMessageParts.Items.Add;
      li.Caption := QryAttach.FieldByName('AttachName').AsString;
      li.SubItems.Append(QryAttach.FieldByName('Attach').AsString);
      li.SubItems.Append(QryAttach.FieldByName('pkey').AsString);
      TBlobField(QryAttach.FieldByName('Attach')).SaveToFile('c:\winnt\temp\'   ExtractFileName(AttachName));
      Icon_h := ExtractAssociatedIcon(HInstance, PChar('c:\winnt\temp\'   ExtractFileName(QryAttach.FieldByName('AttachName').AsString)), IconIndex);
      Icon.Handle := Icon_h;
      li.ImageIndex := ImageList1.AddIcon(Icon);
      DeleteFile('c:\winnt\temp\'   ExtractFileName(AttachName));
    end;
  end;      Icon.Free;
end;
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#27 引用回覆 回覆 發表時間:2004-06-02 17:58:43 IP:218.80.xxx.xxx 未訂閱
大大在执行Icon.Handle := Icon_h;后出现如下错误: 还有就是我是不是要在LISTVIEW的属性里要与IMAGELIST关联起来?如果要的话是哪个属性?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#28 引用回覆 回覆 發表時間:2004-06-02 18:33:17 IP:202.39.xxx.xxx 未訂閱
1.有 Icon := TIcon.Create; 這一行嗎? 2.設定 TListView 的 LargeImages 或 SmallImages 屬性?
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#29 引用回覆 回覆 發表時間:2004-06-03 09:03:22 IP:218.80.xxx.xxx 未訂閱
非常感谢hagar大大的帮助,非常感谢!!!
系統時間:2024-04-19 11:14:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!