Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir un programa desde un archivo asociado (2) (https://www.clubdelphi.com/foros/showthread.php?t=10835)

soul6301 31-05-2004 00:18:58

Abrir un programa desde un archivo asociado (2)
 
Disculpen por no haberme expresado bien, volveré a intentarlo:

El archivo de texto ya está asociado con mi programa hecho en Delphi. ¿Cómo logro obtener la dirección de ese archivo (incluyendo el nombre del archivo) para luego usarlo y lograr que mi programa lea la información del archivo?
Imaginemos el siguiente caso: Estoy en el explorador de Windows y le doy doble clic al archivo de texto, se abre mi programa pero éste debe leer también la información de dicho archivo.

Gracias por su interés en ayudar.

PD: Esta interrogante me lleva a otra pregunta: ¿Cómo logro asociar un tipo de archivo a mi programa desde un programa hecho en Delphi?... Tomen esta pregunta como una muy diferente a la anterior. Gracias otra vez. :D

roman 31-05-2004 05:26:21

Cita:

Empezado por soul6301
¿Cómo logro asociar un tipo de archivo a mi programa desde un programa hecho en Delphi

Simplemente debes escribir las entradas apropiadas en el registro. Por ejemplo, vamos a suponer que deseas asociar la extensión '.rom' a la aplicación 'RmDesigner.exe'. Deberás crear las siguientes entradas:

Código:

HKCR\.rom
  default value = 'RmDesigner.rom'

HKCR\RmDesigner.rom
  default value = 'Rm Designer master file'

HKCR\RmDesigner.rom\shell\open\command
  default value = 'c:\archivos de programas\roman software\RmDesigner.exe "%1"'

Aquí, HKCR corresponde a HKEY_CLASSES_ROOT. Bajo esta clave se crea la clave '.rom' cuyo valor por defecto es el nombre de la clave que realmente maneja la extensión; en este caso 'RmDesigner.rom', pero puedes usar cualquier identificador que gustes.

La siguiente clave es entonces 'RmDesigner.rom' cuyo valor por defecto será la descripción que desees que aparezca en el explorador; en este caso 'Rm Designer master file'. Si no pones nada, el explorador mostrará simplemente algo como 'Archivo ROM'.

Dentro de esta clave debes crear la clave 'shell\open\command', esto es, la clave 'shell', dentro de ella la clave 'open' y dentro de ella la clave 'command'.

El valor por defecto de la clave 'command' debe contener la ruta al ejecutable; en este caso 'c:\archivos de programas\roman software\RmDesigner.exe "%1"'. El símbolo %1 será sustituído por la línea de comandos, esto es, cuando se ejecute un archivo de extensión 'rom' el explorador pasará el nombre del archivo como parámetro al ejecutable.

Te recomiendo que antes de comenzar a experimentar husmees un poco en el registro para ver cómo funciona esto que te digo para extensiones ya registradas como, por ejemplo, '.txt'. Verás que cada clave tiene otros valores pero por el momento basta con los que te indico.

Para escribir estas claves en el registro desde tu aplicación Delphi puedes usar la clase TRegistry de la unidad Registry. Te pongo aquí un pequeño ejemplo:

Código Delphi [-]
(*
  Este procedimiento registra la extensión Ext con la 
  aplicación AppPath. El parámetro TypeName denota
  la clave del registro que maneja la extensión y el
  parámetro Description corresponde a la descripción
  que se muestra en el explorador de Windows.

  El método OpenKey de TRegistry abre la clave
  especificada. Si ésta no existe la crea.

  El primer parámetro del método WriteString es el
  nombre del identificador que desea escribirse dentro
  de una clave. Si se pasa la cadena vacía, corresponde
  al valor por defecto.
*)
procedure RegisterFileExt(Ext, TypeName, Description, AppPath: String);
var
  Registry: TRegistry;

begin
  Registry := TRegistry.Create;

  try
    Registry.RootKey := HKEY_CLASSES_ROOT;

    Registry.OpenKey(Ext, true);
    Registry.WriteString('', TypeName);
    Registry.CloseKey;

    Registry.OpenKey(TypeName, true);
    Registry.WriteString('', Description);

    Registry.OpenKey('shell\open\command', true);
    Registry.WriteString('', AppPath + ' "%1"');
  finally
    Registry.Free;
  end;
end;

Así, para el ejemplo anterior usarías:

Código Delphi [-]
RegisterFileExt(
  '.rom',
  'RmDesigner.rom',
  'Rm Designer Master file',
  'c:\archivos de programas\roman software\RmDesigner.exe'
);

// Saludos

Tal 27-12-2007 09:52:27

Hola, muy chula la explicación, si me funciona me hará un gran papel pero...
Cita:

Registry.RootKey := HKEY_CLASSES_ROOT;
Que Uses tengo que utlizar para que me reconozca HKEY_CLASSES_ROOT?? ya que ahora mismo no sabe de donde sale Delphi y yo tampoco.

Muchas gracias de antemano.

Tal 27-12-2007 09:55:59

Vale, ya lo he encontrado gracias.
Está en Windows

Tal 27-12-2007 10:12:48

Dudas sobre aplicaciones registradas.
 
Vale, otra cosa.
Bueno dos :D
1º Los archivos que he asociado(.fil) antes claro los editaba con un programa y este les puso su iconito to chulo...como hago yo para que ahora se les ponga mi icono?
2º El archivo bien es cierto que me reconoce mi aplicación y me la abre super bien...pero me pasan otras dos cosas:
1.- Me abre la aplicación sin cargar el archivo...con lo cual no hemos hecho
tampoco nada...
Como hago para decirle que rutina tiene que usar la aplicación cuando
se abre por la llamada de un archivo?
2.- Si ya tengo una aplicación abierta me la vuelve a abrir por cada archivo
que clickeo...
En este caso la pregunta es ¿se puede cargar sobre la misma aplicación abierta sin necesidad de que se me habra otra?
Me imagino que con la respuesta anterior se podrá solucionar esta también.
Muchas gracias por su ayuda y su atención y disculpen las molestias.
Un saludo.

Lepe 27-12-2007 14:08:00

Si usas el regedit de windows y vas a la clave de registro, verás como se hace lo del icono (creo tienes que escribir una clave de registro más).

1 - ¿has programado algo para que lo abra? - Revisa la ayuda de "CommandLine" de delphi.

2 - Para abrir en la misma instancia, deberás programar en tu aplicación una opción que detecte varias instancias del programa. La JVCL de delphi tiene un componente. Por código también se puede hacer, roman tiene un componente en su web (UIApp en la sección de componentes).


Saludos

Tal 27-12-2007 16:47:58

OK, muchas gracias.


La franja horaria es GMT +2. Ahora son las 08:57:58.

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