#delphi #winapi #delphi-2010
#delphi #winapi #delphi-2010
Вопрос:
Моя задача звучит очень просто… Так я и думал.
Задача: использовать диалог FileCtrl.SelectDirectory только с локальными дисками. Показывать подключенные диски, сеть, общие ресурсы и другие удаленные пути запрещено.
Похоже, неплохо открыть диалоговое окно с Root = виртуальная папка моего компьютера.
Но когда я пробую разные подходы для получения пути, в результате я всегда получаю пустую строку.
Пожалуйста, покажите мне, что я делаю не так?
В приведенном ниже примере я показываю свои 2 подхода, которые очень популярны в Интернете.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, cxClasses, cxShellBrowserDialog, FileCtrl, ShlObj, KnownFolders,
ActiveX;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetKnownFolderPath(const folder : KNOWNFOLDERID ) : string;
var
path: LPWSTR;
begin
if SUCCEEDED(SHGetKnownFolderPath(folder, 0, 0, path)) then
begin
try
Result := path;
finally
CoTaskMemFree(path);
end;
end else
Result := '';
end;
function GetSpecialFolderPath(CSIDLFolder: Integer): string;
var
FilePath: array [0..MAX_PATH] of char;
begin
SHGetFolderPath(0, CSIDLFolder, 0, 0, FilePath);
Result := FilePath;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Root, Directory: String;
begin
Root := GetKnownFolderPath(FOLDERID_ComputerFolder);
SelectDirectory('caption', Root, Directory, [sdNewUI, sdShowShares], nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Root, Directory: String;
begin
Root := GetSpecialFolderPath($0011); //CSIDL_DRIVES
SelectDirectory('caption', Root, Directory, [sdNewUI, sdShowShares], nil);
end;
end.
Комментарии:
1. Для этого нет каталога файловой системы . Вам нужно будет получить PItemIDList и использовать его для получения вложенных папок. Существует несколько способов получить список виртуальных папок, предоставляемых системой, большинство из них в ShlObj или KnownFolders.
2. FWIW, взгляните на справку для SelectDirectory . Также взгляните на обратный вызов: docwiki.embarcadero.com/Libraries/Rio/en /…
Ответ №1:
SelectDirectory()
работает только с путями файловой системы, а не с виртуальными элементами. Элементы, которые вы пытаетесь установить Root
, не имеют путей к файловой системе.
Если вы хотите отобразить диалоговое окно, которое работает с виртуальными элементами, вы должны использовать SHBrowseForFolder()
непосредственно или IFile(Open)Dialog
вместо. Затем вы можете работать с элементами, которые представлены PIDL
s или IShellItem
интерфейсом соответственно.
Комментарии:
1. Хорошо, теперь я вижу диалоговое окно с Root в качестве моего компьютера. Знаете ли вы способ скрыть подключенные диски под корнем?