Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Список файлов и директорий с их иконками   Найти похожие ветки 

 
Алекс   (2004-11-02 17:56) [0]

Помогите создать список файлов и директорий с их иконками


 
clickmaker ©   (2004-11-02 18:33) [1]

FindFirstFile / FindNextFile / FindClose
SHGetFileInfo


 
Lin7   (2004-11-02 18:33) [2]

Присмотрись к Demos/Virtual Listview должно помочь...
Удачи!


 
Stexen   (2004-11-03 02:49) [3]

Надеюсь за спам не убьют!Ну я же стараюсь помочь!

{$IFDEF VER100}
 {$DEFINE SI_D3}
{$ELSE}
 {$IFDEF VER120}
   {$DEFINE SI_D4}
 {$ELSE}
   {$DEFINE SI_D5OrHigher}
 {$ENDIF}
{$ENDIF}

unit SysImg;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 {$IFDEF SI_D3} ComCtrls {$ELSE} ImgList {$ENDIF};

type

 TIconSize = (isSmallIcons, isLargeIcons);

 TSysImageList = class({$IFDEF SI_D3} TImageList {$ELSE} TCustomImageList {$ENDIF})
 private
   fIconSize: TIconSize;
   procedure SetIconSize(Value: TIconSize);
   procedure UpdateHandle;
 public
   constructor Create(AOwner: TComponent); override;
   function ImageIndexOf(const Path: String; OpenIcon: Boolean
     {$IFNDEF SI_D3} = False {$ENDIF}): Integer;
 published
   Property BkColor;
   Property BlendColor;
   property DrawingStyle default dsTransparent;
   property IconSize: TIconSize read fIconSize write SetIconSize default isSmallIcons;
   property OnChange;
 end;

procedure Register;

implementation

uses
 ShellAPI, ShlObj, ActiveX;

type
 TSpecialFolder = record
   Name: String;
   ID: Integer;
 end;

const
 IconSizeFlags: array[TIconSize] of Word =
   (SHGFI_SMALLICON, SHGFI_LARGEICON);
 OPenIconFlags: array[Boolean] of Word =
   (0, SHGFI_OPENICON);
 SpecialFolders: array[1..7] of TSpecialFolder = (
   (Name: "Desktop";              ID: CSIDL_DESKTOP),
   (Name: "Control Panel";        ID: CSIDL_CONTROLS),
   (Name: "Printers";             ID: CSIDL_PRINTERS),
   (Name: "My Documents";         ID: CSIDL_PERSONAL),
   (Name: "Recycle Bin";          ID: CSIDL_BITBUCKET),
   (Name: "My Computer";          ID: CSIDL_DRIVES),
   (Name: "Network Neighborhood"; ID: CSIDL_NETWORK));

constructor TSysImageList.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 fIconSize := isSmallIcons;
 DrawingStyle := dsTransparent;
 ShareImages := True;
 UpdateHandle;
end;

procedure TSysImageList.UpdateHandle;
var
 FileInfo: TShFileInfo;
begin
 Handle := ShGetFileInfo("C:\", 0, FileInfo, SizeOf(FileInfo),
   IconSizeFlags[fIconSize] or SHGFI_SYSICONINDEX);
end;

function TSysImageList.ImageIndexOf(const Path: String; OpenIcon: Boolean): Integer;
var
 FileInfo: TShFileInfo;
 DesktopFolder: IShellFolder;
 PIDL: PItemIDList;
 Malloc: IMalloc;
 NumChars, Flags: {$IFDEF SI_D3} LongInt {$ELSE} Cardinal {$ENDIF};
 WidePath: PWideChar;
 SpecialFolderID, Index: Integer;
