Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como abrir un archivo con mi aplicacion. (parametros de ejectutable) (https://www.clubdelphi.com/foros/showthread.php?t=50408)

JuanErasmo 16-11-2007 20:18:20

Como abrir un archivo con mi aplicacion. (parametros de ejectutable)
 
Buenas tardes amigos,.
Lo que pretendo es agregarle a cada archivo en el menu contextual ,
"abrir con" mi programa, , eso ya se como se hace,
pero en mi programa tiene que recibir los parametros,
para cuando se ejecute, abra efectivamente el archivo que lo llamo y lo cargue.

Mi programa recibe un archivo jpg, ,,,como hago para pasarle el parametro que lo llamo?
es decir, si la foto1.jpg, lo llamo, entonces, mi programa deberia cargar la foto1 al iniciarse...,,,,,,
Alguien sabe como se puede hacer esto???
Muchas Gracias!

dec 16-11-2007 20:23:50

Hola,

Si hablamos de Delphi puedes contar con algunas variables, donde recibes siempre la información que se pasa al programa por la línea de comandos, al ser ejecutado.

Si no recuerdo mal tenemos "ParamsCount", que te indica el número de parámetros que se han pasado a tu ejecutable. Y luego contamos con la función "ParamStr", que, pasándole el índice de un parámetro, te retorna su valor.

En "ParamStr(0)" siempre, y digo, siempre, tendrás la ruta completa de tu ejecutable. Y, a partir de ahí... el resto de parámetros. Por ejemplo:

Código:

start C:\miprograma.exe "C:\archivo.jpg"
Suponiendo esa línea de comandos, "miprograma.exe" recibiría dos parámetros, empezando a contar desde cero, el primero, "C:\miprograma.exe", y, el segundo, "C:\archivo.jpg", y así sucesivamente.

JuanErasmo 16-11-2007 20:26:33

Aplica esto si le dan doble click a un archivo jpg?
Como consulto ParamStr?
podrias mostrarme un ejemplo sencillo?

Muchas Gracias!

jhonny 16-11-2007 20:28:49

Al abrir el ejecutable como tu dices, es como si hicieras esto, por ejemplo:

Cita:

MiEjecutables.Exe C:\MiImagen.JPG
En ese orden de ideas vemos como la ruta de la imagen esta siendo entregada como parametro, entonces...

La función ParamStr te devuelve ese valor si le pasas como parametro el 1 :), asi por ejemplo:
Código Delphi [-]
var
  RutaDeImagen :String;
begin
  RutaDeImagen := ParamStr(1);
end;

En la ayuda de delphi encontraras la información necesaria sobre dicha función ;).

La función ParamStr te devuelve ese valor si le pasas como parametro el 1 :), asi por ejemplo:
Código Delphi [-]
var
  RutaDeImagen :String;
begin
  RutaDeImagen := ParamStr(1);
end;

En la ayuda de delphi encontraras la información necesaria sobre dicha función ;).

jhonny 16-11-2007 20:30:24

:D, Veo que dec y JuanErasmo estan conectados con el foro el dia de hoy :D.

JuanErasmo 16-11-2007 20:34:51

Muchas Gracias!
 
Muchas Gracias, Dec, y muchas Gracias Jhony!
Efectivamente asi lo hice!

Saludos desde Medellin johny! Gracias!

jhonny 16-11-2007 20:37:35

Cita:

Empezado por JuanErasmo (Mensaje 246688)
Muchas Gracias, Dec, y muchas Gracias Jhony!
Efectivamente asi lo hice!

Saludos desde Medellin johny! Gracias!

Pues que bueno :).

jonydread 10-11-2011 03:06:56

necesito realizar lo mismo con un archivo reg al colocar abrir con mi.exe tome la ruta en mi edit.text o el opendialog
probe el codigo que dejaron ay pero no me funciono que hago mal??
Código Delphi [-]
procedure TReg2infConverter.FormCreate(Sender: TObject);
var
  Ruta :String;
  begin
    Ruta := ParamStr(1);
end;
gracias!

escafandra 10-11-2011 10:57:56

Ese código no abre nada, solo te permite saber el primer parámetro con el que se ha abierto tu programa. A partir de ese dato tu programa debe saber que hacer, es decir, tu sabrás que es lo que pretendes realizar con ese parámetro.

Saludos.

jonydread 10-11-2011 16:41:37

Cita:

Empezado por escafandra (Mensaje 418089)
Ese código no abre nada, solo te permite saber el primer parámetro con el que se ha abierto tu programa. A partir de ese dato tu programa debe saber que hacer, es decir, tu sabrás que es lo que pretendes realizar con ese parámetro.

Saludos.

si necesito que cuando de click derecho sobre un archivo .reg el usuario y seleccione
abrir con>mi aplicacion
el programa se abra y cargue el archivo
ya que abre pero no carga el archivo quisiera saber como tomar la ruta
he revisado en el foro y en google salen con paramstr pero no he encontrado ningun ejemplo claro

Gracias de antemano!!

ecfisa 10-11-2011 17:37:07

Cita:

Empezado por jonydread (Mensaje 418111)
si necesito que cuando de click derecho sobre un archivo .reg el usuario y seleccione
abrir con>mi aplicacion el programa se abra y cargue el archivo

Hola.

Te pongo un ejemplo muy simple. Sólo agregá un memo al form y el siguiente código:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    Memo1.Lines.LoadFromFile(ParamStr(1));
  except
    raise Exception.Create('No se puede abrir el archivo');
  end;
end;

Saludos.

jonydread 10-11-2011 20:52:39

se puede hacer que carge al opendialog donde puse // he intentado pero no lo logro

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    // (ParamStr(1));
  except
    raise Exception.Create('No se puede abrir el archivo');
  end;
end;

ecfisa 10-11-2011 22:34:35

Hola.

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  if ParamStr(1) > '' then
  begin
    OpenDialog1.FileName:= ParamStr(1);
    OpenDialog1.Execute;
  end;
end;
Pero no veo la necesidad de llamar TOpenDialog si ya se está enviando el nombre de archivo en ParamStr(1)...

Un saludo.

jonydread 11-11-2011 01:08:35

lo que pasa es que tengo todo referenciado a opendialog
un genio amigo !!
asi quedo mi codigo
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
  if ParamStr(1) > '' then
  begin
    OpenDialog1.FileName:= ParamStr(1);
    edit1.Text:=ParamStr(1);
    end
muchas gracias!!

ecfisa 11-11-2011 08:00:57

Hola jonydread.

Se me ocurrió algo que quizá te pueda interesar incluir.
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
     procedure DragDropFileMSG(var Msg : TMessage); message WM_DROPFILES;
  public
  end;

var
  Form1: TForm1;

implementation 

uses ShellApi;

procedure TForm1.DragDropFileMSG(var Msg: TMessage);
var
  DragDropFileName: array[0..255] of Char;
begin
  DragQueryFile(msg.WParam, 0, DragDropFileName, Length(DragDropFileName));
  DragFinish(Msg.WParam);
  OpenDialog1.FileName:= DragDropFileName;
  Edit1.Text:= DragDropFileName;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;
...
Estando abierta tu aplicación y el explorador de windows simultaneamente, seleccioná un archivo desde el último, arrastralo y soltalo sobre el form de tu aplicación.

Un saludo. :)

jonydread 12-11-2011 04:38:53

muchas gracias amigo funcionando !!
al arrastrar un archivo a mi aplicacion he hecho que se inicie automaticamente el proceso y estoy tratando de implementar un dialogo final Completado!! y al presionar ok se cierre pero no me funciona muy bien en esta parte tengo el error
hasta ay todo bien
Código Delphi [-]
if ExtractFileExt(nomArchivo) = '.reg' then
    ShellExecute(Handle, 'open', 'HAND.CMD', PChar(GetShortName(Opendialog1.FileName)), nil, SW_NORMAL)
     else if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
      Application.Terminate;
       end;
Aca el problema en esta linea no se la forma correcta de hacerla
if ShellExecute(Handle, 'open', 'HAND.CMD', PChar(GetShortName(Opendialog1.FileName)), nil, SW_NORMAL)
Código Delphi [-]
if ExtractFileExt(nomArchivo) = '.reg' then
begin
  if  ShellExecute(Handle, 'open', 'HAND.CMD', PChar(GetShortName(Opendialog1.FileName)), nil, SW_NORMAL) 
then begin
if MessageDlg('Completado!', MtInformation, [mbOK],0) = mrok then
      Application.Terminate;
    end else if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
      Application.Terminate;
       end;
end;

gracias!!

ecfisa 12-11-2011 10:19:06

Hola.

Si queres evaluar el resultado de ShellExecute podrías hacer algo como:
Código Delphi [-]
...
var
  HINSTANCE: Integer;
  ErrorMSG: string;
