2012-03-02 2 views
4

Можно создать дубликат:
Delphi: Selecting a directory with TOpenDialogDELPHI - Как использовать opendialog1 для выбора папки?

мне нужно открыть определенную папку на моем проекте. Когда я использую opendialog1, я могу открыть файл. Как насчет открытия папки?

wanted - open folder dialog in Delphi

PS: Я использую Delphi 2010

+3

ответ Кена (только один до сих пор) является большим, но это, кажется, как DUP из: http://stackoverflow.com/questions/ 7422689/delphi-selection-a-directory-with-topendialog – Argalatyr

+0

В этом случае вы можете использовать потомок 'TOpenDialog' -' TSaveDialog' (да, это довольно быстро и грязно) – OnTheFly

+1

Проголосовало за закрытие, но я буду отсутствовать ['teran's answer'] (http://stackoverflow.com/a/9529154/960757). – TLama

ответ

6

Вы также можете использовать TBrowseForFolder класс действия (stdActns.pas).

var 
    dir: string; 
begin 
    with TBrowseForFolder.Create(nil) do try 
    RootDir := 'C:\'; 
    if Execute then 
     dir := Folder; 
    finally 
    Free; 
    end; 
end; 

или использовать функцию WinAPI - SHBrowseForFolder непосредственно (второй SelectDirectory перегрузки использует его, вместо того, чтобы первая перегрузку, что создает собственную DELPHI-окно со всеми элементами управления во время выполнения):

var 
    dir : PChar; 
    bfi : TBrowseInfo; 
    pidl : PItemIDList; 
begin 
    ZeroMemory(@bfi, sizeof(bfi)); 
    pidl := SHBrowseForFolder(bfi); 
    if pidl <> nil then try 
    GetMem(dir, MAX_PATH + 1); 
    try 
     if SHGetPathFromIDList(pidl, dir) then begin 
     // use dir 
     end; 
    finally 
     FreeMem(dir); 
    end; 
    finally 
    CoTaskMemFree(pidl); 
    end; 
end; 
+0

строки 13,14 могут быть заменены на 'CoTaskMemFree' – OnTheFly

9

Вы ищете SelectDirectoryFileCtrl в блоке. Он имеет две перегруженные версии:

function SelectDirectory(var Directory: string; 
    Options: TSelectDirOpts; HelpCtx: Longint): Boolean; 
function SelectDirectory(const Caption: string; const Root: WideString; 
var Directory: string; Options: TSelectDirExtOpts; Parent: TWinControl): Boolean; 

Тот, который вы хотите использовать, зависит от версии Delphi вы используете, и конкретный вид и функциональность, которую вы ищете; Я (как правило, найти второй вариант отлично работает для современных версий Delphi и Windows, и пользователи, кажется, довольны «обычно ожидаемому внешним видом и функциональностью»

+2

+1 Кен, кстати, название устройства - 'FileCtrl'. – RRUZ

+1

Обе функции были перемещены из блока 'FileCtrl' давным-давно. –

+0

Родриго, спасибо за исправление. Исправлена. @Remy, [docs для XE2] (http://docwiki.embarcadero.com/VCL/en/FileCtrl.SelectDirectory) говорят, что вы ошибаетесь. Если они были перенесены «давным-давно», документы должны упомянуть об этом факте. –

13

В Vista и выше вы можете показать более современный вид диалога, используя TFileOpenDialog.

var 
    OpenDialog: TFileOpenDialog; 
    SelectedFolder: string; 
..... 
OpenDialog := TFileOpenDialog.Create(MainForm); 
try 
    OpenDialog.Options := OpenDialog.Options + [fdoPickFolders]; 
    if not OpenDialog.Execute then 
    Abort; 
    SelectedFolder := OpenDialog.FileName; 
finally 
    OpenDialog.Free; 
end; 

, который выглядит следующим образом:

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^