Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2008, 09:12   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Диалог открытия директории

Как мне программно показать вот такой диалог, мне надо получить путь к директории а tDopenDlialog для этой цели помойму не очень подходит
Altera вне форума Ответить с цитированием
Старый 04.07.2008, 09:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Unit

FileCtrl

Category

dialog and message routines

function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
Так подойдет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.07.2008, 10:05   #3
EdNovice
Пользователь
 
Регистрация: 13.04.2007
Сообщений: 65
По умолчанию

function SelectDirectory(AOwner : HWnd) : string;
var
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : array[0..MAX_PATH] of Char;
TempPath : array[0..MAX_PATH] of Char;
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := AOwner;
BrowseInfo.pszDisplayName := @DisplayName;
BrowseInfo.lpszTitle := 'Specify a directory';
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
lpItemID := SHBrowseForFolder(BrowseInfo);
if Assigned(lpItemId) then
begin
SHGetPathFromIDList(lpItemID, TempPath);
GlobalFreePtr(lpItemID);
end
else Result := '';
Result := string(TempPath);
end;
EdNovice вне форума Ответить с цитированием
Старый 04.07.2008, 12:39   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Сама функция:
Код:
function AdvSelectDirectory(const Caption: string; const Root: WideString;
  var Directory: string; EditBox: Boolean = False; ShowFiles: Boolean = False;
  AllowCreateDirs: Boolean = True): Boolean;
  function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam): Integer;
    stdcall;
  var
    PathName: array[0..MAX_PATH] of Char;
  begin
    case uMsg of
      BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
    end;
    Result := 0;
  end;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
const
  BIF_USENEWUI = $0040;
  BIF_NOCREATEDIRS = $0200;
begin
  Result := False;
  if not DirectoryExists(Directory) then
    Directory := '';
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if Root <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
          POleStr(Root), Eaten, RootItemIDList, Flags);
      end;
      OleInitialize(nil);
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS or BIF_USENEWUI or
          BIF_EDITBOX * Ord(EditBox) or BIF_BROWSEINCLUDEFILES * Ord(ShowFiles) or
          BIF_NOCREATEDIRS * Ord(not AllowCreateDirs);
        lpfn    := @SelectDirCB;
        if Directory <> '' then
          lParam := Integer(PChar(Directory));
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Directory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;
А вот так её вызвать:
Код:
procedure Form1.Button1Click(Sender: TObject);
var
dir:string;
begin
AdvSelectDirectory('Выберите папку', 'd:\,c:\', dir, False, False, True);
end;
FaTaL вне форума Ответить с цитированием
Старый 04.07.2008, 16:06   #5
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Вы чего человека таким листингом пугаете?))

Правильно Stilet писал. Вот пример:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s:widestring;
begin
if SelectDirectory('Выберите директорю','',s) then form1.Caption:=s;
end;
P.S.: В uses надо добавить QDialogs!

______________________
Можно и FileCtrl...
Цитата:
таскать за собой еще и qtinf.dll
Будем знать. Спасибо.

Последний раз редактировалось zetrix; 04.07.2008 в 16:50.
zetrix вне форума Ответить с цитированием
Старый 04.07.2008, 16:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
P.S.: В uses надо добавить QDialogs!
Неправильно, а точнее некоректно. Еще раз внимательно прочитай мой пост
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.07.2008, 16:35   #7
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Если добавить QDialogs, а не Dialogs, то придется таскать за собой еще и qtinf.dll
_Engine_ вне форума Ответить с цитированием
Старый 04.07.2008, 16:52   #8
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Мне кажется, что Stilet сообщает нам, что есть другая функция с такимже названием и если их перегрузить, то компилятор вызовет нужную.....
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 04.07.2008, 17:05   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Карась
Нет. Я говорю что Зетрикс немного ошибся указав на QDialogs, ибо эта функция есть в FileCtrl (Внимательно см. мой пост). Ато дийсно таскать много придется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.07.2008, 17:17   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

FaTaL, а что это за страшная функция? В нее случайно кнопочки/галочки свои нельзя добавить?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать диалог F1kus Общие вопросы Delphi 13 21.08.2008 08:33
при открытии большого файла должно появляться окно с ProgressBar и показывать ход открытия Михаил Юрьевич Общие вопросы Delphi 3 28.05.2008 23:33
Диалог Михаил Юрьевич Общие вопросы Delphi 2 26.04.2008 22:35
Открытия графических файлов Kocapb Общие вопросы C/C++ 3 01.12.2007 19:11