Главная страница
    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-1255610309
XTasy
2009-10-15 16:38
2009.12.06
Глобальные переменные delphi


15-1252098770
Кто б сомневался
2009-09-05 01:12
2009.12.06
Мультиязык в проектах на Delphi 2009


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


15-1255081017
Alkid
2009-10-09 13:36
2009.12.06
Плагины-переводчики


15-1254861007
Юрий
2009-10-07 00:30
2009.12.06
С днем рождения ! 7 октября 2009 среда





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