![]() |
|
|
#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.
Я просто добавил еще один вариант, чтобы вроде как тема была более полная. Вдруг кому-о пригодится. Мало ли. :-) |