begin
 Result := 0;
 SpecialFolderID := -1;
 for Index := Low(SpecialFolders) to High(SpecialFolders) do
   if CompareText(Path, SpecialFolders[Index].Name) = 0 then
   begin
     SpecialFolderID := SpecialFolders[Index].ID;
     Break;
   end;
 if SpecialFolderID >= 0 then
   SHGetSpecialFolderLocation(Application.Handle, SpecialFolderID, PIDL)
 else
 begin
   Flags := 0;
   if (Pos(":", Path) = 0) then
     WidePath := StringToOleStr("*" + ExtractFileExt(Path))
   else
     WidePath := StringToOleStr(Path);
   NumChars := Length(WidePath);
   SHGetDesktopFolder(DesktopFolder);
   DesktopFolder.ParseDisplayName(0, nil, WidePath, NumChars, PIDL, Flags);
 end;
 if PIDL <> nil then
 begin
   FillChar(FileInfo, SizeOf(FileInfo), 0);
   ShGetFileInfo(PChar(PIDL), 0, FileInfo, SizeOf(FileInfo), SHGFI_PIDL or
     SHGFI_SYSICONINDEX or IconSizeFlags[fIconSize] or OpenIconFlags[OpenIcon]);
   if FileInfo.iIcon > 0 then Result := FileInfo.iIcon;
   ShGetMalloc(Malloc);
   Malloc.Free(PIDL);
 end;
end;

procedure TSysImageList.SetIconSize(Value: TIconSize);
begin
 if fIconSize <> Value then
 begin
   fIconSize := Value;
   UpdateHandle;
 end;
end;

procedure Register;
begin
 RegisterComponents("Win32", [TSysImageList]);
end;

end.

Пример использования:

...
var
ItemGlyph: TSysImageList
begin
 ItemGlyph:=TSysImageList.Create(nil);
...
end;
ItemGlyph.Draw(Canvas, 0, 0, ItemGlyph.ImageIndexOf(FilePath) { FilePath - путь к файлу для которого надо нарисовать иконку }


Так и создание списка файлов:

function ReadFileNames(const ParentDirectory: string;
 FileList: TStringList; SerAtr:integer): Integer;
var
 Status: Integer;
 SearchRec: TSearchRec;
begin
 Result := 0;
 Status := FindFirst(SlashSep(ParentDirectory, "*.*"), SerAtr, SearchRec);
 try
   while Status = 0 do
   begin
     if (SearchRec.Attr and SerAtr = SerAtr) then
     begin
       if (SearchRec.Name <> "."){ and (SearchRec.Name <> "..")} then
       begin
         FileList.Add(SearchRec.Name);
         Inc(Result);
       end;
     end;
     Status := FindNext(SearchRec);
   end;
 finally
   FindClose(SearchRec);
 end;
end;

Вызываешь процедуру три раза для одного и того же FileList изменяя лишь SerAtr
SerAtr: 1)0,  2)faHidden 3)faDirectory
тогда получишь полный список файлов и папок для данной дириктории ParentDirectory.
пример

procedure ReadRootDir;
var
 Files: TStringList;
 Indx: integer;
 ItemGlyph: TSysImageList
begin
 ItemGlyph:=TSysImageList.Create(NortView);
 Files := TStringList.Create;
 ReadFileNames("c:\",  Files, 0);
 ReadFileNames("c:\",  Files, faHidden);
//  ReadFileNames("c:\",  Files, faDirectory);
 for Indx := 0 to Files.Count - 1 do
   begin
     ItemGlyph.Draw(Canvas, Ind+10, 0, ItemGlyph.ImageIndexOf("c:\"+Files.Strings[Indx]);
     Canvas.TextOut(Ind+10,0,Files.Strings[Indx]);
   end;
end;

Вот так вот ты выведешь на форму значки с именами файлов в c:\
ну дальше разберешься...если нет то уже все плохо...

Что то может не работать вытащил из своего менджера, по надписи сверху исходников понял что писалось это дело в 2001, когда я был еще маленьким.а примеры тоже не проверялись пришлось импровезировать!


 
Stexen   (2004-11-03 02:53) [4]

Ind + 10 там будет наложение одного на другой файлов так что там надо так что нужен еще один счетчик координат вывода



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
3-1101152147
eugene56
2004-11-22 22:35
2004.12.19
Interbase&amp;Internet


14-1101837012
maxz
2004-11-30 20:50
2004.12.19
зарубежные софт-каталоги


3-1100760278
Iova
2004-11-18 09:44
2004.12.19
Как получить информацию о полях таблицы


1-1102155767
ньюбик
2004-12-04 13:22
2004.12.19
TStatusBar - пара простых вопросов.


3-1100953359
Iova
2004-11-20 15:22
2004.12.19
rdb$...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский