Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.13;
Скачать: CL | DM;

Вниз

SelectDirectory   Найти похожие ветки 

 
lety   (2003-02-05 18:34) [0]

Вызываю функцию SelectDirectory("Выберите папку, где находятся ....","",s).
Окошко неизменно появляется в правом нижнем углу.
Его можно как-нибудь переместить?


 
gsu ©   (2003-02-05 18:50) [1]

напиши свой диалог или используй OpenDialog


 
lety   (2003-02-05 19:21) [2]

нет, мне SelectDirectory - как раз то, что надо
но местоположение смущает немного


 
Романов Р.В. ©   (2003-02-05 19:34) [3]

Так попробуй

uses ShellAPI, ShlObj;
{$R *.DFM}

function BrowseCallbackProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
const
_left = 60;
_top = 150;
var
wp: TWindowPlacement;
begin
Result := 0;
if uMsg = BFFM_INITIALIZED then
begin
GetWindowPlacement(Wnd, @wp);

SetWindowPos(Wnd, 0, _left, _top,
wp.rcNormalPosition.Right - wp.rcNormalPosition.Left,
wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top,
SWP_NOZORDER + SWP_NOACTIVATE);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
TitleName : string;
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : array[0..MAX_PATH] of char;
TempPath : array[0..MAX_PATH] of char;
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := Form1.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := "Выберите папку, где находятся ....";
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
BrowseInfo.lpfn := BrowseCallbackProc;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
ShowMessage(TempPath);
GlobalFreePtr(lpItemID);
end;
end;


 
Романов Р.В. ©   (2003-02-05 20:10) [4]

Так наверно лучше будет

uses ShlObj, ActiveX;

function BrCbProc(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
const
_left = 60;
_top = 150;
var
R: TRect;
begin
Result := 0;
if uMsg = BFFM_INITIALIZED then
begin
GetWindowRect(Wnd, R);
SetWindowPos(Wnd, 0, _left, _top, R.Right - R.Left, R.Bottom - R.Top,
SWP_NOZORDER + SWP_NOACTIVATE);
end;
end;

function SelectDirectory(const Caption: string; const Root: WideString;
out Directory: string): Boolean;
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 := BrCbProc;
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;


 
Shadow ©   (2003-02-05 20:20) [5]

Млин, как все сложно - то %)) А узнать Handle и через SetWindowPos никак?


 
Романов Р.В. ©   (2003-02-05 20:25) [6]

Shadow © (05.02.03 20:20)
Наверно можно в отдельном потоке, т.к. это окно показывается модально.



Страницы: 1 вся ветка

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
4-38626
SaperXL
2002-12-31 04:27
2003.02.13
рагистрация своих шрифтов


14-38498
DrumRon
2003-01-23 16:15
2003.02.13
Весь HDD покрылся сыпью...


14-38493
Supreme
2003-01-27 15:22
2003.02.13
Уравнения реакций по химии


3-38024
lutikh
2003-01-25 16:44
2003.02.13
DBF разрушаются...


14-38435
Неуловимый Извращенец
2003-01-25 22:25
2003.02.13
Вред от компьютера