PDA

Ver la Versión Completa : Como abrir un archivo con mi aplicacion. (parametros de ejectutable)


JuanErasmo
16-11-2007, 20:18:20
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:


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:

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:

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:

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, Dec, y muchas Gracias Jhony!
Efectivamente asi lo hice!

Saludos desde Medellin johny! Gracias!

jhonny
16-11-2007, 20:37:35
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??

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
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
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:

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

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.


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

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.

...
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

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)

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:

...
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...

if MessageDlg('Archivo invalido!', MtInformation, [mbOK],0) = mrok then
Application.Terminate;

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
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:

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:

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:

MessageDlg('Archivo invalido!', mtError, [mbOK],0);
Application.Terminate;


O si queremos la opinión del usuario:

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...

jonydread
12-11-2011, 23:42:53
todo ok Gracias!