|
#1
|
|||
|
|||
Ico в ListView
Помогите вывести иконки каждого файла.
Но дело в том что у меня надо в два ListView однавременна. И у меня получается что в первом, что во втором одинаковы иконки, хотя файлы по ассоциации разные. Делаю так: Код:
procedure GetIcon(FileName:string); var Info:TSHFileInfo; AIcon:TIcon; begin AIcon:=TIcon.Create; SHGetFileInfo(PChar(FileName),FILE_ATTRIBUTE_NORMAL,Info, SizeOf(TSHFileInfo),SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES); AIcon.Handle:=Info.hIcon; ImageList1.AddIcon(AIcon); LV.Items[LV.Items.Count-1].ImageIndex := ImageList1.Count -1; AIcon.Free; end; {Получение списка файлов и информации о них} procedure TForm1.UpdateFile(LV:TListView;aPath:String); var Handle:THandle; FindData:TWin32FindData; Temp_ext,Temp_Cap,result:String; Folders:TStringList; i,Temp:Byte; begin ImageList1.Clear; LV.SmallImages:=ImageList1; LV.Items.BeginUpdate;//Начинаем прорисовку списка файлов LV.Items.Clear; //Очищаем LV Handle:=FindFirstFile(PChar(aPath+'*.*'),FindData); if Handle<>INVALID_HANDLE_VALUE then try Folders:=TStringList.Create; while FindNextFile(Handle,FindData) do begin Temp_Cap:=ExtractFileName(FindData.cFileName); //Имя файлов Temp_ext:=ExtractFileExt(FindData.cFileName); //Формат(расширение) if (FindData.dwFileAttributes and faDirectory)=faDirectory then Folders.Append(Temp_Cap) else with LV.Items.Add do begin if (FindData.dwFileAttributes and faDirectory)<>faDirectory then begin GetIcon(Temp_Cap); // Это вывод иконок Caption:=(ChangeFileExt(ExtractFileName(Temp_Cap),'')); SubItems.Add((temp_ext)); SubItems.Add(FloatToStrF(FindData.nFileSizeHigh+FindData.nFileSizeLow,ffNumber,18,0)); end else SubItems.Add(''); SubItems.Add(TimeToDateFile(FindData.ftLastWriteTime)); Result:=''; if (FILE_ATTRIBUTE_ARCHIVE and FindData.dwFileAttributes)>0 then Result:=Result+'a' else Result:=Result+'-'; // if (FILE_ATTRIBUTE_READONLY and FindData.dwFileAttributes)>0 then Result:=Result+'r' else Result:=Result+'-'; //Только чтение if (FILE_ATTRIBUTE_HIDDEN and FindData.dwFileAttributes)>0 then Result:=Result+'h' else Result:=Result+'-'; //Скрытые if (FILE_ATTRIBUTE_SYSTEM and FindData.dwFileAttributes)>0 then Result:=Result+'s' else Result:=Result+'-'; //Системные SubItems.Add(Result); end; end; for i:=0 to Folders.count-1 do with LV.Items.insert(i) do begin LV.Items[i].ImageIndex:=-1; SubItems.Add(''); SubItems.Add(''); SubItems.Add(''); Caption:=Folders[i]; end; Folders.Free; finally LV.Items.EndUpdate; //Закончить прорисовку файлов end; end; {Операции при запуске програмы} procedure TForm1.FormActivate(Sender: TObject); begin UpdateFile(ListView1, 'С:\'); //Обновления листа Лево UpdateFile(ListView2, 'С:\Windows'); //Обновления право Лево end; |
#2
|
||||
|
||||
Пример из DRKB
Код:
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; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Цитата:
А если выводить однавременной в 2 listView, получается надо еще 1 ImageList и вызывать вот так Код:
procedure TForm1.FormActivate(Sender: TObject); begin 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); LV_InsertFiles('d:\файлы\', ListView2, ImageList2); end; |
#4
|
||||
|
||||
Цитата:
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
Цитата:
|
#6
|
||||
|
||||
Вот исходник по теме, посмотрите пжлст
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Все тему можно закрывать разобрался, спасибо за помощь
Последний раз редактировалось HTTqp, 17.04.2014 в 20:46. |