使用SelectDirectory有辦法控制出現位置嗎? |
答題得分者是:wameng
|
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
hi,darnell: 1.我呼叫SelectDirectory,視窗會出現在中央,並沒有像你說的在右下角的位置. 2.如果你要讓跳出來的視窗,可以在其他地方出現,那麼,你可能要自己寫自己的SelectDirectory function.
source code在Delphi目錄下的\source\vcl\filectrl.pas檔裡.你可以發現原來的程式只是動態產生一個TSelectDirDlg的畫面而已.你可以自加再上那個form的Top及Left等屬性,也能改變視窗出現的位置.試試看
|
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
謝謝你的回答...
SelectDirectory一共有兩種產生的樣式...
其中SelectDirectory(Directory,Options,HelpCtx):Boolean;所產生的對話框的確在正中央,可是我是需要用另外一種可以選取網路芳鄰的目錄
SelectDirectory('挑選目錄', '', strDir)此種所產生的對話框我也有想過你說的加入屬性來改變位置,可是第二種的原始碼並不像第一種方式可以輕易改變,也或許我不太了解可以加在哪裡,請再指點謝謝~
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string): Boolean; var WindowList: Pointer; BrowseInfo: TBrowseInfo; Buffer: PChar; OldErrorMode: Cardinal; RootItemIDList, ItemIDList: PItemIDList; ShellMalloc: IMalloc; IDesktopFolder: IShellFolder; Eaten, Flags: LongWord; begin Result := False; if not DirectoryExists(Directory) then Directory := ''; FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then begin Buffer := ShellMalloc.Alloc(MAX_PATH); try RootItemIDList := nil; if Root <> '' then begin SHGetDesktopFolder(IDesktopFolder); IDesktopFolder.ParseDisplayName(Application.Handle, nil, POleStr(Root), Eaten, RootItemIDList, Flags); end; with BrowseInfo do begin hwndOwner := Application.Handle; pidlRoot := RootItemIDList; pszDisplayName := Buffer; lpszTitle := PChar(Caption); ulFlags := BIF_RETURNONLYFSDIRS; if Directory <> '' then begin lpfn := SelectDirCB; lParam := Integer(PChar(Directory)); end; end; WindowList := DisableTaskWindows(0); OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); try ItemIDList := ShBrowseForFolder(BrowseInfo); finally SetErrorMode(OldErrorMode); EnableTaskWindows(WindowList); end; Result := ItemIDList <> nil; if Result then begin ShGetPathFromIDList(ItemIDList, Buffer); ShellMalloc.Free(ItemIDList); Directory := Buffer; end; finally ShellMalloc.Free(Buffer); end; end; end;------------------------ 創造其實就是...... 轉個彎看世界...... |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
好吧!這是您要的程式碼。 其中我已修改視窗會直接顯示正中央。
Function SelectDirectory(const Caption: string; const Root: String; out Directory: String): Boolean; function CBBrowseForFolder(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall; Var WRect : TRect; begin Result:= 0; case uMsg of BFFM_INITIALIZED: begin WRect.Left := 0;WRect.Top := 0; if Windows.GetClientRect(Wnd,WRect) then begin WRect.Left :=(GetSystemMetrics(SM_CXSCREEN) - WRect.Right) div 2; WRect.Top :=(GetSystemMetrics(SM_CYSCREEN) - WRect.Bottom) div 2; end; SetWindowPos(Wnd, 0,WRect.Left,WRect.Top, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER); end; end; end; var WindowList: Pointer; BrowseInfo: TBrowseInfo; Buffer: PChar; RootItemIDList, ItemIDList: PItemIDList; ShellMalloc: IMalloc; IDesktopFolder: IShellFolder; Eaten, Flags: LongWord; begin Result := False; Directory := ''; FillChar(BrowseInfo, SizeOf(BrowseInfo), 0); if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then begin Buffer := ShellMalloc.Alloc(MAX_PATH); try RootItemIDList := nil; if Root <> '' then begin SHGetDesktopFolder(IDesktopFolder); IDesktopFolder.ParseDisplayName(Application.Handle, nil, POleStr(Root), Eaten, RootItemIDList, Flags); end; with BrowseInfo do begin hwndOwner := Application.Handle; pidlRoot := RootItemIDList; pszDisplayName := Buffer; lpszTitle := PChar(Caption); ulFlags := BIF_RETURNONLYFSDIRS; lpfn := @CBBrowseForFolder; end; WindowList := DisableTaskWindows(0); try ItemIDList := ShBrowseForFolder(BrowseInfo); finally EnableTaskWindows(WindowList); end; Result := ItemIDList <> nil; if Result then begin ShGetPathFromIDList(ItemIDList, Buffer); ShellMalloc.Free(ItemIDList); Directory := Buffer; end; finally ShellMalloc.Free(Buffer); end; end; end; |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |