Главная страница
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.035 c
1-1126526379
Lamka
2005-09-12 15:59
2005.10.02
Присвоение объектов


3-1123927785
jiny
2005-08-13 14:09
2005.10.02
Проблема с вычислением оптимальной партии в ХП


1-1126008318
Квэнди
2005-09-06 16:05
2005.10.02
Расчет угла поляризации


4-1123454145
Makhanev A.S.
2005-08-08 02:35
2005.10.02
Как получить путь к windows на удаленной машине...


4-1116443316
Nik_vr
2005-05-18 23:08
2005.10.02
Как проверит, открыт ли лоток CD-ROM?