Какие компоненты для отображения файлов и папок вы знаете? Какие используете? Почему? Порекомендуйте.
Вот что мне известно:
TShellListView из пакета ShellControl, который выпилили из палитры компонентов после Delphi 7, а жаль, ибо нужная вещь. Легко ищется в интернетах. Нет встроенного Drag-Drop, нет контекстного меню Shell, нет показывает Thumbs.
JamShellBrowser - умеет всё и даже больше, но платный. Можно 30 дней попользоваться биплатно без доступа к исходникам, потом die или дай денег. https://www.jam-software.com/shellbrowser_net
VELVEx 1.4.9 - наверное лучшее что я встречал, бесплатный, умеет всё то нужно что отсутсвует в вышеперечисленных: готовый Drag-Drop, контекстного меню Shell для нескольких выделенных файлов, показывает Thumbs. Однако Нарыть исходники не получилось: на офсайте только часть необходимого, а то что прописано в uses найти не нашлось, кому посчастливиться нарыть полный фарш, будьте любезны поделиться. https://www.silverpointdevelopment.com/velvex/
kuShellListView - мой компонент, который угораздило мну разрабатывать. Готовый Drag-Drop, с 2024 года имеет показывает Thumbs, НЕ показывает контекстного меню Shell, но имеет своё упрощённое. Основой для оного была и есть эта функция "как из TListView сделать проводник", которой делюсь: https://kuzduk.h1n.ru/_kushelllistview.html
| Код | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ icoShell Index function Shell_ico_Index(FullPath: string): integer; //uses ShellApi var ShInfo: TSHFileInfo; begin
SHGetFileInfo( PChar(FullPath), 0, ShInfo, SizeOf(ShInfo), SHGFI_TYPENAME or SHGFI_SYSICONINDEX ); Result := ShInfo.iIcon;
end;
//------------------------------------------------------------------------------ icoShell Load All procedure Shell_ico_LoadAll(MyImageList: TImageList; icoSmall: Boolean); //загружаем системные иконки типов файлов в ImageListы //uses ShellApi var SysImageList: uint; Flags: Cardinal; ShInfo: ShFileInfo;
begin
if icoSmall then Flags := SHGFI_SYSICONINDEX or SHGFI_SMALLICON {or SHGFI_USEFILEATTRIBUTES} else Flags := SHGFI_SYSICONINDEX or SHGFI_LARGEICON {or SHGFI_USEFILEATTRIBUTES};
//Запрашиваем иконки SysImageList := SHGetFileInfo('', 0, ShInfo, SizeOf(TSHFileInfo), Flags);
if SysImageList <> 0 then MyImageList.Handle := SysImageList;
end;
//------------------------------------------------------------------------------ LV as Explorer procedure LVasExplorer(LV: TListView; Path: string; HideShow: Boolean); var sr: TSearchRec; xItem: TListItem; icoListSmall, icoListLarge: TImageList; Atrib: integer;
begin
if Length(Path) = 1 then Path := Path + ':\' else Path := IncludeTrailingBackSlash(Path);
if not DirectoryExists(Path) then exit;
if HideShow then Atrib := faDirectory + faAnyFile + faVolumeID else Atrib := faDirectory + faAnyFile + faVolumeID - faHidden - faSysFile;
if FindFirst(Path + '*.*', Atrib, sr) <> 0 then begin // ShowMessage(Path+' - ПАПКИ НЕ СУЩЕСТВУЕТ!'); //uses Dialogs exit; end;
LV.Cursor := crHourGlass;
LV.Items.BeginUpdate;
while LV.Columns.Count < 3 do LV.Columns.Add;
{$REGION ' иконки '}
//Создаем списки маленьких иконок типов файлов if LV.SmallImages = nil
then begin icoListSmall := TImageList.Create(LV.Owner); LV.SmallImages := icoListSmall; end
else icoListSmall := LV.SmallImages as TImageList;
//Создаем списки больших иконок типов файлов if LV.LargeImages = nil
then begin icoListLarge := TImageList.Create(LV.Owner); LV.LargeImages := icoListLarge; end
else icoListLarge := LV.LargeImages as TImageList;
Shell_ico_LoadAll(LV.SmallImages as TImageList, True); Shell_ico_LoadAll(LV.LargeImages as TImageList, False);
{$ENDREGION}
LV.Items.Clear;
repeat if sr.Name = '' then Continue; if sr.Name = '.' then Continue; if sr.Name = '..' then Continue;
if sr.Attr and faDirectory = faDirectory
then//папка begin xItem := LV.Items.Add; xItem.Caption := (sr.Name); //Name xItem.SubItems.Add('\Folder'); //Folder type xItem.SubItems.Add( inttostr(sr.Size) ); xItem.ImageIndex := Shell_ico_Index(Path + sr.Name); //ico end
else//файл begin xItem := LV.Items.Add; xItem.Caption := sr.Name; //Name xItem.SubItems.Add( Copy(ExtractFileExt(sr.Name), 2) ); //Ext xItem.SubItems.Add( inttostr(sr.Size) ); //Size xItem.ImageIndex := Shell_ico_Index(Path + sr.Name); //ico end;
until FindNext(sr) <> 0;
FindClose(sr);
LV.Items.EndUpdate;
LV.Cursor := crDefault; end;
procedure TForm1.Button1Click(Sender: TObject); begin LVasExplorer(ListView1, 'D:\Рабочий стол\123', True) end;
|
|