Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Archivos en Lazarus (https://www.clubdelphi.com/foros/showthread.php?t=87997)

jbecerra 30-03-2015 14:45:51

Archivos en Lazarus
 
Hola...estoy necesitando alguna información sobre lo siguiente:
Estoy haciendo un programita para realizar tareas automatizadas. Lo que hago desde el código fuente es generar un archivo BAT que me cambie la extensión de todos los archivos de una carpeta... luego quiero ejecutarlo y no funciona...
Me fije y el archivo BAT está bien escrito... de hecho si le hago doble clic funciona perfectamente. No se que me puede estar fallando o faltando en el código. Les adjunto el código para ilustrar mejor lo que quiero decir...
Código Delphi [-]
Procedure crearfile(var D:string);
var f:textfile;
begin
  D:=D+'\convertir.bat';
  Assign(f,D);
  rewrite(f);
  write (f, 'ren *.dbf *.tmp');
  close(f);
end;                

procedure TForm1.Button2Click(Sender: TObject);
var Dir:string;
    n:integer;
Const SELDIRHELP=1000;
begin
   Dir:='';
   Dir:='C:\Windows';
   if  SelectDirectory (Dir ,[ sdAllowCreate , sdPerformCreate , sdPrompt ], SELDIRHELP )  then
   begin
     crearfile(Dir);
     WinExec(Pchar(Dir),SW_NORMAL);
     showmessage(Dir);
   end;
end;
Cualquier info que puedan darme...les será agradecida..
saludos

Neftali [Germán.Estévez] 30-03-2015 16:06:15

Revisa este hilo, y prueba con ShellExecute, tal y como se explica ahí

ecfisa 30-03-2015 16:20:24

Hola jbecerra, bienvenido a Club Delphi :).

Al tratarse de Lazarus no te recomiendo usar WinExec o ShellExecute ya que le quitas portabilidad a tu aplicación. En su lugar usa ExecuteProcess o mejor aún TProcess que te dá mas poder sobre la acción.

Con ExecuteProcess:
Código Delphi [-]
procedure crearfile(const D:string);
var
  f:textfile;
begin
  Assign(f, D + 'Convertir.bat');
  rewrite(f);
  write (f, 'PAUSE'); // Ej.
  close(f);
end;    

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir:string;
begin
   Dir:= IncludeTrailingPathDelimiter('C:\Windows');
  if SetCurrentDir(Dir) then
  begin
    crearfile(Dir);
    ExecuteProcess(Dir + 'Convertir.bat','');  
  end;  
end;

Con TProcess:
Código Delphi [-]
uses Process;

procedure crearfile(const D:string);
var
  f:textfile;
begin
  Assign(f, D);
  rewrite(f);
  write (f, 'PAUSE'); // Ej.
  close(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Dir, Bat:string;
begin
  Dir:= IncludeTrailingPathDelimiter('C:\Windows');
  Bat:= 'Convertir.bat';
  crearfile(Dir + Bat);
  with TProcess.Create(nil) do
  try
    Executable:= Dir + Bat;
    Execute;
  finally
    Free;
  end;
end;
En este enlace tenes información mas detallada: Executing External Programs/es

Saludos :)

jbecerra 30-03-2015 17:48:34

Consulta
 
No me esta funcionando...probé con las dos opciones que me pasaste y el programa me saca un cartel que tengo que Interrumpir o continuar...
Lo que necesito basicamente es darle la opción al usuario a que navegue por windows y me indique la ruta en donde se encuentran los archivos que tiene que renombrar... por eso utilicé:
Dir:='C:\Windows';
if SelectDirectory (Dir ,[ sdAllowCreate , sdPerformCreate , sdPrompt ], SELDIRHELP ) then
para que el usuario pueda decirme donde están los archivos que necesita renombrar, en este caso solo tiene que cambiar la extensión...esa es la razón de crear un archivo bat.
Una vez que el usuario me indique donde se encuentran los archivos, el programa debe generar el bat y poder ejecutarlo en la ubicación especificada...
Aguardo tu respuesta y gracias por tu ayuda :)

jbecerra 30-03-2015 18:21:50

Otra consulta
 
ecfisa Muchas gracias por tu aporte... sos un groso.. combiné tu código con el mío y funciona de 10 ;)
Te iba a preguntar si conoces alguna herramienta en lazarus para descomprimir una carpeta ZIP, de una ruta especificada por el usuario... Estoy intentado utilizar TUnZipper y descomprime, pero lo hace siempre y cuando le especifique exactamente la ruta y nombre del archivo a descomprmir....pero yo lo que quiero es que descomprima desde una ruta especificada...me explico?
aguardo tu respuesta..
saludos... y gracias por tu ayuda :)

ecfisa 30-03-2015 18:37:13

Hola jbecerra.

Te iba a comentar que también tenes la posibilidad de usar el componente TSelectDirectoryDialog(pestaña Dialogs) en lugar de SelectDirectory, pero va en gustos...

En cuanto a tu otra pregunta no he usado TUnZipper, pero te aconsejo que abras un nuevo hilo (como hiciste con este) para publicar esa consulta.

Hay dos motivos, el primero es que facilita las búsquedas posteriores. Y el segundo, por que al estar como nuevo tema, más compañeros van a ver tu duda y mas posibilidades tendrás de conseguir una respuesta.

Ya lo indica nuestra guia de estilo en el punto 12:
Cita:

12. Solo se permite una pregunta por hilo, es una cuestión de simplicidad y objetividad en las respuestas y facilita las búsquedas.
Saludos :)

jbecerra 30-03-2015 18:44:19

TUnZipper
 
.............


La franja horaria es GMT +2. Ahora son las 21:40:01.

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