Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.005 c
2-1255767321
Роман
2009-10-17 12:15
2009.12.06
Чтение древа каталогов


15-1255185739
Artem
2009-10-10 18:42
2009.12.06
Запись алгоритма?


15-1254414106
boriskb
2009-10-01 20:21
2009.12.06
И не сомневался даже... к сожалению


15-1255027446
Piter
2009-10-08 22:44
2009.12.06
Word не может открыть файл более 32 MB?


15-1255119652
Kolan
2009-10-10 00:20
2009.12.06
А кто-нибудь пробовал писать визуализаторы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский