Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear Grupo en el menú de inicio (https://www.clubdelphi.com/foros/showthread.php?t=47627)

jymy788 03-09-2007 15:57:16

Crear Grupo en el menú de inicio
 
Buenas a tod@s los foreros.

Tengo una problema que no consigo solucionar.

Tengo un instalable de mi aplicación realizado con Delphi 7 y quiero crear en Inicio - Todos los programas mi grupo con el nombre de mi aplicación

Me pueden echar un cable?

gracias de antemano

dec 03-09-2007 16:24:38

Hola,

Tienes que procurar la ruta del menú de inicio del usuario "en sesión", o la ruta del menú de inicio para "todos los usuarios". Dentro de alguno de esos directorios has de situar las carpetas y accesos directos que consideres necesarios. Adjunto código fuente para obtener la ruta de los dos directorios mencionados.

Código Delphi [-]
unit USpecialFolder;

interface

uses
  Windows;

const
  CSIDL_STARTMENU = $000b;
  CSIDL_COMMON_STARTMENU = $0016;

function GetSpecialFolder(csidl: integer): string;
function SHGetSpecialFolderPath(Handle: HWND; Path:
 PChar; Folder: Integer; Create: Bool): BOOL; stdcall;

implementation

uses
  SysUtils;

function SHGetSpecialFolderPath; external
 'Shell32.dll' Name 'SHGetSpecialFolderPathA';

function GetSpecialFolder(csidl: integer): string;
var
  buffer: array[0..MAX_PATH] of char;
begin
  result := EmptyStr;
  if SHGetSpecialFolderPath(GetActiveWindow(),buffer,csidl,false) = true then
    result := IncludeTrailingPathDelimiter(buffer);
end;

end.

Con esta otra función puedes crear un acceso directo a una carpeta o archivo:

Código Delphi [-]
uses
  ShlObj, ActiveX, ComObj;

(* Basada en codigo de Zarko Gajic:
   http://delphi.about.com/od/windowssh...create_lnk.htm
*)
function AccesoDirecto(nombre, descripcion, directorio, 
 rutaArchivo, argumentos: string): boolean;
resourcestring
  rsExtLnk = '.lnk';
var
   IObject: IUnknown;
   ISLink: IShellLink;
   IPFile: IPersistFile;
   nombreAcceso: WideString;
begin
   IObject := CreateComObject(CLSID_ShellLink);
   ISLink := (IObject as IShellLink);
   IPFile := (IObject as IPersistFile);
   with ISLink do begin
     //SetHotkey();
     SetShowCmd(SW_SHOWNORMAL);
     SetPath(PChar(rutaArchivo));
     SetArguments(PChar(argumentos));
     SetDescription(PChar(descripcion));
     SetWorkingDirectory(PChar(ExtractFilePath(rutaArchivo)));
   end;
   directorio := IncludeTrailingPathDelimiter(directorio);
   nombreAcceso := directorio+nombre+rsExtLnk;
   result := (IPFile.Save(PWChar(nombreAcceso), false) = S_OK);
end;

jymy788 03-09-2007 16:37:39

Gracias dec, acababa de encontrar algo similiar.

Lo que pasa es que una vez que tengo el path del menú de inicio no consigo crear un grupo y un acceso directo.

Estoy probando con CreateDirectory en esa ruta pero nada.

Algún consejo?

dec 03-09-2007 16:42:03

Hola,

El "grupo" no es más que un directorio... así que habría que ver cómo es que no puedes usar "CreateDirectory()", como pensabas. Respecto del acceso directo... acabo de editar mi anterior mensaje, no sé si te ha dado tiempo a ver la última función que he añadido, que te permitirá crear en un directorio dado (el grupo, el directorio que crees en el menú de inicio) accesos directos a archivos y/o carpetas.

jymy788 03-09-2007 16:47:34

desde luego es curioso lo siguiente:

Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
var
   IObject : IUnknown;
   ISLink : IShellLink;
   IPFile : IPersistFile;
   PIDL : PItemIDList;
   InFolder : array[0..MAX_PATH] of Char;
   TargetName : String;
   LinkName : WideString;
   Camino, probando: String;
begin
   TargetName := 'c:\windows\calc.exe';
   {Use TargetName:=ParamStr(0) which
   returns the path and file name of the
   executing program to create a link to your
   Application}
   IObject := CreateComObject(CLSID_ShellLink) ;
   ISLink := IObject as IShellLink;
   IPFile := IObject as IPersistFile;
   with ISLink do
   begin
     SetPath(pChar(TargetName)) ;
     SetWorkingDirectory(pChar(ExtractFilePath(TargetName))) ;
   end;
   // if we want to place a link on the Desktop
   SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL) ;
   SHGetPathFromIDList(PIDL, InFolder) ;
   {
    or if we want a link to appear in
    some other, not-so-special, folder:
    InFolder := 'c:\SomeFolder'
   }
//   LinkName := InFolder + '\Delphi Created Link.lnk';
//   IPFile.Save(PWChar(LinkName), false) ;
   SetLength(Camino, MAX_PATH+1);
   SHGetSpecialFolderPath(GetActiveWindow(), PChar(Camino), CSIDL_STARTMENU, False);
   ShowMessage('El menú inicio está en : ' + Camino);
   CreateDirectory(Camino + '\Programas\KK',0);
end;

El showmessage me devuelve bien la ruta pero oh maravilla, el create directory no me crea el puñetero menu

dec 03-09-2007 16:51:19

Hola,

No estoy seguro, pero, "CreateDirectory" no crea varios directorios de una vez... puedes probar a usar "ForceDirectories"... Y, por otro lado, al código que copias parece que le falta algo, puesto que trabajas con un acceso directo... pero no es hasta el final que creas el directorio... donde va a ir el acceso directo... pero luego de crear el directorio el código acaba ahí... bueno. Esto es lo de menos.

El caso es que el problema que has topado puede ser el que "CreateDirectory" no puede crear varios directorios a un tiempo. Una solución puede ser la mencionada función "ForceDirectories".

jymy788 03-09-2007 16:55:24

Pero como soy tan burro !!!

a ver, borra lo que he dicho antes.

Si utilizo tu función GetSpecialFolder todo funciona correctamente.

Ale, voy a trastear un poco más.

Mil gracias

jymy788 03-09-2007 17:00:51

oye, me puedes poner un ejemplito del uso de la función AccesoDirecto

muchas gracias de antemano

dec 03-09-2007 17:06:45

Hola,

Código Delphi [-]
begin
  AccesoDirecto(
    'Bloc de notas',           // Nombre del acceso directo
    'Abre el bloc de notas',   // Descripción (Hint, Tip) del acceso directo
    'C:\',                     // Directorio donde se creará el acceso directo
    'C:\windows\notepad.exe',  // Ruta del archivo a que apuntará el acceso
    ''                         // Argumentos a pasar al archivo (ninguno)
  );
end;

Con lo anterior crearíamos un acceso directo al "Bloc de notas" en la raíz de la unidad "C:\".


La franja horaria es GMT +2. Ahora son las 18:03:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi