delphi listview 动态获取ico图标 我想取 进程路径 比如c:\bin\dd.exe 的图标 显示在 进程名 那里 请问怎么显示以下是参考图片还有下次在打开程序 图标还在。以下是参考地址http://bbs.2ccc.com/topic.asp?topicid=352779 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我上次已经给出例子了,你需要做的只是将你的列表按照一定规则保存为一个列表,例如可以使用 XML。下次启动程序的时候就依次读取每条 XML 信息,然后再用下面的例子获取关联图标,根本不用将图标保存起来为一个文件,一来麻烦,二来是没必要,除非你要自定义图标功能。{提取系统关联图标例子uses ShellAPI;记得设置 ListView 的 SmallImages 为 指定的 Imagelist, 每添加一条 xml 内容,就指定它的 ImageIndex,这样就是你要的效果了。}var Icon: HIcon; IconIndex: Word; FileName: PChar;begin FileName := 'C:\';//试一试获取 C 分区的关联图标 Icon := ExtractAssociatedIcon(HInstance, FileName, IconIndex); DrawIcon(Form1.Canvas.Handle, 10, 10, Icon);//测试,在窗体画出来看一下 Image1.Picture.Icon.Handle := Icon;//在Image1中显示出来 ImageList1.AddIcon(Image1.Picture.Icon);//添加进ImageList1供ListView使用。end; 怎么保存和写入listview 到xml...格式如下 文件名字 文件ID 文件路径 文件参数 还有你说的那个imagelist保存列表 unit Unit1;{你只需要用 delphi 编译后,然后运行 Demo.exe, 手动添加需要的程序,然后关闭,程序自动保存 XML,下一次启动 Demo.exe 时自动加载上次的项目。sail20002010-05-11于 广州}interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ImgList, ExtCtrls, // --XML-- XMLDoc, xmldom, XMLIntf, msxmldom;const XMLFileName = 'Data.xml'; //XML 文件名type TForm1 = class(TForm) ListView1: TListView; ImageList1: TImageList; EdtFileName: TLabeledEdit; EdtFileID: TLabeledEdit; EdtFilePath: TLabeledEdit; EdtFilePar: TLabeledEdit; BtnAddItem: TButton; BtnDel: TButton; procedure BtnAddItemClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BtnDelClick(Sender: TObject); private { Private declarations } XML: TXMLDocument; ListCount: Integer; procedure LoadItem; procedure SaveItem; function AddItem(FileName, FileID, FilePath, FilePars: string): Boolean; public { Public declarations } end;var Form1: TForm1;implementationuses ShellAPI;{$R *.dfm}function TForm1.AddItem(FileName, FileID, FilePath, FilePars: string): Boolean;var Icon: HIcon; IconIndex: Word; Ico: TIcon; i: Integer;begin Result := False; if FileExists(FilePath) then begin with ListView1.Items.Add do begin if Trim(FileName) = '' then FileName := ExtractFileName(FilePath); Caption := FileName; SubItems.Add(FileID); SubItems.Add(FilePath); SubItems.Add(FilePars); end; Ico := TIcon.Create; Icon := ExtractAssociatedIcon(HInstance, PChar(FilePath), IconIndex); Ico.Handle := Icon; ImageList1.AddIcon(Ico); // 添加进ImageList1供ListView使用。 Ico.Free; i := ListView1.Items.Count - 1; ListView1.Items.Item[i].ImageIndex := i; // 指定对应索引 Result := True; end;end;procedure TForm1.LoadItem;var nodeList: IXMLNodeList; node: IXMLNode; i: Integer; sFileName, sFileID, sFilePath, sFilePars: string;begin node := XML.DocumentElement; nodeList := node.ChildNodes; // ShowMessage(IntToStr(nodeList.Count)); //Debug Dialog if nodeList.Count > 0 then begin ListCount := nodeList.Count; for i := 0 to nodeList.Count - 1 do begin node := XML.DocumentElement; node := node.ChildNodes.Nodes[i]; sFileName := node.Attributes['FileName']; { 获取 文件名字 属性 } sFileID := node.Attributes['FileID']; { 获取 文件 ID 属性 } sFilePath := node.Attributes['FilePath']; { 获取 文件路径 属性 } sFilePars := node.Attributes['FilePars']; { 获取 参数 属性 } AddItem(sFileName, sFileID, sFilePath, sFilePars); end; end;end;procedure TForm1.SaveItem;var pNode: IXMLNode; { 定义节点: 父节点 } s: string; i: Integer;begin XML.XML.Clear; XML.Active := True; { 必须先激活 } XML.Version := '1.0'; { 设置版本 } XML.Encoding := 'UTF-8'; { 设置语言 } XML.StandAlone := 'yes'; XML.Options := [doNodeAutoIndent, doAutoPrefix]; { 自动缩进 } pNode := XML.AddChild('Root'); { 添加 pNode 是根节点 } for i := 0 to ListView1.Items.Count - 1 do { 循环 ListView 的 Item } begin pNode := XML.ChildNodes.Nodes['Root']; { 复位 pNode 是根节点 } pNode := pNode.AddChild('Item'); s := ListView1.Items.Item[i].Caption; pNode.SetAttribute('FileName', s); { 文件名字 } s := ListView1.Items.Item[i].SubItems.Strings[0]; pNode.SetAttribute('FileID', s); { 文件ID } s := ListView1.Items.Item[i].SubItems.Strings[1]; pNode.SetAttribute('FilePath', s); { 文件路径 } s := ListView1.Items.Item[i].SubItems.Strings[2]; pNode.SetAttribute('FilePars', s); { 文件参数 } end; s := ExtractFilePath(ParamStr(0)) + XMLFileName; XML.SaveToFile(s);end;procedure TForm1.BtnAddItemClick(Sender: TObject);begin if not AddItem(EdtFileName.Text, EdtFileID.Text, EdtFilePath.Text, EdtFilePar.Text) then ShowMessage('信息不完整');end;procedure TForm1.BtnDelClick(Sender: TObject);var i, j: Integer;begin i := ListView1.ItemIndex; if i <> -1 then begin ListView1.DeleteSelected; ImageList1.Delete(I); //删除对应图标 for j := i to ListView1.Items.Count - 1 do //重新指定图标索引 begin ListView1.Items.Item[j].ImageIndex := ListView1.Items.Item[j].ImageIndex -1; end; end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin SaveItem; XML.Free;end;procedure TForm1.FormCreate(Sender: TObject);var s: string; pNode: IXMLNode; { 定义节点: 父节点 }begin XML := TXMLDocument.Create(Self); s := ExtractFilePath(ParamStr(0)) + XMLFileName; if FileExists(s) then begin XML.Active := True; XML.LoadFromFile(s); LoadItem; end else begin XML.XML.Clear; XML.Active := True; { 必须先激活 } XML.Version := '1.0'; { 设置版本 } XML.Encoding := 'UTF-8'; { 设置语言 } XML.StandAlone := 'yes'; XML.Options := [doNodeAutoIndent, doAutoPrefix]; { 自动缩进 } pNode := XML.AddChild('Root'); { 添加 pNode 是根节点 } XML.SaveToFile(s); end;end;end.其中 XML 文件是这样结构,很简单;<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Root> <Item FileName="calc.exe" FileID="001" FilePath="C:\WINDOWS\system32\calc.exe" FilePars="-np"/> <Item FileName="Notepad.exe" FileID="001" FilePath="C:\WINDOWS\system32\Notepad.exe" FilePars="-np"/> <Item FileName="explorer.exe" FileID="001" FilePath="C:\WINDOWS\explorer.exe" FilePars="-np"/> <Item FileName="regedit.exe" FileID="001" FilePath="C:\WINDOWS\regedit.exe" FilePars="-np"/></Root> 代码可以去你的帖子看我的回复,有下载http://bbs.2ccc.com/topic.asp?topicid=352779 想把图标动态的添加到drawgrid中 请问用什么软件能侦测出应用程序是用什么语言开发的? 关于delphi2007安装的问题 控件运用问题 如何将一个控件设置为不可覆盖。我的TShape控件老是TLabel控件覆盖,有没有办法设置TShape控件的级别高于TLabel 各位大虾..怎么为按钮设置快捷键??问题解绝马上洒分结贴!! 我做的DLL,不能动态调用?请帮忙看看. 关于Action的问题 大家帮我看看这句设置数据库属性值的代码哪里有问题? prosessmessages函数怎么用? 如何遍历这样的表,在线等待》》 求解! delphi 如何关闭掉已经打开的word
下次启动程序的时候就依次读取每条 XML 信息,然后再用下面的例子获取关联图标,根本不用将图标保存起来为一个文件,一来麻烦,二来是没必要,除非你要自定义图标功能。{
提取系统关联图标例子uses
ShellAPI;记得设置 ListView 的 SmallImages 为 指定的 Imagelist, 每添加一条 xml 内容,
就指定它的 ImageIndex,
这样就是你要的效果了。
}
var
Icon: HIcon;
IconIndex: Word;
FileName: PChar;
begin
FileName := 'C:\';//试一试获取 C 分区的关联图标
Icon := ExtractAssociatedIcon(HInstance, FileName, IconIndex);
DrawIcon(Form1.Canvas.Handle, 10, 10, Icon);//测试,在窗体画出来看一下
Image1.Picture.Icon.Handle := Icon;//在Image1中显示出来
ImageList1.AddIcon(Image1.Picture.Icon);//添加进ImageList1供ListView使用。
end;
格式如下 文件名字 文件ID 文件路径 文件参数 还有你说的那个imagelist保存列表
{
你只需要用 delphi 编译后,然后运行 Demo.exe, 手动添加需要的程序,然后关闭,程序自动保存 XML,下一次启动 Demo.exe 时自动加载上次的项目。
sail2000
2010-05-11
于 广州
}
interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ImgList, ExtCtrls,
// --XML--
XMLDoc,
xmldom,
XMLIntf,
msxmldom;const
XMLFileName = 'Data.xml'; //XML 文件名type
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
EdtFileName: TLabeledEdit;
EdtFileID: TLabeledEdit;
EdtFilePath: TLabeledEdit;
EdtFilePar: TLabeledEdit;
BtnAddItem: TButton;
BtnDel: TButton;
procedure BtnAddItemClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnDelClick(Sender: TObject);
private
{ Private declarations }
XML: TXMLDocument;
ListCount: Integer; procedure LoadItem;
procedure SaveItem;
function AddItem(FileName, FileID, FilePath, FilePars: string): Boolean;
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses
ShellAPI;
{$R *.dfm}function TForm1.AddItem(FileName, FileID, FilePath, FilePars: string): Boolean;
var
Icon: HIcon;
IconIndex: Word;
Ico: TIcon;
i: Integer;
begin
Result := False;
if FileExists(FilePath) then
begin
with ListView1.Items.Add do
begin
if Trim(FileName) = '' then
FileName := ExtractFileName(FilePath);
Caption := FileName;
SubItems.Add(FileID);
SubItems.Add(FilePath);
SubItems.Add(FilePars);
end; Ico := TIcon.Create; Icon := ExtractAssociatedIcon(HInstance, PChar(FilePath), IconIndex);
Ico.Handle := Icon;
ImageList1.AddIcon(Ico); // 添加进ImageList1供ListView使用。
Ico.Free;
i := ListView1.Items.Count - 1;
ListView1.Items.Item[i].ImageIndex := i; // 指定对应索引 Result := True; end;end;procedure TForm1.LoadItem;
var
nodeList: IXMLNodeList;
node: IXMLNode;
i: Integer;
sFileName, sFileID, sFilePath, sFilePars: string;
begin
node := XML.DocumentElement;
nodeList := node.ChildNodes;
// ShowMessage(IntToStr(nodeList.Count)); //Debug Dialog
if nodeList.Count > 0 then
begin
ListCount := nodeList.Count;
for i := 0 to nodeList.Count - 1 do
begin
node := XML.DocumentElement;
node := node.ChildNodes.Nodes[i]; sFileName := node.Attributes['FileName']; { 获取 文件名字 属性 }
sFileID := node.Attributes['FileID']; { 获取 文件 ID 属性 }
sFilePath := node.Attributes['FilePath']; { 获取 文件路径 属性 }
sFilePars := node.Attributes['FilePars']; { 获取 参数 属性 } AddItem(sFileName, sFileID, sFilePath, sFilePars);
end;
end;
end;procedure TForm1.SaveItem;
var
pNode: IXMLNode; { 定义节点: 父节点 }
s: string;
i: Integer;
begin
XML.XML.Clear;
XML.Active := True; { 必须先激活 }
XML.Version := '1.0'; { 设置版本 }
XML.Encoding := 'UTF-8'; { 设置语言 }
XML.StandAlone := 'yes';
XML.Options := [doNodeAutoIndent, doAutoPrefix]; { 自动缩进 } pNode := XML.AddChild('Root'); { 添加 pNode 是根节点 } for i := 0 to ListView1.Items.Count - 1 do { 循环 ListView 的 Item }
begin
pNode := XML.ChildNodes.Nodes['Root']; { 复位 pNode 是根节点 }
pNode := pNode.AddChild('Item');
s := ListView1.Items.Item[i].Caption;
pNode.SetAttribute('FileName', s); { 文件名字 }
s := ListView1.Items.Item[i].SubItems.Strings[0];
pNode.SetAttribute('FileID', s); { 文件ID }
s := ListView1.Items.Item[i].SubItems.Strings[1];
pNode.SetAttribute('FilePath', s); { 文件路径 }
s := ListView1.Items.Item[i].SubItems.Strings[2];
pNode.SetAttribute('FilePars', s); { 文件参数 }
end; s := ExtractFilePath(ParamStr(0)) + XMLFileName;
XML.SaveToFile(s);
end;procedure TForm1.BtnAddItemClick(Sender: TObject);
begin
if not AddItem(EdtFileName.Text, EdtFileID.Text, EdtFilePath.Text,
EdtFilePar.Text) then
ShowMessage('信息不完整');
end;procedure TForm1.BtnDelClick(Sender: TObject);
var
i, j: Integer;
begin
i := ListView1.ItemIndex;
if i <> -1 then
begin
ListView1.DeleteSelected;
ImageList1.Delete(I); //删除对应图标
for j := i to ListView1.Items.Count - 1 do //重新指定图标索引
begin
ListView1.Items.Item[j].ImageIndex := ListView1.Items.Item[j].ImageIndex -1;
end;
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SaveItem;
XML.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
pNode: IXMLNode; { 定义节点: 父节点 }
begin
XML := TXMLDocument.Create(Self);
s := ExtractFilePath(ParamStr(0)) + XMLFileName;
if FileExists(s) then
begin
XML.Active := True;
XML.LoadFromFile(s);
LoadItem;
end
else
begin
XML.XML.Clear;
XML.Active := True; { 必须先激活 }
XML.Version := '1.0'; { 设置版本 }
XML.Encoding := 'UTF-8'; { 设置语言 }
XML.StandAlone := 'yes';
XML.Options := [doNodeAutoIndent, doAutoPrefix]; { 自动缩进 } pNode := XML.AddChild('Root'); { 添加 pNode 是根节点 }
XML.SaveToFile(s);
end;
end;end.
其中 XML 文件是这样结构,很简单;<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Item FileName="calc.exe" FileID="001" FilePath="C:\WINDOWS\system32\calc.exe" FilePars="-np"/>
<Item FileName="Notepad.exe" FileID="001" FilePath="C:\WINDOWS\system32\Notepad.exe" FilePars="-np"/>
<Item FileName="explorer.exe" FileID="001" FilePath="C:\WINDOWS\explorer.exe" FilePars="-np"/>
<Item FileName="regedit.exe" FileID="001" FilePath="C:\WINDOWS\regedit.exe" FilePars="-np"/>
</Root>
http://bbs.2ccc.com/topic.asp?topicid=352779