Текущий архив: 2003.05.22;
Скачать: CL | DM;
Вниз
Диалог выбора директории. Найти похожие ветки
← →
Dankin © (2003-05-11 13:33) [0]Подскажите пожалуйсто, млжно ли как-нибудь вывести стандартный Виндовый диалог выбора директории или приспособить OpenDialog под выбор директории а не вайлов. Или все-таки придеться кропать свой???
Заранее спасибо.
← →
Song © (2003-05-11 13:43) [1]SelectDirectory()
← →
Dankin © (2003-05-11 14:21) [2]С SelectDirectory() странная штука творится, он почему-то появляется в правом нижнем углу. Вот интерестно это баг моей системы или фича функции? Может с этим можно как-нить побороться или простых способов нет и надо FileCtrl переписывать?
← →
DVM © (2003-05-11 14:25) [3]
> Dankin ©
Фича это. Может помогут: MoveWindow, SetWindowPos? Применить их сразу после того, как окно появится на экране (факт появления нужно отлавливать).
← →
Dankin © (2003-05-11 14:34) [4]DVM - а наколочку как эго отловить не подкинеш. А то вроде сразу после вызова оного ничего сделать не получается?
← →
DVM © (2003-05-11 14:51) [5]
> Dankin ©
Есть вариант получше. Может лучше будет создать свое собственное окно, по виду похожее на то что требуется (ShellTreeView). Оформить его в виде компонента, поместить на закладку Dialogs и пользоваться? :)
Но если очень хочется со стандартным диалогом, то:
1. Вариант с установкой хука.
2. Таймер + Findwindow (по таймеру перебираешь окна и если среди них есть нужное то двигаешь).
Но у обоих способов есть недостатки: окно будет "дергаться".
← →
Dankin © (2003-05-11 15:00) [6]Чтож, наверное придеться сделать свой компонентик.
А вообще странно я отыскал это в Filectrl:
D.ScaleBy(Screen.PixelsPerInch, 96);
D.FileList.ParentFont := True;
D.Left := (Screen.Width div 2) - (D.Width div 2);
D.Top := (Screen.Height div 2) - (D.Height div 2);
D.FileList.Font.Color := clGrayText;
Поидеи должно работать, НО!!!!!!????????????
В любом случае огромное спасибо за помощь
← →
Романов Р.В. © (2003-05-11 15:28) [7]
> Dankin © (11.05.03 14:21)
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;
← →
dtrn (2003-05-11 17:59) [8]uses ShlObj,ActiveX;
function MyBrowseFolder:string;
var
SelectionPIDL: PItemIDList;
BrowseInfo: TBrowseInfo;
ShellAllocator: IMalloc;
PathBuffer: array[0..MAX_PATH] of Char;
begin
// simplest implementation of BrowseForFolder
// to get more information refer to MSDN Library
// or Check Brad Stower"s excellent site
// www.delphifreestuff.com
ZeroMemory(@BrowseInfo, SizeOf(BrowseInfo));
BrowseInfo.hwndOwner := Application.Handle;
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
CoInitialize(nil);
try
SelectionPIDL := ShBrowseForFolder(BrowseInfo);
if SelectionPIDL <> nil then
try
ZeroMemory(@PathBuffer, SizeOf(PathBuffer));
if not SHGetPathFromIDList(SelectionPIDL, @PathBuffer) then
begin
beep;
exit;
end;
Result:=StrPas(@PathBuffer[0]);
finally
if SHGetMalloc(ShellAllocator) = 0 then
begin
ShellAllocator.Free(SelectionPIDL);
ShellAllocator := nil;
end;
end;
finally
CoUnInitialize;
end;
end;
← →
lipskiy © (2003-05-11 23:31) [9]Ставишь RX и юзаешь оттуда BrowseDirectory.
Все выглядит как надо и работает правильно.
Страницы: 1 вся ветка
Текущий архив: 2003.05.22;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.014 c