Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.01.2014, 15:09
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию Диалог выбора папок

Доброго времяни суток. В своей программе использую диолог выбора каталога. Нужно сделать чтоб она открывалась на последнем ранее выбраном каталоге. Для этого перед запуском диалога в pidlRoot эту папку(путь) указать.
Как мне в pidlRoot поместить строку String.
Я так понял, что нужно bi.pidlRoot := PIDL; в место PIDL ввести 'C:\Program Files'

Код:
uses ShlObj; 

{....}

procedure CallBack(wnd: hWnd; uMsg: UINT; lParam, lpData: LParam) stdcall; 
begin 
  SendMessage(wnd, BFFM_ENABLEOK, 0, 1); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  bi: TBrowseInfo; 
  s: PChar; 
  PIDL, ResPIDL: PItemIDList; 
begin 
  SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, PIDL); 
  s := StrAlloc(128); 
  bi.hwndOwner := Form1.Handle; 
  bi.pszDisplayName := s; 
  bi.lpszTitle := 'Выбор прапки'; 
  bi.pidlRoot := PIDL; 
  bi.lpfn := addr(CallBack); 
{bi.ulFlags флаги, которые задают режим отображения диалога:
  BIF_BROWSEFORCOMPUTER - Возвратить только компьютеры. Если пользователь выбрал что-то отличное от компьютеров, то кнопка OK останется серой.
  BIF_BROWSEFORPRINTER - Возвратить только принтеры. Если пользователь выбрал что-
то отличное от принтеров, то кнопка OK останется серой.
  BIF_RETURNONLYFSDIRS - Возвратить только папки файловой системы. Если пользователь выберет папки, которые не являются частью файловой системы, то кнопка OK останется серой. Это необходимо для того если ваша программа не работает с виртуальными папками вроде "Панель управления".
  BIF_BROWSEINCLUDEFILES - Диалог просмотра будет отображать файлы вместе с директориями.
  BIF_DONTGOBELOWDOMAIN - Не включать сетевые папки Доменного уровня ниже, чем в TreeView контроле.
  BIF_RETURNFSANCESTORS - В качестве выбора допустимы только объекты, представленные в файловой системе.
  BIF_STATUSTEXT - Включает область статуса в блок диалога. Функция может установить текст посылая сообщения блоку диалога.
  BIF_EDITBOX - В диалоговом окне будет присутствовать строка редактирования, таким образом пользователь может набрать имя элемента.
  BIF_VALIDATE - Если пользователь введёт неверное имя в строке редактирования, то диалоговое окно вызовет функцию обратного вызова приложения по сообщению BFFM_VALIDATEFAILED.}
  ResPidl := SHBrowseForFolder(BI); 
  SHGetPathFromIDList(ResPidl, s); 
  Form1.Caption := s; 
end;
Ответить с цитированием
  #2  
Старый 07.01.2014, 19:33
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

см. папские демки:

Код:
function SelectDirectory(const Caption: string; const Root: WideString;
  var Directory: string): Boolean;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  OldErrorMode: Cardinal;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
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;
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS;
        if Directory <> '' then
        begin
          lpfn := SelectDirCB;
          lParam := Integer(PChar(Directory));
        end;
      end;
      WindowList := DisableTaskWindows(0);
      OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        SetErrorMode(OldErrorMode);
        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;

конкретно:

Код:
      RootItemIDList := nil;
      if Root <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
          POleStr(Root), Eaten, RootItemIDList, Flags);
      end;
      with BrowseInfo do
      begin
        ...
        pidlRoot := RootItemIDList;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 07.01.2014, 19:58
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

uses -- Что добавить?
Ругается на ShellMalloc: IMalloc;
Buffer := ShellMalloc.Alloc(MAX_PATH);
POleStr(Root), Eaten, RootItemIDList, Flags);
lpfn := SelectDirCB;
ShellMalloc.Free(Buffer);
[DCC Error] Unit1.pas(33): E2003 Undeclared identifier: 'IMalloc'
Ответить с цитированием
  #4  
Старый 07.01.2014, 20:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

так там же, в папских демках посмотри: ActiveX
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 07.01.2014, 20:16
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

А где эти--- папские демки.
Поиск по сайту ничего не дал.
Ответить с цитированием
  #6  
Старый 07.01.2014, 20:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

FileCtrl.pas
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 07.01.2014, 20:28
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

Добавил в uses FileCtrl, ничего не дало :

[DCC Error] Unit1.pas(33): E2003 Undeclared identifier: 'IMalloc'
[DCC Error] Unit1.pas(41): E2033 Types of actual and formal var parameters must be identical
[DCC Error] Unit1.pas(41): E2015 Operator not applicable to this operand type
[DCC Error] Unit1.pas(43): E2066 Missing operator or semicolon
[DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'POleStr'
[DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'SelectDirCB'
Ответить с цитированием
  #8  
Старый 07.01.2014, 20:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а ты добавь ActiveX !!!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 07.01.2014, 20:48
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

Спасибо помогло, осталось вроде одна:
lpfn := SelectDirCB;
[DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'SelectDirCB'
Ответить с цитированием
  #10  
Старый 07.01.2014, 20:54
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

так замени эту строку на свою
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 07.01.2014, 21:05
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

Извини, объясни для тупого.
lpfn := SelectDirCB; ------ что это, для чего.
Ответить с цитированием
  #12  
Старый 07.01.2014, 21:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

назначает функцию обратного вызова. в твоем примера она выглядит как:
Код:
bi.lpfn := addr(CallBack); 
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 07.01.2014, 21:30
Aleks99 Aleks99 вне форума
Прохожий
 
Регистрация: 06.01.2014
Сообщения: 21
Версия Delphi: 10
Репутация: 10
По умолчанию

ок понятненько. А для вызова функции.

function SelectDirectory(const Caption: string; const Root: WideString;
var Directory: string): Boolean;

SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean;
а тут что

ок понятненько. А для вызова функции.

function SelectDirectory(const Caption: string; const Root: WideString;
var Directory: string): Boolean;

SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean;
а тут что

ок понятненько. А для вызова функции.

function SelectDirectory(const Caption: string; const Root: WideString;
var Directory: string): Boolean;

SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean;
Root- а тут что

Последний раз редактировалось M.A.D.M.A.N., 08.01.2014 в 16:09.
Ответить с цитированием
  #14  
Старый 08.01.2014, 12:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

параметры:
-заголовок окна
-корневой каталог
-переменная типа Строка, в которой возвращается результат
в файле справки все описано.

http://www.delphisources.ru/forum/sh...ad.php?t=25573
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось M.A.D.M.A.N., 08.01.2014 в 16:10.
Ответить с цитированием
  #15  
Старый 08.01.2014, 15:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Гайд для новичка:
1) Берем в руки мышь.
2) Нажимаем на левый край слова "SelectDirectory".
3) Тянем до правого края. Слово выделяется.
4) Жмем Ctrl+C.
5) Заходим на http://www.google.ru.
6) Нажимаем Ctrl+V.
7) Нажимаем Enter.
8) Нажимаем на первую понравившуюся ссылку.
9) Читаем описание, где все параметры расписаны подробнейшим образом.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025