Форум: "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.022 c