begin
01eCheck(SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, StartPIDL));

With BI do

begin
hwndOwner • := Application.Handle;
pszDisplayName := @S;
IpszTitle : = 'Выберите необходимую папку' ;
ulFlags := BIF_RETURNONLYFSDIRS;
pidlRoot := StartPIDL;
lpfn := nil;
i Image ±, end;
ResPIDL := SHBrowseForFolder(BI);
if SHGETPathFromlDList(ResPIDL, @Path[0]) then Label1.Caption := StrPas(@Path[0]);
end;

Полученное имя здесь отображается при помощи компонента Labeii.

3. Наконец, перейдем к третьему действию нашей задачи. Теперь, зная pidl папки, с которой вы будете работать, можно получить указатель на интерфейс ishellFolder вызовом метода BindToObject. Мы еще не рассмотрели такой важный аспект работы с папками, как просмотр их содержимого. Верные правилу СОМ; "каждый должен заниматься своим делом", разработчики Shell предоставили для просмотра еще один интерфейс - iEnumiDList. Пугаться нечего, набор возможностей этого интерфейса даже меньше, чем у пульта ДУ в магнитофоне. Его четыре метода - Next, skip, Reset и clone - позволяют организовать просмотр списка в одном направлении, а также возврат к началу и дублирование (Clone) выбранного элемента списка. Вот как это выглядит на практике.

Memol.Clear;

try

01eCheck(SHGetDesktopFolder(DeskTop));

if not Succeeded(DeskTop.ParseDisplayName(Self.Handle,nil, StringToWideChar (E3itl.Text,ws, MAX_PATH) ,n, pidl, attr))

then begin ShowMessage ('Неизвестное имя ' ) ; Exit; end; OleCheck(DeskTop.BindToObject(pidl,nil, IID_IShellFolder, Pointer(NewShellFolder))); OleCheck(NewShellFolder.EnumObjects (Self.Handle,

SHCONTF_FOLDERS or SHCONTF_NONFOLDERS, Enumerator) ) ;
while Enumerator.Next (1, pidl, Nunpidls) = S_OK do begin
NewShellFolder.GetDisplayNameOf(PIDL, SHGDN_FORPARSING, StrRet);

case StrRet.uType of

STRRET_CSTR:

s : = StrRet.cStr; STRRET_OFFSET:

begin P := @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)]; SetString(s, P, PIDL.mkid.cb - StrRet.uOffset); end; STRRET_WSTR:

s := StrRet.pOleStr;

end;//case

Memol.Lines.Add(s);
end;

except

on E:E01eSysError do ShowMessage('') ;
end;

В этом примере имя нужной папки извлекается из компонента Editi. Получив указатель на интерфейс ishellFolder и затем интерфейс iEnumiDList, программа заполняет полученными именами файлов список

Memol.Lines.

Помимо названия из большинства объектов файловой системы можно "вытащить" массу полезной информации. Чаще всего задаются вопросом; а как извлечь значок, соответствующий данному файлу или хранящийся в нем?

Способов для достижения этой цели несколько. Самый простой - через вызов функции;
function SHGetFilelnfo (pszPath: PAnsiChar;
dwFileAttributes : DAORD;
varpsfi: TSHFilelnfo;
cbFilelnfo, uFlags: UINT): П/CRD;
Параметр pszPath может быть указателем как на строку с именем файла, так и на структуру вида pidl. Функция заполняет структуру psfi (тип TSHFilelnfo) длиной cbFiieinf о байт. В зависимости от значения слова флагов (параметр uFlags) на выходе может быть разнообразная информация. В частности, если в параметре uFlags заданы значения SHGFI SYSICONINDEX И SHGFI ICON, то в структуру psfi будет записан номер значка для данного файла в системном списке изображений, а результатом выполнения функции будет дескриптор этого списка. Воспользоваться им можно (например, для панели инструментов) так;

⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2018
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс