![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времяни суток. В своей программе использую диолог выбора каталога. Нужно сделать чтоб она открывалась на последнем ранее выбраном каталоге. Для этого перед запуском диалога в pidlRoot эту папку(путь) указать.
Как мне в pidlRoot поместить строку String. Я так понял, что нужно bi.pidlRoot := PIDL; в место PIDL ввести 'C:\Program Files' Код:
uses ShlObj;
{....}
procedure CallBack(wnd: hWnd; uMsg: UINT; lParam, lpData: LParam) stdcall;
begin
SendMessage(wnd, BFFM_ENABLEOK, 0, 1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
bi: TBrowseInfo;
s: PChar;
PIDL, ResPIDL: PItemIDList;
begin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, PIDL);
s := StrAlloc(128);
bi.hwndOwner := Form1.Handle;
bi.pszDisplayName := s;
bi.lpszTitle := 'Выбор прапки';
bi.pidlRoot := PIDL;
bi.lpfn := addr(CallBack);
{bi.ulFlags флаги, которые задают режим отображения диалога:
BIF_BROWSEFORCOMPUTER - Возвратить только компьютеры. Если пользователь выбрал что-то отличное от компьютеров, то кнопка OK останется серой.
BIF_BROWSEFORPRINTER - Возвратить только принтеры. Если пользователь выбрал что-
то отличное от принтеров, то кнопка OK останется серой.
BIF_RETURNONLYFSDIRS - Возвратить только папки файловой системы. Если пользователь выберет папки, которые не являются частью файловой системы, то кнопка OK останется серой. Это необходимо для того если ваша программа не работает с виртуальными папками вроде "Панель управления".
BIF_BROWSEINCLUDEFILES - Диалог просмотра будет отображать файлы вместе с директориями.
BIF_DONTGOBELOWDOMAIN - Не включать сетевые папки Доменного уровня ниже, чем в TreeView контроле.
BIF_RETURNFSANCESTORS - В качестве выбора допустимы только объекты, представленные в файловой системе.
BIF_STATUSTEXT - Включает область статуса в блок диалога. Функция может установить текст посылая сообщения блоку диалога.
BIF_EDITBOX - В диалоговом окне будет присутствовать строка редактирования, таким образом пользователь может набрать имя элемента.
BIF_VALIDATE - Если пользователь введёт неверное имя в строке редактирования, то диалоговое окно вызовет функцию обратного вызова приложения по сообщению BFFM_VALIDATEFAILED.}
ResPidl := SHBrowseForFolder(BI);
SHGetPathFromIDList(ResPidl, s);
Form1.Caption := s;
end; |
|
#2
|
||||
|
||||
|
см. папские демки:
Код:
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;конкретно: Код:
RootItemIDList := nil;
if Root <> '' then
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
POleStr(Root), Eaten, RootItemIDList, Flags);
end;
with BrowseInfo do
begin
...
pidlRoot := RootItemIDList; |
|
#3
|
|||
|
|||
|
uses -- Что добавить?
Ругается на ShellMalloc: IMalloc; Buffer := ShellMalloc.Alloc(MAX_PATH); POleStr(Root), Eaten, RootItemIDList, Flags); lpfn := SelectDirCB; ShellMalloc.Free(Buffer); [DCC Error] Unit1.pas(33): E2003 Undeclared identifier: 'IMalloc' |
|
#4
|
||||
|
||||
|
так там же, в папских демках посмотри: ActiveX
|
|
#5
|
|||
|
|||
|
А где эти--- папские демки.
Поиск по сайту ничего не дал. |
|
#6
|
||||
|
||||
|
FileCtrl.pas
|
|
#7
|
|||
|
|||
|
Добавил в uses FileCtrl, ничего не дало :
[DCC Error] Unit1.pas(33): E2003 Undeclared identifier: 'IMalloc' [DCC Error] Unit1.pas(41): E2033 Types of actual and formal var parameters must be identical [DCC Error] Unit1.pas(41): E2015 Operator not applicable to this operand type [DCC Error] Unit1.pas(43): E2066 Missing operator or semicolon [DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'POleStr' [DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'SelectDirCB' |
|
#8
|
||||
|
||||
|
а ты добавь ActiveX !!!
|
|
#9
|
|||
|
|||
|
Спасибо помогло, осталось вроде одна:
lpfn := SelectDirCB; [DCC Error] Unit1.pas(61): E2003 Undeclared identifier: 'SelectDirCB' |
|
#10
|
||||
|
||||
|
так замени эту строку на свою
|
|
#11
|
|||
|
|||
|
Извини, объясни для тупого.
lpfn := SelectDirCB; ------ что это, для чего. ![]() |
|
#12
|
||||
|
||||
|
назначает функцию обратного вызова. в твоем примера она выглядит как:
Код:
bi.lpfn := addr(CallBack); |
|
#13
|
|||
|
|||
|
ок понятненько. А для вызова функции.
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string): Boolean; SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean; а тут что ок понятненько. А для вызова функции. function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string): Boolean; SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean; а тут что ок понятненько. А для вызова функции. function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string): Boolean; SelectDirectory('имя окна ', (const Root: WideString), 'C:/'): Boolean; Root- а тут что Последний раз редактировалось M.A.D.M.A.N., 08.01.2014 в 16:09. |
|
#14
|
||||
|
||||
|
параметры:
-заголовок окна -корневой каталог -переменная типа Строка, в которой возвращается результат в файле справки все описано. http://www.delphisources.ru/forum/sh...ad.php?t=25573 Последний раз редактировалось M.A.D.M.A.N., 08.01.2014 в 16:10. |
|
#15
|
||||
|
||||
|
Гайд для новичка:
1) Берем в руки мышь. 2) Нажимаем на левый край слова "SelectDirectory". 3) Тянем до правого края. Слово выделяется. 4) Жмем Ctrl+C. 5) Заходим на http://www.google.ru. 6) Нажимаем Ctrl+V. 7) Нажимаем Enter. 8) Нажимаем на первую понравившуюся ссылку. 9) Читаем описание, где все параметры расписаны подробнейшим образом. |