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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 17:40   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Диалог выбора директории с кнопкой "Создать папку"

Добрый вечер! Какая функция вызывает данный диалог?:
Изображения
Тип файла: png Безымянный.png (49.4 Кб, 214 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.11.2010, 17:44   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

эм, юзай shlobj и drkb...
Код:
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall;
begin
   Result := 0;
   if uMsg = BFFM_INITIALIZED then
      SendMessage( hwnd, BFFM_SETSELECTION, 1,
                   LongInt( PChar( myDir ) ) );
end;

function TForm1.SelectDirPlus(hWnd: HWND; const Caption: string;
  const Root: WideString): String;
var
  WindowList: Pointer;
  BrowseInfo : TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
  Cmd: Boolean;
begin
   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( hWnd, nil,
            POleStr( Root ), Eaten, RootItemIDList, Flags );
         end;
         with BrowseInfo do
         begin
            hwndOwner := hWnd;
            pidlRoot := RootItemIDList;
            pszDisplayName := Buffer;
            lpfn := @BrowseCallbackProc;
            lpszTitle := PChar( Caption );
            ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
         end;
         WindowList := DisableTaskWindows( 0 );
         try
           ItemIDList := ShBrowseForFolder( BrowseInfo );
         finally
            EnableTaskWindows( WindowList );
         end;
         Cmd :=  ItemIDList <> nil;
         if Cmd then
         begin
            ShGetPathFromIDList( ItemIDList, Buffer );
            ShellMalloc.Free( ItemIDList );
            Result:= Buffer;
         end;
      finally
         ShellMalloc.Free( Buffer );
      end;
   end;
end;

 ...
 // использование
 SelectDirPlus( Handle, 'Выберите каталог', '' )
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.11.2010, 17:55   #3
Sanprof
Форумчанин
 
Аватар для Sanprof
 
Регистрация: 28.01.2008
Сообщений: 267
По умолчанию

Не знаю кто написал этот компонент, но мне его тоже дали на форуме, я его успешно юзаю
DirSelected.rar
Не забываем говорить спасибо за помощь - это ведь так приятно
Sanprof вне форума Ответить с цитированием
Старый 16.11.2010, 18:13   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

raxp, говорит, что "[Error] MAIN.PAS(1608): Undeclared identifier: 'IMalloc'"
Код:
function TForm1.SelectDirPlus(hWnd: HWND; const Caption: string;
  const Root: WideString): String;
var
  WindowList: Pointer;
  BrowseInfo : TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
  Cmd: Boolean;
begin
   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( hWnd, nil,
            POleStr( Root ), Eaten, RootItemIDList, Flags );
         end;
         with BrowseInfo do
         begin
            hwndOwner := hWnd;
            pidlRoot := RootItemIDList;
            pszDisplayName := Buffer;
            lpfn := @BrowseCallbackProc;
            lpszTitle := PChar( Caption );
            ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
         end;
         WindowList := DisableTaskWindows( 0 );
         try
           ItemIDList := ShBrowseForFolder( BrowseInfo );
         finally
            EnableTaskWindows( WindowList );
         end;
         Cmd :=  ItemIDList <> nil;
         if Cmd then
         begin
            ShGetPathFromIDList( ItemIDList, Buffer );
            ShellMalloc.Free( ItemIDList );
            Result:= Buffer;
         end;
      finally
         ShellMalloc.Free( Buffer );
      end;
   end;
end;
Sanprof, это компонент для Delphi 2009, а у меня Delphi 7
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.11.2010, 18:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
artemavd
Запомни метод: Если ты не знаешь что за класс но точно уверен что он описан где-то в генофонде Делфи, запускай поиск по содержимому PAS файлов в папке и подпапках. где лежит делфи, и тогда ты увидишь что интерфейс этот описан в ShellCtrls.pas

P.S. ОЙ! Не то вставилось - он лежит в ActiveX
I'm learning to live...

Последний раз редактировалось Stilet; 16.11.2010 в 18:20.
Stilet вне форума Ответить с цитированием
Старый 24.11.2010, 11:08   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вопрос так и остался нерешеным....
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.11.2010, 11:12   #7
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

artemavd, так тебе же уже Stilet ответил, пропиши в uses ActiveX
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 24.11.2010, 11:16   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Есть компонент TShellTreeView на закладке Samples
и тут
psycho-coder вне форума Ответить с цитированием
Старый 24.11.2010, 11:26   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Почему нерешенным?
Артем, добавь в uses shlobj, ActiveX и все будет работать. Я проверил.
Вот еще такой вариант
Код:
uses
   ShlObj, ActiveX;


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 TForm1.RzBitBtn2Click(Sender: TObject);
var dir: string;
begin
  AdvSelectDirectory('Caption', 'c:\', dir, False, False, True);
  // Label1.Caption := dir;
end;
Тоже работает. Проверил
_SERGEYX_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти hwnd окна, которое вызывается кнопкой "Пуск"? marina15056 Помощь студентам 0 11.10.2010 17:20
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Работа с кнопкой "закрыть" BETONOMESHALKA Общие вопросы Delphi 11 24.12.2007 08:57