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)
-   -   enviar documento cargado a programa (https://www.clubdelphi.com/foros/showthread.php?t=76500)

jonydread 05-11-2011 02:56:33

enviar documento cargado a programa
 
amigos nuevamente y muy prontamente solicito su ayuda
tengo el siguiente codigo de un programa en ms-dos
Handler.cmd
Código:

@Echo Off
TITLE Reg2Inf Converter Handler
setlocal enableextensions

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

:reg2infExecute
If not defined WORKFILE goto usageinfo
If not exist "%WORKFILE%" goto notexist
If exist "%OUTFILE%" goto overwritewarning

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

:overwritewarning
color 0a
Echo.
Echo ** WARNING !
Echo.
Echo "%OUTFILE%": Already exists !
Echo.
:userpromptoverwrite
SET /P Result=- Overwrite ?:
if /I "%Result%"=="yes" goto doit
If /I "%Result%"=="no" goto rename
If /I "%Result%"=="n" goto rename
goto userpromptoverwrite

:rename
SET /P OUTFILE=- New filename:
If "%OUTFILE%"=="" goto rename
goto reg2infExecute

:usageinfo
color 0a
Echo.
Echo ** %~nx0 [NameOfRegFileToConvert.Reg]
Echo.
Echo - The output INF will be created in the same folder as the input REG
Echo  and with the same name (in this case: NameOfRegFileToConvert.Inf)
Echo.
Echo - Input REG file must exist, you will be prompted if a file with the
Echo  same name as the Output INF already exists.
Echo.
Echo ** Press any key to exit . . .
PAUSE > NUL
goto end

:notexist
color 4f
Echo.
Echo ** "%WORKFILE%": Does not exist !
Echo.
Echo ** Press any key to exit . . .
PAUSE > NUL
goto end

:end
endlocal

realmente no se como modificar el codigo para hacerlo correr en mi form
creo que seria mas facil tomar el archivo cargado y enviarlo a este programa
tengo los sgtes comando para tomar un archivo y quisiera enviarlo a su ejecución he visto codigos por aqui pero no me han servido si me orientaran un poco lo agradeceria
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Filter := 'Archivos de registro|*.reg';
opendialog1.Execute;
if FileExists(OpenDialog1.FileName) then
  else
    ShowMessage(Edit1.Text+' Archivo no encontrado');
edit1.Text := OpenDialog1.FileName;
end;

ecfisa 05-11-2011 04:59:47

Hola jonydread.

No estoy seguro de entender lo que buscas hacer, pero si se trata de ejecutar el archivo HANDLER.CMD, sería:
Código Delphi [-]
...
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', 'HANDLER.CMD', nil, nil, SW_NORMAL);
end;

Un saludo.

jonydread 05-11-2011 05:16:20

Necesito tomar un archivo .reg por medio del boton abrir cargarlo a que handler.cmd lo procese por medio de un boton convertir
gracias por su respuesta!

ecfisa 05-11-2011 07:20:57

Entiendo, probá de este modo:
Código Delphi [-]
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.Filter := 'Archivos de registro|*.reg';
  if OpenDialog1.Execute then
    ShellExecute(Handle, 'open', 'HANDLER.CMD', PChar(OpenDialog1.FileName), nil, SW_NORMAL);
end;

Un saludo.

jonydread 06-11-2011 03:15:36

funciona ese codigo si coloco las rutas que no es la idea
Código Delphi [-]
 PChar('c:\miarchivo.reg')
en cambio asi
Código Delphi [-]
 PChar(OpenDialog1.FileName)
no hace nada probe con edit1.text y tampoco lo botones que tengo estan asi
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Filter := 'Archivos de registro|*.reg';
opendialog1.Execute;
if FileExists(OpenDialog1.FileName) then
  else
    ShowMessage(Edit1.Text+' Archivo no encontrado');
edit1.Text := OpenDialog1.FileName;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    ShellExecute(Handle, 'open', 'HANDLER.CMD', PChar(OpenDialog1.FileName), nil, SW_NORMAL);

end;
primer boton carga archivo
segundo lo envia al programa externo
gracias!

ecfisa 06-11-2011 10:14:05

Hola.

Seguramente el problema lo tengas en como maneja el parámetro Handler.cmd ¿ Por que pienso eso ? Acabo de hacer la siguiente prueba:

Contenido del Handler.cmd que cree en mi equipo:
Código:

set WORKFILE=%~1
type %~1
PAUSE

Este código muestra el contenido de un archivo enviado como parámetro y espera la pulsación de una tecla. Lo podes comprobar fácilmente escribiendo desde el propmt:
Código:

C:\>HANDLER C:\TEMP\ARCHIVO.TXT
(Ruta+Nombre de un archivo de texto existente)

Luego desde Delphi, ejecuto este código:
Código Delphi [-]
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.Filter := 'Archivos de texto|*.TXT';
  if OpenDialog1.Execute then
    ShellExecute(Handle, 'open', 'C:\HANDLER.CMD', PChar(OpenDialog1.FileName), nil, SW_NORMAL);
end;
Y sin ningún problema, visualizo en la ventana de símbolo de sistema el contenido del archivo .TXT enviado mediante ShellExecute.

No hay error en el envío del parámetro mediante ShellExecute ni en la recepción del mismo por Handler.cmd, por lo tanto el problema debe suceder luego en el manejo que hace Handler.cmd con el parámetro que recibió.

Un saludo.

jonydread 06-11-2011 18:41:32

muchas gracias probare y comento!!

jonydread 06-11-2011 22:28:59

opendialog1.filename
toma la ruta con espacios y no funciona probe un directorio sin espacios y funciona bien que se puede hacer

ecfisa 07-11-2011 01:19:07

Hola.

Creo que el problema se produce por que Handler.CMD no puede manejar los nombres largos de archivo, probá de este modo:
Código Delphi [-]
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  ShortName: array[0..255] of char;
begin
  OpenDialog1.Filter:= 'Archivos de registro|*.REG';
  with OpenDialog1 do
    if Execute then
    begin
      GetShortPathName(PChar(FileName), @ShortName, Length(FileName));
      ShellExecute(Handle, 'open', 'C:\HANDLER.CMD', PChar(@ShortName), nil, SW_NORMAL);
    end;
end;

Un saludo.

jonydread 07-11-2011 03:08:59

no me funciona muchas gracias por la ayuda creo que tratare de trabajar el cmd haber si lo compilo dentro del mismo form sin necesitar el cmd a las finales creo que la parte mas importante es esta
Código:

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

vere si logro ejecutar ese exe, workfile es el archivo que tomo y darle un nombre de salida buscare como hacerlo y comento!!
Gracias!!

jonydread 07-11-2011 20:27:14

reduci el ejecutable cmd
existe alguna forma de realizar lo mismo en un shellexecute de delphi, no se un boton que envie estos mismos parametros?
Código:

@Echo Off
TITLE Reg2Inf Converter Handler
setlocal enableextensions

:start
set WORKFILE=%~1
set OUTFILE=%~dpn1.inf
CD /D %~dp1
Echo.
Echo ** Converting "%~nx1" ...
reg2inf.exe "%WORKFILE%" "%OUTFILE%"
Echo.
PAUSE
goto end
:end
endlocal


jonydread 07-11-2011 21:13:56

Cita:

Empezado por ecfisa (Mensaje 417767)
Hola.

Creo que el problema se produce por que Handler.CMD no puede manejar los nombres largos de archivo, probá de este modo:
Código Delphi [-]
uses ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  ShortName: array[0..255] of char;
begin
  OpenDialog1.Filter:= 'Archivos de registro|*.REG';
  with OpenDialog1 do
    if Execute then
    begin
      GetShortPathName(PChar(FileName), @ShortName, Length(FileName));
      ShellExecute(Handle, 'open', 'C:\HANDLER.CMD', PChar(@ShortName), nil, SW_NORMAL);
    end;
end;

Un saludo.

Al final si funciono!! Gracias!

jonydread 08-11-2011 21:08:34

disculpa por seguir el hilo pero me salio un problema
el shortname toma bien los archivos pero rutas largas al parecer
tengo : D:\re2\delphi\run.reg , dice no existe
tengo : D:\re2\delphi\copiaderun.reg , lo convierte sin problemas a que se debe


La franja horaria es GMT +2. Ahora son las 22:09:46.

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