Главная страница
    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.46 MB
Время: 0.005 c
15-1254847110
DDDx
2009-10-06 20:38
2009.12.06
Компилятор Latex для Windows


1-1227792603
Дмитрий Белькевич
2008-11-27 16:30
2009.12.06
Приложение блокирует папку после копирования файлов в неё


2-1255932245
Фуфик
2009-10-19 10:04
2009.12.06
последняя строка Excel


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


3-1230718073
Медвежонок Пятачок
2008-12-31 13:07
2009.12.06
рекурсия, CTE и сортировка как в оракле





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский