Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problema al ejecutar accion al soltar archivo sobre aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=76659)

jonydread 16-11-2011 22:56:36

problema al ejecutar accion al soltar archivo sobre aplicacion
 
amigos he probado muchas formas y no le veo la falla a mi codigo
al soltar un archivo sobre la aplicacion esta se debe ejecutar obtener ruta y ejecuta una aplicacion
la aplicacion llama a:
Código Delphi [-]
procedure TReg2infConverter.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
var
FileName,outfile : string;
begin
FileName := Extractfilename(Opendialog1.FileName);
FileName:= AnsiReplaceStr(FileName,' ','');
outfile :=ChangeFileExt(FileName, '.inf');
   ShellExecute(Hnd,
              'OPEN',
              PChar(ExtractFileName(App)),
              PChar(Origen+' '+Destino),
              PChar(ExtractFilePath(App)),
              SW_HIDE);
                if FileExists(Opendialog1.FileName) then
              label1.Caption:='Convertido con exito!! : '+outfile
              else
   label1.Caption:='Error! No se Encuentra Archivo'
       end;

y aqui el dilema lo suelto encima se abre aplicacion y tira el mensaje Convertido con exito!! pero no hace nada, al abrir la aplicación y arrastrar un archivo encima funciona ok y es casi el mismo código.
Código Delphi [-]
procedure TReg2infConverter.FormCreate(Sender: TObject);
var
  Origen, Destino ,Filename : string;
  begin
    DragAcceptFiles(handle, true);
    OpenDialog1.FileName:= ParamStr(1);
    edit1.Text:=ParamStr(1);
    if ParamStr(1) > '' then
 begin
Filename := Extractfilename(Opendialog1.FileName);
Origen := GetshortName(Opendialog1.FileName);
Filename:= AnsiReplaceStr(Filename,' ','');
Destino :=ChangeFileExt(Filename, '.inf');
 if ExtractFileExt(ParamStr(1)) = '.reg' then
LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino )
else
    MessageDlg('Archivo no valido!!', mterror, [mbok],0);
   end;
   end;

gracias por su tiempo!!

ecfisa 16-11-2011 23:46:48

Hola.

Creo que estas tratando de implementar el código que te sugerí aquí y te has echo una ensalada.
Si te fijas bién en el post anterior, no es en OnCreate donde se captura el nombre de archivo sino en DragDropFileMSG.

Resumiendo:
Código Delphi [-]
....
implementation

uses ShellApi,StrUtils;

function GetShortName(const FileName: String): String;
var
  ShortName: PChar;
  Size: Cardinal;
begin
  Size := GetShortPathName(PChar(FileName), nil, 0);
  if Size > 0 then
  begin
    GetMem(ShortName, Size);
    GetShortPathName(PChar(FileName), ShortName, Size);
    Result := ShortName;
    FreeMem(ShortName);
  end
  else
    Result := FileName;
end;

procedure LlamarReg2inf(Hnd: THandle; const App:string; Origen: string; Destino: string);
begin
  // En Origen dejamos el nombre corto sin espacios
  Origen:= AnsiReplaceStr(GetShortName(Origen), ' ', ''); 
  // Cambiamos la extensión para Destino 
  Destino:= ChangeFileExt(Origen, '.inf');
  // Llamamos a 'REG2INF.EXE con Origen y Destino
  ShellExecute(Hnd,  
              'OPEN',
              PChar(ExtractFileName(App)),
              PChar(Origen+' '+Destino),
              PChar(ExtractFilePath(App)),
              SW_SHOW);
end;

procedure TForm1.DragDropFileMSG(var Msg: TMessage);
var
  DragDropFileName: array[0..255] of Char;
begin
  DragQueryFile(msg.WParam, 0, DragDropFileName, Length(DragDropFileName));
  DragFinish(Msg.WParam);
  LlamarReg2inf(Handle, 'REG2INF.EXE', DragDropFileName,'')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;
...
A fin de simplificar la explicación recorté y modifiqué un poco el código del procedimiento LlamarReg2inf.

