Конференция "WinAPI" » SHBrowseForFolder модально [D6, WinXP]
 
  • Циркуль (17.10.08 14:22) [0]
    Как сделать модальным диалог, показываемый при вызове SHBrowseForFolder ?

    Использую так:

    function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
    var
     Buffer: array[0..MAX_PATH - 1] of char;
     R: TRect;
    begin
     case uMsg of
       BFFM_INITIALIZED:
         begin
           if lpData <> 0 then
             SendMessage(Wnd, BFFM_SETSELECTION, 1, lpData);
           if GetWindowRect(Wnd, R) then
             MoveWindow(Wnd, (Screen.Width - (R.Right - R.Left)) div 2, (Screen.Height - (R.Bottom - R.Top)) div 2,
                        R.Right - R.Left, R.Bottom - R.Top, True);
         end;
       BFFM_SELCHANGED:
         begin
           SHGetPathFromIDList(PItemIDList(lParam), Buffer);
           SendMessage(Wnd, BFFM_SETSTATUSTEXT, 0, Integer(@Buffer));
         end;
     end;
     Result := 0;
    end;

    // copied from the last "Latium Software - Pascal Newsletter #33"
    function BrowseForFolder(Title: string; RootCSIDL: integer = 0;
     InitialFolder: string = ''): string;
    var
     BrowseInfo: TBrowseInfo;
     Buffer: array[0..MAX_PATH - 1] of char;
     ResultPItemIDList: PItemIDList;
    begin
     with BrowseInfo do
     begin
       hwndOwner := Application.Handle;
       if RootCSIDL = 0 then
         pidlRoot := nil
       else
         SHGetSpecialFolderLocation(hwndOwner, RootCSIDL,
           pidlRoot);
       pszDisplayName := @Buffer;
       lpszTitle := PChar(Title);
       ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT;
       lpfn := BrowseCallbackProc;
       lParam := Integer(Pointer(InitialFolder));
       iImage := 0;
     end;
     Result := '';
     ResultPItemIDList := SHBrowseForFolder(BrowseInfo);
     if ResultPItemIDList <> nil then
     begin
       SHGetPathFromIDList(ResultPItemIDList, Buffer);
       Result := Buffer;
       GlobalFreePtr(ResultPItemIDList);
     end;
     with BrowseInfo do
       if pidlRoot <> nil then
         GlobalFreePtr(pidlRoot);
    end;

  • clickmaker © (17.10.08 14:26) [1]
    эээ... а как он может быть немодальным, если возвращает ResultPItemIDList?
  • Циркуль (17.10.08 14:29) [2]
    Ну.... Я Вам на это не отвечу :)

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

    Не очень красиво, вобщем...
  • clickmaker © (17.10.08 14:31) [3]
    замени hwndOwner := Application.Handle на Handle формы
  • Циркуль (17.10.08 14:40) [4]
    Сделал так

       if Assigned(Screen.ActiveForm) then
         hwndOwner := Screen.ActiveForm.Handle
       else
         hwndOwner := Application.Handle;



    Работает.

    Спасибо! :)
 
Конференция "WinAPI" » SHBrowseForFolder модально [D6, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]