begin
  OpenDialog1.Filter:= 'Archivos de registro|*.REG';
  with OpenDialog1 do
    if Execute then
    begin
      HINSTANCE:= ShellExecute(Handle,  'open', 'C:\HAND.CMD', PChar(GetShortName(FileName)), nil, SW_NORMAL);
      if HINSTANCE < 32 then
      begin
        case HINSTANCE of
          0: ErrorMSG:= 'Memoria o recursos insuficientes';
          ERROR_FILE_NOT_FOUND: ErrorMSG:= 'Archivo no encontrado';
          ERROR_PATH_NOT_FOUND: ErrorMSG:= 'Ruta no encontrada';
          SE_ERR_ACCESSDENIED:  ErrorMSGr:= 'Acceso denegado';
          //...
        end;
        MessageBox(Handle, PChar(ErrorMSG), 'ERROR', MB_ICONERROR + MB_OK);
        Application.Terminate;
       end;
    end;
end;

Un saludo.

jonydread 12-11-2011 14:35:52

muchas gracias me sirve el codigo pero solo quisiera saber si se ejecuto shellexecute
asi esta el codigo mas completo
en esta linea tengo si el archivo no corresponde todo funciona ok y quisiera hacer lo mismo si se ejecuta shellexecute un dialogo, aceptar y cierre...
Código Delphi [-]
      if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
      Application.Terminate;
Código Delphi [-]
 if ParamStr(1) > '' then
  begin
    OpenDialog1.FileName:= ParamStr(1);
    edit1.Text:=ParamStr(1);
    if ParamStr(1) > '' then
begin
 if ExtractFileExt(ParamStr(1)) = '.reg' then
    ShellExecute(Handle, 'open', 'HAND.CMD', PChar(GetShortName(Opendialog1.FileName)), nil, SW_NORMAL)
      else
      if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
      Application.Terminate;
       end;
   end;
muchas gracias

ecfisa 12-11-2011 15:28:22

Cita:

Empezado por jonydread (Mensaje 418342)
solo quisiera saber si se ejecuto shellexecute

Eso exáctamente hace el código que te puse anteriormente. Guarda en la variable HINSTANCE el resultado de la acción de ShellExecute y si hubo un error (el resultado es menor que 32) lo muestra.

Lo único que habría que hacer es agregarlo:
Código Delphi [-]
var
  HINSTANCE: Integer;
  ErrorMSG: string;
begin
  if ParamStr(1) > '' then
  begin
    OpenDialog1.FileName:= ParamStr(1);
    edit1.Text:=ParamStr(1);
    if ParamStr(1) > '' then
  begin
  if ExtractFileExt(ParamStr(1)) = '.reg' then
  begin
    HINSTANCE:= ShellExecute(Handle,  'open', 'C:\HAND.CMD', PChar(GetShortName(FileName)), nil, SW_NORMAL);
    if HINSTANCE < 32 then
    begin
      case HINSTANCE of
        0: ErrorMSG:= 'Memoria o recursos insuficientes';
        ERROR_FILE_NOT_FOUND: ErrorMSG:= 'Archivo no encontrado';
        ERROR_PATH_NOT_FOUND: ErrorMSG:= 'Ruta no encontrada';
        SE_ERR_ACCESSDENIED:  ErrorMSGr:= 'Acceso denegado';
        //...
     end;
     MessageDlg('Error: '+ErrorMSG, mtError, [mbOK],0);
     Application.Terminate;
  end
  ...

Pero no le encuentro sentido a estas líneas:
Código Delphi [-]
 
  if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
    Application.Terminate;
El usuario recibe el mensaje 'Archivo inválido', no tiene otra opción que aceptar con el botón OK y luego de eso se termina la aplicación. Es decir no tiene sentido evaluar una condición de la que ya sabemos la respuesta...

O directamente hacemos:
Código Delphi [-]
  MessageDlg('Archivo invalido!', mtError, [mbOK],0);
  Application.Terminate;

O si queremos la opinión del usuario:
Código Delphi [-]
 
  if MessageDlg('¿ Desea finalizar ?', mtConfirmation, [mbYes,mbNo],0) = mrYes then
    Application.Terminate;

Un saludo.

jonydread 12-11-2011 15:45:21

Ok tienes razon gracias probare y comento como me fue...


La franja horaria es GMT +2. Ahora son las 22:23:30.

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