Saludos.

jonydread 17-11-2011 00:05:54

me sale un error en
Código Delphi [-]
  Origen:= AnsiReplaceStr(GetShortName(Origen), ' ', '');
  Destino:= ChangeFileExt(Origen, '.inf');
:confused:

ecfisa 17-11-2011 00:21:20

Cita:

Empezado por jonydread (Mensaje 418667)
me sale un error en
Código Delphi [-]
  Origen:= AnsiReplaceStr(GetShortName(Origen), ' ', '');
  Destino:= ChangeFileExt(Origen, '.inf');
:confused:

Es extraño, no sé como lo estés implementando... A mi me funciona perfectamente.

Para que puedas estudiar el código con tranquilidad te adjunto los fuentes. Como no tengo el archivo reg2inf.exe realizé una aplicación de consola en Delphi con igual nombre que lo único que hace es mostrar ParamStr(1) y ParamStr(2).

Pero para no adjuntarte el ejecutable desactivé la llamada a ShellExecute reemplazándola por un simple ShowMessage que muestra Origen y Destino, al ser estos correctos (sólo diferenciarse en la extensión) , si existe un error es ajeno al código.

Un saludo.

jonydread 17-11-2011 00:50:18

esta parte bien no he tenido problemas al arrastrar el archivo sobre la aplicacion
Código Delphi [-]
procedure TForm1.DragDropFileMSG(var Msg: TMessage);
var
  DragDropFileName: array[0..255] of Char;
begin
  DragQueryFile(msg.WParam, 0, DragDropFileName, Length(DragDropFileName));
  DragFinish(Msg.WParam);
  LlamarReg2inf(Handle, 'REG2INF.EXE', DragDropFileName,'')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True);
end;

pero si tengo miaplicacion.exe y tomo un archivo lo tiro encima se abre la aplicacion solamente no hace nada, yo tenia implementado antes y funcionaba colocando en formcreate :confused:

ecfisa 17-11-2011 15:09:56

Cita:

pero si tengo miaplicacion.exe y tomo un archivo lo tiro encima se abre la aplicacion solamente no hace nada, yo tenia implementado antes y funcionaba colocando en formcreate
Hola.

Lo lamento, no logro entender la situación.

Saludos.

jonydread 17-11-2011 15:33:12

Cita:

Empezado por ecfisa (Mensaje 418709)
Hola.

Lo lamento, no logro entender la situación.

Saludos.

si tomo un archivo, click derecho,enviar a : mi aplicacion no realiza ninguna accion solo abre el programa
eso quiero realizar que se abra con el archivo que envie y lo procese. tenia un hilo aca funcionaba pero ahora que agrege la funcion de llamarreg2inf ya no
AHORA TENGO PROBLEMA CON LA OTRA FORMA AL ARRASTRAR EJECUTA PERO EL ARCHIVO DE SALIDA SE CREA EN LA CARPETA DE MI APLICACION, NO DE DONDE SE TOMO EL ARCHIVO
el codigo lo vi en otra pagina
Código Delphi [-]
procedure TReg2infConverter.FormCreate(Sender: TObject);
begin
  // Registrar la aplicación 
  DragAcceptFiles(handle, true);
end;
procedure TReg2infConverter.WMDropFiles(var Msg: TMessage);
var
  nomArchivo: array [0..MAX_PATH] of char;
  tamBuffer: Integer;
  numArchivos: Integer;
  f: Integer;
  Origen, Destino ,Filename : string;
begin
  // Cuando se arrastra un archivo sobre nuestra apliación,
  // se recibe este mensaje.
  hDrop := Msg.WParam;
  numArchivos := DragQueryFile(hDrop, $FFFFFFFF, Nil, 0);
  if (numArchivos > 0) then
  begin
    for f := 0 to numArchivos -1 do
    begin
      tamBuffer := DragQueryFile(hDrop, f, nil, 0)+1;
      DragQueryFile(hDrop, f, nomArchivo, tamBuffer);
      opendialog1.FileName:=(nomArchivo);
      edit1.Text:=(nomArchivo);
       if fileExists(opendialog1.FileName) then
      begin
    if ExtractFileExt(opendialog1.FileName) = '.reg' then
    begin
