Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Функция выбора папки SHBrowseForFold задать путь?


Автор: Nicholas 20.9.2016, 13:57
Надо, чтобы при открытии диалога выбора папки открывался изначально заданный путь, есть вот такой код:

Код

function BrowseCallbackProc(DialogHWND: THandle;NINT: Integer; PARAM1: lParam; PARAM2: lParam): integer; stdcall;
var
s: String;
begin
if NInt = BFFM_INITIALIZED then
begin
s:=root;
SendMessage(DialogHWND,BFFM_SETSELECTION,1,integer(PChar(s)));
end;
result:=0;
end;

Function SelFolderDilalog(Caption,root:string):String;
var
  TitleName: string;
  lpItemID: PItemIDList;
  BrowseInfo: TBrowseInfo;
  DisplayName: array[0..MAX_PATH] of char;
  TempPath: array[0..MAX_PATH] of char;
begin
  Result:='0';
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  BrowseInfo.hwndOwner:=MainPage.handle;
  BrowseInfo.lpfn:=@BrowseCallbackProc;
  BrowseInfo.pszDisplayName:=@DisplayName;
  TitleName:=Caption;
  BrowseInfo.lpszTitle:=PChar(TitleName);
  BrowseInfo.ulFlags:=BIF_RETURNONLYFSDIRS;
  lpItemID:=SHBrowseForFolder(BrowseInfo);
  if lpItemID<>nil then
    begin
      SHGetPathFromIDList(lpItemID, TempPath);
      result:=TempPath; //Записываем результат выбора
      GlobalFreePtr(lpItemID);
    end;
end;


Сейчас root это глобальная переменная в которой и передается первоначальный путь, но глобальные переменный в диалоговом окне это уж слишком.

Вопрос, как передать root в функцию BrowseCallbackProc из функции SelFolderDilalog ????

Автор: RAIN666 10.6.2019, 14:11
Код

function BrowseForFileEx(const owner: hwnd; var res:string;
                         const def,path,filter,DefExt:string;
                         const DefIndex: Integer):boolean;
var
  ofn : openfilename;
  buf : array [0..255] of char;
  i : integer;
begin
  ZeroMemory(@ofn, sizeof(ofn));
  fillchar(buf,256,0);
  if def<>'' then
  for i := 0 to length(def)-1 do
    buf[i] := def[i+1];
  ofn.lStructSize := sizeof(ofn);
  ofn.hWndOwner := owner;
  ofn.lpstrFile := buf;
  ofn.nMaxFile := sizeof(buf);
  ofn.lpstrFilter := pchar(filter);
  ofn.nFilterIndex := DefIndex;
  ofn.lpstrDefExt := PChar(defext);
  ofn.lpstrFileTitle := '';
  ofn.nMaxFileTitle := 0;
  ofn.lpstrInitialDir := pchar(path);
  ofn.Flags := OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
  ofn.FlagsEx := 0;
  result := GetOpenFileName(ofn);
  if result then
  res := buf;
end;

function BrowseForFolderEx(Owner : HWND; InitDir, Title : string;
                           var res : string) : Boolean;
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 := Owner;
  BrowseInfo.pszDisplayName := @DisplayName;
  BrowseInfo.lpszTitle := PChar(Title);
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  Result := lpItemId <> nil;
  if Result then
  begin
    SHGetPathFromIDList(lpItemID, TempPath);
    res := TempPath;
    GlobalFreePtr(lpItemID);
  end;
end;

Автор: navodri 1.8.2019, 10:01
.



Скачайте библиотеку https://1drv.ms/u/s!AqhpTDRHLqBLgYxxXSec2sWGyHRHEg?e=mQ0BdH. Там масса примеров на чистом WinAPI, включая и ответ на Ваш вопрос. Однозначно пригодиться на все случаи жизни! Есть даже браузер на API.



.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)