![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Диалог выбора папки. [D7, XP]
AlexanderMS © (2006-07-09 17:39:00)Очень нужен, а в Delphi нет такого компонента. Вроде бы диалог стандартный, но на палитре "Dialogs" отсутствует.
Leonid Troyanovsky (2006-07-09 23:30:00) [21]Удалено модератором
Шпиён (2006-07-09 23:27:00) [22]Удалено модератором
Leonid Troyanovsky (2006-07-09 23:23:00) [23]Удалено модератором
Пусик (2006-07-09 23:20:00) [24]Удалено модератором
Шпиён (2006-07-09 23:17:00) [25]Удалено модератором
Leonid Troyanovsky (2006-07-09 23:14:00) [26]Удалено модератором
Шпиён (2006-07-09 22:32:00) [27]
> Юрий Зотов © (09.07.06 22:24) [15]
Я этот "велосипед" тоже как-то изобретал... сейчас ленивый стал, сначала готовый ищу -)
Ps
Правда, до сих пор на нем и "езжу". По причине Пусик © (09.07.06 22:08) [12]
Юрий Зотов (2006-07-09 22:24:00) [28]> Шпиён (09.07.06 22:21) [14]
Извините, я просто подумал, что смайлик будет излишним.
:о)
Шпиён (2006-07-09 22:21:00) [29]
> Юрий Зотов © (09.07.06 22:17) [13]
> Есть подозрение, что через SHBrowseForFolder работают ОБЕ
> функции-оболочки
А чего тут подозревать, так и есть -)))
Взято из FileCtrl.pas:
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;
Юрий Зотов (2006-07-09 22:17:00) [30]> Пусик © (09.07.06 22:07) [11]
Есть подозрение, что через SHBrowseForFolder работают ОБЕ функции-оболочки: и из vingrad, и из справки. Еще есть подозрение, что входные параметры у них совершенно одинаковые.
Это, естественно, камешек не в Ваш огород, а в огород любителей изобретать велосипеды. Недавно на работе, разбираясь в незнакомом проекте, встречаю в нем вызов некоей самописной функции Up. По контексту кода понятно, что она должна преобразовать строку в верхний регистр - но почему же, думаю, не использована стандартная AnsiUpperCase? Может, эта самая Up еще что-то делает? Надо разобраться.
Лезу в код - и вижу:
function Up(S: string): string; // причем именно так, даже без const
begin
Result := AnsiUpperCase(S)
end;
Не слабый маразм, да?
Пусик (2006-07-09 22:08:00) [31]Ну и флагами самой можно управлять.
Пусик (2006-07-09 22:07:00) [32]
> Юрий Зотов © (09.07.06 21:59) [10]
Ну хочется человеку SHBrowseForFolder... Тем более, что в ней вро бы опций несколько побольше...
Юрий Зотов (2006-07-09 21:59:00) [33]> Пусик © (09.07.06 21:51) [9]
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean;
-----------------
Взято из справки.
:о)
Пусик (2006-07-09 21:51:00) [34]
function SelectDirectory(Title: String; Root: WideString): String;
Function PathToID(Path: String): PItemIDList;
var
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(0, nil, StringToOleStr(Path), Eaten, Result, Flags);
end;
var
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 := Application.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
BrowseInfo.lpszTitle := PChar(Title);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
BrowseInfo.pidlRoot:= PathToID(Root);
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
Result:= TempPath;
GlobalFreePtr(lpItemID);
end;
end;
-----------------
Взято с vingrad.ru
PSPF2003 (2006-07-09 21:03:00) [35]Могу компонент дать
Шпиён (2006-07-09 20:58:00) [36]
> easy © (09.07.06 19:41) [6]
Delphi FAQ collectorХорошо сделано, respect -)
easy (2006-07-09 19:41:00) [37]http://dfc.com.ru/?sid=2&id=8&itemid=13
Джо (2006-07-09 18:29:00) [38]> [3] AlexanderMS © (09.07.06 18:04)
> Sorry, я хотел другой: где в виде дерева и без файлов
Функций SelectDirectory — две.
Шпиён (2006-07-09 18:15:00) [39]
> где в виде дерева и без файлов.
Это не тот, который на палитре Win3.1 ?
AlexanderMS (2006-07-09 18:04:00) [40]Sorry, я хотел другой: где в виде дерева и без файлов. Да такой и самому можно сделать.