![]() |
|
|
Регистрация | << Правила форума >> | 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
Пишу программы за еду. __________________ |