Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.06;
Скачать: CL | DM;

Вниз

SHBrowseForFolder модально   Найти похожие ветки 

 
Циркуль   (2008-10-17 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 ©   (2008-10-17 14:26) [1]

эээ... а как он может быть немодальным, если возвращает ResultPItemIDList?


 
Циркуль   (2008-10-17 14:29) [2]

Ну.... Я Вам на это не отвечу :)

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

Не очень красиво, вобщем...


 
clickmaker ©   (2008-10-17 14:31) [3]

замени hwndOwner := Application.Handle на Handle формы


 
Циркуль   (2008-10-17 14:40) [4]

Сделал так

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


Работает.

Спасибо! :)



Страницы: 1 вся ветка

Текущий архив: 2009.12.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
15-1254847110
DDDx
2009-10-06 20:38
2009.12.06
Компилятор Latex для Windows


2-1256020739
123123
2009-10-20 10:38
2009.12.06
ASCII символы


15-1254984893
Kolan
2009-10-08 10:54
2009.12.06
Как реализован синглетон TRttiContext?


2-1255711170
den49
2009-10-16 20:39
2009.12.06
Чтение из файла при помощи Filestream


15-1255180534
Artem
2009-10-10 17:15
2009.12.06
Проблема