Интерфейс IShellFolder
Третий вариант получить pidi нужной папки – интерактивный, с помощью функции Shell API.
function ShBrowseForFolder(var Ipbi: TBrowselnfo): PItemlDList;
Перед ее вызовом следует заполнить структуру типа TBrowselnfo, содержащую в частности pidi того элемента, который будет корневым. После вызова функции пользователь увидит перед собой диалоговое окно выбора папки (рис. 31.3).
Рис. 31.3. Диалоговое окно выбора папки, созданное при вызове функции ShBrowseForFolder
В данном примере корневой служит виртуальная папка My Computer. Пользователю предоставляется возможность выбрать одну из папок файловой системы (за это отвечает флаг TBrowseinfo.uiFlags, равный BIF_RETURNONLYFSDIRS).
На выходе функция возвращает pidi папки, имя которой извлекается из него вызовом еще одной функции Shell – shGetPathFromList.
procedure TForml/ButtonlClick(Sender: TObject); var BI: TBrowselnfo; Image: integer; StartPIDL, ResPIDL: PItemlDList; S, Path: ArraytO..max_path-l] Of WideChar; begin 01eCheck(SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, StartPIDL)); With BI do Begin hwndOwner = Application.Handle; pszDisplayName = @S; IpszTitle = 'Выберите необходимую папку'; ulFlags = BIF_RETURNONLYFSDIRS; pidlRoot = StartPIDL; Ipfn = nil; iImage = 1; end; ResPIDL: = SHBrowseForFolder(BI); if SHGETPathFromlDList(ResPIDL, @Path[0]) then Labe11.Caption: = StrPas(@Path[0]); end;
Полученное имя здесь отображается при помощи компонента Label 1.
- Наконец, перейдем к третьему действию нашей задачи. Теперь, зная pidi папки, с которой вы будете работать, можно получить указатель на интерфейс ishellFolder вызовом метода BindToObject. Мы еще не рассмотрели такой важный аспект работы с папками, как просмотр их содержимого. Верные правилу СОМ: "каждый должен заниматься своим делом", разработчики Shell предоставили для просмотра еще один интерфейс – IEnumiDList. Пугаться нечего, набор возможностей этого интерфейса даже меньше, чем у пульта ДУ в магнитофоне. Его четыре метода – Next, Skip, Reset и clone – позволяют организовать просмотр списка в одном направлении, а также возврат к началу и дублирование (Clone) выбранного элемента списка.