Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Стандартные диалоги - Указание "специальной" папки   Найти похожие ветки 

 
-=GUEST=-   (2005-08-01 20:41) [0]

Есть стандартные диалоговые окна, типа TOpenDialog или TSaveDialog.

Как в качестве папки указать "виртуальную" папку, типа "Рабочий стол", "Мои документы" и т.д. PIDL этой папки имеется.

А точнее как указать папку не путем, а PIDL"ом.

Т.е. как сообщение CDM_GETFOLDERIDLIST, только наоборот.


 
Ученик   (2005-08-01 22:48) [1]



uses
 ActiveX, ShlObj, ShellApi;

function ShellFolderName(aCSIDL: Integer) : string;
var
 IShellMalloc   : IMalloc;
 IDesktopFolder : IShellFolder;
 ItemIDList: PItemIDList;
 StrRet: TStrRet;
begin
 Result := "";
 if (ShGetMalloc(IShellMalloc) = S_OK) then try
   if SHGetDesktopFolder(IDesktopFolder) = NOERROR then try
     if SHGetSpecialFolderLocation(0, aCSIDL, ItemIDList) = NOERROR then try
       if IDesktopFolder.GetDisplayNameOf(ItemIDList, SHGDN_FORPARSING, StrRet) = NOERROR then begin
         case StrRet.uType of
           STRRET_WSTR:   Result := WideCharToString(StrRet.pOleStr);
           STRRET_OFFSET: Result := PChar(UINT(ItemIDList) + StrRet.uOffset);
           STRRET_CSTR:   Result := StrRet.cStr;
         end
       end
     finally
       IShellMalloc.Free(ItemIDList)
     end
   finally
     IDesktopFolder := nil
   end
 finally
   IShellMalloc := nil
 end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 OpenDialog1.InitialDir := ShellFolderName(CSIDL_DRIVES);
 OpenDialog1.Execute
end;


 
-=GUEST=-   (2005-08-02 10:50) [2]

Не выходит (Windows 98, Delphi 5)

OpenDialog1.InitialDir := ShellFolderName(CSIDL_DRIVES);
ShellFolderName(CSIDL_DRIVES) возвращает "Мой компьютер"
А TOpenDialog открывается в стандартной папке (в Win98 это "Мои документы").

Т.е. передача пути строкой не подходит для папок кот. не имеют пути в файловой системе (например папка "Удаленный доступ").

Такие пути в идеале нужно передавать через ItemIDList: PItemIDList.

Как я писал выше для получения PItemIDList текущей папки есть сообщение CDM_GETFOLDERIDLIST, кот можно послать окну TOpenDialog. А вот обратное действие - задать текущую папку - нету.


 
wal ©   (2005-08-02 11:00) [3]

А ему (диалогу) GUID подсунуть?


 
Ученик   (2005-08-04 07:20) [4]

>-=GUEST=-   (02.08.05 10:50) [2]
Для Windows 98 можно заменить

if IDesktopFolder.GetDisplayNameOf(ItemIDList, SHGDN_FORPARSING, StrRet) = NOERROR then begin  
...
end

на
       if SHGetDataFromIDList (IDesktopFolder, ItemIDList, SHGDFIL_DESCRIPTIONID,
                               @SHDescriptionID, SizeOf(SHDescriptionID)) = NOERROR then
         Result := "::" + GuidToString (SHDescriptionID.Id);

// SHDescriptionID: TSHDescriptionID;


 
Ботвин Дмитрий   (2005-08-04 11:27) [5]

Для рабочего стола:

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( Handle, CSIDL_DESKTOP, PIDL );
  s := StrAlloc(128);
  bi.hwndOwner := Handle;
  bi.pszDisplayName := s;
  bi.lpszTitle := "Выберите прапку";
  bi.pidlRoot := PIDL;
  bi.lpfn := addr( CallBack );
  ResPidl :=  SHBrowseForFolder ( bi );
  SHGetPathFromIDList( ResPidl, s );
  Caption := s;
end;

Для остальных папок, я думаю, сам переделаещь, изменив выделенный
параметр.


 
-=GUEST=-   (2005-08-04 12:41) [6]

> Ботвин Дмитрий   (04.08.05 11:27) [5]
Да, только нужно эту папку отурыть в окне выбора файлов (TOpenDialog), а не в окне выбора директорий


 
-=GUEST=-   (2005-08-04 13:20) [7]

> Ученик   (04.08.05 07:20) [4]
Работает.
В результате получаем строчку, что-то типа
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
и открывается именно папка "Мой компьютер"
т.е. нужно "преобразовать" TItemlDList в GUID-строку.

Можно ли как-то при уже открытой TOpenDialog выбрать папку.
Т.е. будет модифицированный TOpenDialog (как TOpenPictureDialog) c кнопкой с выпадающим меню. Пользователь в меню может выбрать наиболее часто используемые папки.



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
4-1123568577
_sulent
2005-08-09 10:22
2005.10.02
NumLock, CapsLock


6-1117980153
Shock
2005-06-05 18:02
2005.10.02
TClientSocket из DLL


1-1126035114
Yura32
2005-09-06 23:31
2005.10.02
XP Button


14-1126199157
№0028
2005-09-08 21:05
2005.10.02
Реестр


8-1116226738
anat
2005-05-16 10:58
2005.10.02
OpenGl need HELP