|
#1
|
|||
|
|||
Пару вопросов
Здравствуйте уважаемые программисты. Создавать несколько тем не буду, но задам ряд вопросов, по которым прошу ответить. Вот ряд вопросов:
1. Как открыть "Мой Компьютер" допустим через кнопку; 2. -|-|- "Мои Документы" -|-|- 3. -|-|- "Рабочий Стол" -|-|- (в виде папки) 4. Придать в Popup Menu у любых файлов. Например при клике на файл правой кнопки мыши там в списке есть Метка моей программы. При выборе (клике на неё) откывалось бы мне нужное окно и там можно было бы выполнить нужное мне действие с файлом выбранного из SubMenu из списка. (К примеру Unlocker - кто знает)... Некоторые вопросы не по теме но все-равно прошу ответить! Заранее спасибо! |
#2
|
|||
|
|||
1,2,3 - Что занчит "открыть".
4. ShellExtention. пример можно глянуть в демосах Дельфей. |
#3
|
|||
|
|||
Цитата:
Вот то и значит: Открыть. Вы никогда не открывали "Мой Компьютер" например? или "Мои Документы"? вот надо осуществить то же открытие только программно... |
#4
|
|||
|
|||
Не надо наглеть. Это во первых.
Через SHGetSpecialFolder получаешь путь и через ShellExecute открываешь. |
#5
|
|||
|
|||
Цитата:
и два: по поводу ShellExecute - путь на всех машинах разный, взависимости от имени пользователя и диск на котором установлен Windows... про SHGetSpecialFolder не слышал вовсе и какие параметры и как работает представления не имею.. |
#6
|
|||
|
|||
а win32 хелп посмотреть не судьба?
на крайний случай www.msdn.com Вот этот юнит был написн в свое время минут за 15 по msdn: Код:
unit SysFolders; interface uses Windows, SysUtils, ShlObj; function GetUserAppDataFolderPath : String; function GetUserMyDocumentsFolderPath : String; function GetUserFavoritesFolderPath : String; function GetCommonAppDataFolderPath : String; function GetWindowsFolerPath : String; function GetTempFolderPath : String; implementation const {$EXTERNALSYM CSIDL_COMMON_APPDATA} CSIDL_COMMON_APPDATA = $0023; function GetSpecialFolderPath(CSIDL : Integer) : String; var Path : PChar; begin Result := ''; GetMem(Path,MAX_PATH); Try If Not SHGetSpecialFolderPath(0,Path,CSIDL,False) Then Raise Exception.Create('Shell function SHGetSpecialFolderPath fails.'); Result := Trim(StrPas(Path)); If Result = '' Then Raise Exception.Create('Shell function SHGetSpecialFolderPath return an empty string.'); Result := IncludeTrailingPathDelimiter(Result); Finally FreeMem(Path,MAX_PATH); End; end; function GetTempFolderPath : String; var Path : PChar; begin Result := ExtractFilePath(ParamStr(0)); GetMem(Path,MAX_PATH); Try If GetTempPath(MAX_PATH,Path) <> 0 Then Begin Result := Trim(StrPas(Path)); Result := IncludeTrailingPathDelimiter(Result); End; Finally FreeMem(Path,MAX_PATH); End; end; function GetWindowsFolerPath : String; var Path : PChar; begin Result := ExtractFilePath(ParamStr(0)); GetMem(Path,MAX_PATH); Try If GetWindowsDirectory(Path, MAX_PATH) <> 0 Then Begin Result := Trim(StrPas(Path)); Result := IncludeTrailingPathDelimiter(Result); End; Finally FreeMem(Path,MAX_PATH); End; end; function GetUserAppDataFolderPath : String; begin Result := GetSpecialFolderPath(CSIDL_APPDATA); end; function GetUserMyDocumentsFolderPath : String; begin Result := GetSpecialFolderPath(CSIDL_PERSONAL); end; function GetUserFavoritesFolderPath : String; begin Result := GetSpecialFolderPath(CSIDL_FAVORITES); end; function GetCommonAppDataFolderPath : String; begin Result := GetSpecialFolderPath(CSIDL_COMMON_APPDATA); end; end. |
#7
|
||||
|
||||
Код:
uses ShellApi; procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, Pchar('Open'), Pchar('программа или объект (CLSID)' ) , Pchar ('параметр') , '' ,SW_SHOWNORMAL); end; например: procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, Pchar('Open'), Pchar('::{450D8FBA-AD25-11D0-98A8-0800361B1103}' ) , Pchar ('') , '' ,SW_SHOWNORMAL); end; (открытие моих документов) или: procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Application.Handle, Pchar('Open'), Pchar('::{20D04FE0-3AEA-1069-A2D8-08002B30309D}' ) , Pchar ('') , '' ,SW_SHOWNORMAL); end; (открывает Мой компьютер) Последний раз редактировалось Admin, 09.08.2009 в 20:19. |
#8
|
|||
|
|||
Еще один вариант реализации функци lmikle <GetSpecialFolderPath>
Код:
Uses ActiveX, ShlObj, ... ... function Get_Path_To_SpecialFolder(Handle : THandle; CSIDL : cardinal) : string; //Получить полный путь к соотв.системной папке //текущего Пользователя Windows. //Взято с http://www.swissdelphicenter.ch/en/showcode.php?id=233 var Allocator: IMalloc; SpecialDir: PItemIdList; FBuf: array[0..MAX_PATH] of Char; PerDir: string; begin Result:=''; if SHGetMalloc(Allocator) = NOERROR then begin SHGetSpecialFolderLocation(Handle, CSIDL, SpecialDir); SHGetPathFromIDList(SpecialDir, @FBuf[0]); Allocator.Free(SpecialDir); Result:=string(FBuf); end; end; А это весь список констант (определен в модуле ShlObj) : Код:
CSIDL_DESKTOP = $0000; CSIDL_INTERNET = $0001; CSIDL_PROGRAMS = $0002; CSIDL_CONTROLS = $0003; CSIDL_PRINTERS = $0004; CSIDL_PERSONAL = $0005; //Мои документы CSIDL_FAVORITES = $0006; CSIDL_STARTUP = $0007; CSIDL_RECENT = $0008; CSIDL_SENDTO = $0009; CSIDL_BITBUCKET = $000a; CSIDL_STARTMENU = $000b; CSIDL_DESKTOPDIRECTORY = $0010; CSIDL_DRIVES = $0011; CSIDL_NETWORK = $0012; CSIDL_NETHOOD = $0013; CSIDL_FONTS = $0014; CSIDL_TEMPLATES = $0015; CSIDL_COMMON_STARTMENU = $0016; CSIDL_COMMON_PROGRAMS = $0017; CSIDL_COMMON_STARTUP = $0018; CSIDL_COMMON_DESKTOPDIRECTORY = $0019; CSIDL_APPDATA = $001a; CSIDL_PRINTHOOD = $001b; CSIDL_ALTSTARTUP = $001d; // DBCS CSIDL_COMMON_ALTSTARTUP = $001e; // DBCS CSIDL_COMMON_FAVORITES = $001f; CSIDL_INTERNET_CACHE = $0020; CSIDL_COOKIES = $0021; CSIDL_HISTORY = $0022; |
#9
|
||||
|
||||
админ, что значит "Admin: Пользуемся тегами!
Последний раз редактировалось Admin, 09.08.2009 в 20:19." ? |
#10
|
|||
|
|||
Это значит, что код был написан обычным текстом. Модератор исправил это и попросил пользоваться специальными кодами (то бишь тегами) для оформления своих сообщений (для повышения их читабельности и удобства восприятия). Если в дальнейшем пожелания модераторов не будут учтены, то пользователь будет переведен в режим "только чтение".
|
#11
|
|||
|
|||
Цитата:
Ну, я и не претендовал на непогрешимость. Когда мне потребовалось получить некоторый набор системных папок, я просто сел и написал функцию, которая для меня удобна. Естественно, там далеко не все папки, которые можно вытащить через API. Только те, которые были мне нужны на тот момент. Но если дружить с головой, руками и гуглом, то остальные добавляются очень просто |
#12
|
|||
|
|||
Sorry.
Я просто добавил еще один вариант, чтобы вроде как тема была более полная. Вдруг кому-о пригодится. Мало ли. :-) |