Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ejecutar ap.ext. dir. y nombre in & outfile (https://www.clubdelphi.com/foros/showthread.php?t=76619)

jonydread 14-11-2011 02:16:22

ejecutar ap.ext. dir. y nombre in & outfile
 
algo enredado el titulo pero trate de ser algo especifico y no lo pude editar despues,
lo que pasa ejecuto programa externo que convierte archivo segun estos parametros en un bat
Código:

set WORKFILE=%~1
set OUTFILE=%~dpn1.inf
CD /D %~dp1

:doit
Echo.
Echo ** Converting "%~nx1" ...
reg2inf.exe "%WORKFILE%" "%OUTFILE%"
Echo.
PAUSE
goto end

queria saber si se puede hacer lo mismo en codigo delphi
algo asi como un shellexecute que tome el archivo de entrada %WORKFILE% y salga con %OUTFILE%
tengo solo una parte mas o menos clara
%WORKFILE% podria ponerlo como Opendialog1.FileName o ParamStr(1)
pero
%OUTFILE% ??? debe tener otra extension (en bat set OUTFILE=%~dpn1.inf) y quedar en el mismo directorio de workfile en (bat CD /D %~dp1)
demas no se bien como realizar esta parte, mas bien estoy bien nulo
reg2inf.exe "%WORKFILE%" "%OUTFILE%"

saludos!
Gracias!

ecfisa 14-11-2011 14:24:31

Hola.

No entiendo la necesidad de enviar los parámetros al archivo por lotes, yo lo haría directamente a reg2inf. Por ejemplo:
Código Delphi [-]
procedure LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
begin
  ShellExecute(Hnd,
              'OPEN',
              PChar(ExtractFileName(App)),
              Pchar(Origen+' '+Destino),
              PChar(ExtractFilePath(App)),
              SW_HIDE);
end;

Llamada:
Código Delphi [-]
 LlamarReg2inf(Handle,'C:\REG2INF.EXE','C:\TEMP\OLDNAME.XX','C:\TEMP\NEWNAME.XXX');

Saludos.

jonydread 14-11-2011 14:51:21

lo que pasa es que reg2inf.exe es un programa externo, es un archivo comprimido funciona con pantalla msdos y no puedo editarlo, para ello existe otro bat que envia los parametros que coloque, lo que quiero es saltar el primero y hacerlo en delphi y enviar directo a reg2inf.exe

jonydread 14-11-2011 15:50:45

funciona bien pero como puedo reemplazar esto
,'C:\TEMP\NEWNAME.XXX' mantener nombre de archivo y crear en el mismo directorio de entrada
edit:
ay quedo
Código Delphi [-]
procedure Tform1.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
var sAppName, sAppinf : string;
begin
sAppName := App;
sAppinf := ChangeFileExt(sAppName,'.inf');
  ShellExecute(Hnd,
              'OPEN',
              PChar(ExtractFileName(App)),
              Pchar(Origen+' '+Destino),
              PChar(ExtractFilePath(App)),
              SW_HIDE);
end;

muchas gracias!!

jonydread 14-11-2011 16:22:49

disculpa el de arriba estaba mal no funciona

ecfisa 14-11-2011 16:24:22

Hola jonydread.

Podés enviar constantes como en el ejemplo que te puse anteriormente o variables. Lo que importa es que en el argumento Origen envíes la Ruta+Nombre de archivo sobre el que se van a hacer las operaciones (WORKFILE) y en el argumento Destino el nombre que deseas darle a la salida (OUTFILE).

Un ejemplo con variables:
Código Delphi [-]
var
  Aplicacion ,Entrada, Salida:
begin
  Aplicacion:= 'Y:\UNA_RUTA\REG2INF.EXE';  // Aplicacion: reg2inf.exe
  Entrada   := 'X:\OTRA_RUTA\ENTRADA.@@@'; // Nombre de archivo de entrada
  Salida    := 'X:\OTRA_RUTA\SALIDA.UXO';  // Nombre de archivo de salida
  LlamarReg2Inf(Handle,  Aplicacion, Entrada, Salida);
  ...

Saludos.

jonydread 14-11-2011 16:42:49

Mil gracias tenia la solucion ay mismo y no me habia dado cuenta
Código Delphi [-]
procedure Tform1.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
begin
  ShellExecute(Hnd,
              'OPEN',
              PChar(ExtractFileName(App)),
              Pchar(Origen+' '+Destino),
              PChar(ExtractFilePath(App)),
              SW_HIDE);
end;
llamar LlamarReg2inf
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var sAppName, sAppnew : string;
begin
sAppName := Opendialog1.FileName;
sAppnew := ChangeFileExt(sAppName,'.inf');
 LlamarReg2inf(Handle,'REG2INF.EXE',Opendialog1.FileName,sAppnew );
end;

jonydread 16-11-2011 04:39:59

Amigo tengo dos dudas para este codigo
1ºComo puedo aplicar el shortname para las rutas conservando el nombre del archivo ya que lo aplique de este modo
Código Delphi [-]
var Origen, Destino,FileName : string;
begin
FileName := ExtractFileName(Opendialog1.filename);
Origen := GetshortName(Opendialog1.FileName);
Destino := ChangeFileExt(ExtractFileName(FileName),'.inf');
 LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;
me entrega bien pero si el nombre de archivo tiene espacio no hace nada por ejemplo
mi archivo.xx
pero si esta asi
miarchivo.xx funciona ok
2ºAplico HINSTANCE pero no me da resultado la coloque en Tform1.LlamarReg2inf
para que responda a errores y sepa cuando el resultado fue exitoso
gracias por tu tiempo

ecfisa 16-11-2011 12:32:46

Cita:

Empezado por jonydread (Mensaje 418592)
Como puedo aplicar el shortname para las rutas conservando el nombre del archivo

Si no te entendí mál, sería:
Código Delphi [-]
var
  Origen, Destino: string;
begin
  OpenDialog1.Execute;
  Origen   := GetshortName(Opendialog1.FileName);
  Destino  := ExtractFilePath(Opendialog1.FileName) + ChangeFileExt(ExtractFileName(Opendialog1.FileName), '.INF');
  ...

Un saludo.

jonydread 16-11-2011 15:11:22

asi coloque para que funcionara
Código Delphi [-]
Origen := GetshortName(Opendialog1.FileName);
Destino :=ChangeFileExt(ExtractFileName(Opendialog1.FileName), '.inf');
funciona pero si el nombre contiene espacios no funciona

lo otro disculpa
para colocar un HINSTANCE donde lo coloco??

gracias!!

ecfisa 16-11-2011 15:32:46

Cita:

si el nombre contiene espacios no funciona
Tenés razón, eso me pasa por hacer las cosas en el aire. :o

De este modo renombra correctamente el archivo usando nombres cortos (con y sin espacios):
Código Delphi [-]
...
var
  Origen, Destino: string;
begin
  OpenDialog1.Execute;
  Origen   := GetshortName(Opendialog1.FileName);
  Destino  := GetShortName(ChangeFileExt(Origen, '.INF'));
  ShowMessage(Origen+#10#13+Destino);  // las cadenas sólo difieren en '.INF'
  ...

Saludos.

jonydread 16-11-2011 15:51:55

Cita:

Empezado por ecfisa (Mensaje 418615)
Tenés razón, eso me pasa por hacer las cosas en el aire. :o

De este modo renombra correctamente el archivo usando nombres cortos (con y sin espacios):
Código Delphi [-]
...
var
  Origen, Destino: string;
begin
  OpenDialog1.Execute;
  Origen   := GetshortName(Opendialog1.FileName);
  Destino  := GetShortName(ChangeFileExt(Origen, '.INF'));
  ShowMessage(Origen+#10#13+Destino);  // las cadenas sólo difieren en '.INF'
  ...

Saludos.

Disculpas creo que me exprese mal, funciona bien lo que pasa que el nombre del archivo si tiene espacios no realiza la accion, estoy buscando como reemplazar el espacio por _ para que pueda escribir el archivo de salida

ecfisa 16-11-2011 16:19:57

Cita:

estoy buscando como reemplazar el espacio por _ para que pueda escribir el archivo de salida
Código Delphi [-]
uses StrUtils;
...
var
  ArchivoSalida: string;
begin
  ...
  ArchivoSalida:= AnsiReplaceStr(ArchivoSalida, ' ', '_');
  ...
end;

Saludos.

jonydread 16-11-2011 16:45:39

lo he hecho asi
Código Delphi [-]
procedure TReg2infConverter.Button2Click(Sender: TObject);
var Origen, Destino,FileName: string;
begin
Origen := GetshortName(Opendialog1.FileName);
Destino :=ChangeFileExt(FileName, '.inf');
FileName := ExtractFileName(Opendialog1.FileName);
FileName := StringReplace(FileName,' ','_',[rfReplaceAll]);
 LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;

es la única forma que realiza la acción pero el archivo de salida sale sin nombre .inf solamente
para que quede mas claro
este archivo esta en esta ruta
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copia de arch.reg (con este da el problema)
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copiadearch.reg (este realiza la acción y conserva el nombre completo)

ecfisa 16-11-2011 17:20:30

Cita:

D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copia de arch.reg (con este da el problema)
D:\Documents and Settings\Administrador\Mis documentos\pruebas\Copiadearch.reg (este realiza la acción y conserva el nombre completo)
Entonces:
Código Delphi [-]
use StrUtils;
...
  ArchivoSalida:= AnsiReplaceStr(ArchivoSalida,' ','');

Pero entonces no se condice con lo que expusiste en el mensaje anterior: "estoy buscando como reemplazar el espacio por _ ..." ;)

Un saludo. :)

jonydread 16-11-2011 18:11:06

es lo mismo por lo que se reemplaze pero el enredo lo tenia yo jaj gracias ay funciono de pelos!!
Código Delphi [-]
procedure TReg2infConverter.Button2Click(Sender: TObject);
var Origen, Destino,FileName: string;
begin
FileName := Extractfilename(Opendialog1.FileName);
Origen := GetshortName(Opendialog1.FileName);
FileName:= AnsiReplaceStr(FileName,' ','');
Destino :=ChangeFileExt(FileName, '.inf');
 LlamarReg2inf(Handle,'REG2INF.EXE',Origen,Destino );
end;
la otra consulta que ise puse el codigo hintance para comprobar shellexecute
lo coloque aqui
Código Delphi [-]
procedure TReg2infConverter.LlamarReg2inf(Hnd: THandle; const App:string; const Origen: string; const Destino: string);
var
 HINSTANCE: Integer;
  ErrorMSG: string;
begin
   HINSTANCE:=ShellExecute(Hnd,
              'OPEN',
              PChar(ExtractFileName(App)),
              PChar(Origen+' '+Destino),
              PChar(GetShortName(ExtractFilePath(App))),
              SW_HIDE);
                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:  ErrorMSG:= 'Acceso denegado';
          //...
        end;
        MessageBox(Handle, PChar(ErrorMSG), 'ERROR', MB_ICONERROR + MB_OK);
        Application.Terminate;
       end;
end;
pero no funciono

ecfisa 16-11-2011 18:24:55

Hola.

¿ Que es lo que no funcionó, no ejecuta el programa , te da alguna excepción ?

Saludos.

jonydread 16-11-2011 18:42:05

ise la prueba cargando un archivo y le cambie el nombre y no tira el error de no encontrado

ecfisa 16-11-2011 19:11:41

Hola.

La función ShellExecute no te va a informar ningún error si la ruta y el nombre de archivo enviado en el argumento App es correcto.

Es taréa de la aplicación invocada por ShellExecute el manejar cualquier error en los nombres enviados en los parámetros Origen o Destino.


Un saludo.

jonydread 16-11-2011 19:12:12

ok muchas gracias!

ecfisa 16-11-2011 19:20:25

Hola.

Estaba pensando, que si los archivos son elegidos mediante un TOpenDialog, existen pocas posibilidades de que el archivo no exista...

Es decir o cancela la elección o la acepta, pero si hace esto último, si o sí el nombre de archivo se encontrará en la propiedad FileName del TOpenDialog. Y a menos que el archivo se halle en una unidad removible y sea quitada antes de llamar a ShellExecute no veo la posibilidad de que el archivo desaparezca.

De todas formas podés utilizar la función FileExists antes de llamar a ShellExecute para verificar la existencia el archivo enviado en el argumento Origen.

Saludos.

jonydread 16-11-2011 19:50:11

lo ise asi
Código Delphi [-]
    if FileExists(Opendialog1.FileName) then
              label1.Caption:='Convertido con exito!! : '+outfile
              else
   label1.Caption:='Error! No se Encuentra Archivo'
       end;

gracias!!


La franja horaria es GMT +2. Ahora son las 19:34:24.

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