Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-70182
Avreliy
2003-05-03 17:25
2003.05.22
Отказ работы ограничения NOT NULL!


1-70307
Dennis S
2003-05-06 17:31
2003.05.22
Точный Timer нужен...


4-70555
Axis_of_Evil
2003-03-21 15:42
2003.05.22
FindEditEx


1-70301
StarCon
2003-05-13 09:02
2003.05.22
Lotus Notes


7-70548
besenok
2003-03-24 11:36
2003.05.22
Переменные среды окружения