Filename := Extractfilename(opendialog1.FileName);
Origen := GetshortName(opendialog1.FileName);
Filename:= AnsiReplaceStr(Filename,' ','');
Destino :=ChangeFileExt(Filename, '.inf');
 LlamarReg2inf(Handle,'reg2inf.exe',Origen,Destino );
end else
    MessageDlg('Archivo no valido!!', mterror, [mbok],0);
   end;
   end;
  end;
  end;
procedure TReg2infConverter.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Eliminamos el registro de nuestra ventana en el sistema
  DragFinish(hDrop);
end;

ecfisa 17-11-2011 15:46:04

Cita:

si tomo un archivo, click derecho,enviar a : mi aplicacion no realiza ninguna accion solo abre el programa eso quiero realizar que se abra con el archivo que envie y lo procese.
Hola.

Es que el código que te sugerí y adjunté funciona para la acción Drag&Drop (arrastrar/soltar).

Saludos.

jonydread 17-11-2011 16:14:50

si lo que pasa que tenia un problema con el destino me creaba el archivo en la carpeta de mi proyecto al arrastrar y soltar
hise esta ensalada jaja que por el momento ha sido la unica forma que me ha funcionado
Arrastrar/soltar y ejecutar aplicación
Código Delphi [-]
procedure TReg2infConverter.WMDropFiles(var Msg: TMessage);
var
  nomArchivo: array [0..255] of char;
  tamBuffer: Integer;
  numArchivos: Integer;
  f: Integer;
  Origen, Destino ,Filename,path : string;
begin
  // Cuando se arrastra un archivo sobre nuestra apliación,
  // se recibe este mensaje.
  hDrop := Msg.WParam;
  numArchivos := DragQueryFile(hDrop, $FFFFFFFF, Nil, 0);
  if (numArchivos > 0) then
  begin
    for f := 0 to numArchivos -1 do
    begin
      tamBuffer := DragQueryFile(hDrop, f, nil, 0)+1;
      DragQueryFile(hDrop, f, nomArchivo, tamBuffer);
      opendialog1.FileName:=(nomArchivo);
      edit1.Text:=(nomArchivo);
       if fileExists(opendialog1.FileName) then
      begin
    if ExtractFileExt(opendialog1.FileName) = '.reg' then
    begin
path:=GetshortName(ExtractFilePath(Opendialog1.FileName));
Filename := Extractfilename(opendialog1.FileName);
Origen := GetshortName(opendialog1.FileName);
Filename:= AnsiReplaceStr(Filename,' ','');
Destino :=ChangeFileExt(Filename, '.inf');

LlamarReg2inf(Handle,'reg2inf.exe',Origen,path+Destino );
end else
    MessageDlg('Archivo no valido!!', mterror, [mbok],0);
   end;
   end;
  end;
  end;
Enviar archivo a Aplicación
Código Delphi [-]
procedure TReg2infConverter.FormCreate(Sender: TObject);
var Origen, Destino,FileName,Path: string;
begin
  // Registrar la aplicación
  DragAcceptFiles(handle, true);
  if ParamStr(1) > '' then
  begin
    OpenDialog1.FileName:= ParamStr(1);
    Edit1.Text:= ParamStr(1);
    if FileExists(OpenDialog1.FileName) then
    Path:=GetshortName(ExtractFilePath(Opendialog1.FileName));
    Filename := Extractfilename(opendialog1.FileName);
    Origen := GetshortName(opendialog1.FileName);
    Filename:= AnsiReplaceStr(Filename,' ','');
    Destino :=ChangeFileExt(Filename, '.inf');

    LlamarReg2inf(Handle,'reg2inf.exe',Origen,path+Destino );
end;
end;

Gracias! por el momento todo OK!! ;)


La franja horaria es GMT +2. Ahora son las 08:52:02.

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