Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Programa como .bat (https://www.clubdelphi.com/foros/showthread.php?t=73629)

emii89 05-05-2011 22:30:48

Programa como .bat
 
Hola chicos! estoy tratando de crear un programita para programar el apagado de mi pc.

El código en el .bat es sencillo... simplemente es una línea:

shutdown /s /t (segundos)

y para cancelarlo es shutdown -a

Ahora, el programita que quiero lograr es poder escribir en un edit, en cuanto tiempo quiero que se apague la pc, y otro botón para cancelarlo...

Cómo debo hacer??

Me conviene crearlo desde un txt y grabarlo como .bat?? puedo eliminar un bat después de creado?

Caral 05-05-2011 22:41:03

Hola
Muchas preguntas, poco codigo.
En mi caso, como no se de esto, me parece que seria interesante ver como haces todo eso.
Si copias y pegas el codigo aqui, aprenderemos un monton.
Saludos

emii89 05-05-2011 22:42:52

Creo que ya tengo la idea... necesito crear un txt a través de un memo. Luego, guardarlo como .bat y ejecutarlo. Después borrarlo. Será muy dificil?

Caral 05-05-2011 22:44:51

Hola
La respuesta corta: NO, NO.
Saludos
PD: Como me gustaria ver ese codigo, me mata la curiosidad.:D:p

emii89 05-05-2011 22:53:00

Lo estoy consiguiendo!

Cita:

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add('shutdown /s /t '+edit1.text);
memo1.lines.SaveToFile('c:\apagar.bat');
memo1.lines.clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.lines.add('shutdown -a');
memo1.Lines.SaveToFile('c:\apagar.bat');
memo1.lines.clear;
end;
Necesito poder ejecutar y eliminar el .bat desde el código... podré? :P

Caral 05-05-2011 22:58:36

Hola
Yo creo que vas muy bien, claro que podras.
Ahora, una sugerencia, coloca la direccion del archivo .bat en el mismo exe (Application.ExeName).
Saludos

emii89 05-05-2011 23:11:57

Cita:

Empezado por Caral (Mensaje 399099)
Hola
Yo creo que vas muy bien, claro que podras.
Ahora, una sugerencia, coloca la direccion del archivo .bat en el mismo exe (Application.ExeName).
Saludos

No entendí eso... a qué te referís? :O

emii89 05-05-2011 23:14:54

Cita:

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add('shutdown /s /t '+edit1.text);
memo1.lines.SaveToFile('c:\apagar.bat');
WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
memo1.lines.clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.lines.add('shutdown -a');
memo1.Lines.SaveToFile('c:\apagar.bat');
WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
memo1.lines.clear;
end;
Ahora solo me falta eliminar el .bat y empezar a pulir bien el programita :P

emii89 05-05-2011 23:19:03

Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.lines.add('shutdown /s /t '+edit1.text);
  memo1.lines.SaveToFile('c:\apagar.bat');
  WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
  sleep(250);
  DeleteFile(PChar('c:\apagar.bat'));
  memo1.lines.clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  memo1.lines.add('shutdown -a');
  memo1.Lines.SaveToFile('c:\apagar.bat');
  WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
  sleep(250);
  DeleteFile(PChar('c:\apagar.bat'));
  memo1.lines.clear;
end;


Bat eliminado!

En un ratito posteo el programa listo!

Caral 05-05-2011 23:36:16

Hola
Bien, me alegro que lo hicieras solo.
Ahora: El archivo lo envias al directorio c:/, por eso indique que lo colocaras en el mismo directorio que el exe, osea el programa, asi:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 memo1.lines.add('shutdown /s /t '+edit1.text);
 memo1.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'apagar.bat');
 WinExec(PChar(ExtractFilePath(Application.ExeName)+'apagar.bat'),SW_SHOWNORMAL);
 memo1.lines.clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 memo1.lines.add('shutdown -a');
 memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'apagar.bat');
 WinExec(PChar(ExtractFilePath(Application.ExeName)+'apagar.bat'),SW_SHOWNORMAL);
 memo1.lines.clear;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DeleteFile(ExtractFilePath(Application.ExeName)+'apagar.bat');
  Showmessage('borrado');
end;
Saludos

emii89 05-05-2011 23:43:24

Cita:

Empezado por Caral (Mensaje 399105)
Hola
Bien, me alegro que lo hicieras solo.
Ahora: El archivo lo envias al directorio c:/, por eso indique que lo colocaras en el mismo directorio que el exe, osea el programa, asi:
Código Delphi [-]procedure TForm1.Button1Click(Sender: TObject); begin memo1.lines.add('shutdown /s /t '+edit1.text); memo1.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'apagar.bat'); WinExec(PChar(ExtractFilePath(Application.ExeName)+'apagar.bat'),SW_SHOWNORMAL); memo1.lines.clear; end; procedure TForm1.Button2Click(Sender: TObject); begin memo1.lines.add('shutdown -a'); memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'apagar.bat'); WinExec(PChar(ExtractFilePath(Application.ExeName)+'apagar.bat'),SW_SHOWNORMAL); memo1.lines.clear; end; procedure TForm1.Button3Click(Sender: TObject); begin DeleteFile(ExtractFilePath(Application.ExeName)+'apagar.bat'); Showmessage('borrado'); end;

Saludos

AAAA, muy bueno eso! así no tengo que poner ruta, excelente! gracias!

escafandra 06-05-2011 00:43:49

Tambien podrías plantearte hacerlo por código, sin usar archivos bat.

Mira esto.

Saludos.

emii89 06-05-2011 01:33:56

Bien, está interesante... de todos modos quiero terminar el que estoy haciendo, pero evidentemente estoy fallando en algo.
Me tira un eConvertError... en la línea que voy a señalar... me ayudan a descubrir el error?.
Código:

implementation

{$R *.dfm}

Function TForm1.TransformaTiempo:Real;
Begin
  TransformaTiempo:=(StrToInt(EdHora.Text)*3600)+(StrToInt(EdMin.Text)*60)+(StrToInt(EdSeg.Text));
End;

procedure TForm1.BotApagarClick(Sender: TObject);
begin
  MemoBat.lines.add('shutdown /s /t '+FloatToStr(TransformaTiempo));
  MemoBat.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'Apagar.Bat');
  WinExec(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'),SW_SHOWNORMAL);
  Sleep(250);
  DeleteFile(PChar('c:\apagar.bat'));
  MemoBat.lines.clear;
end;

procedure TForm1.BotCancelarClick(Sender: TObject);
begin
  MemoBat.lines.add('shutdown -a');
  MemoBat.Lines.SaveToFile('c:\apagar.bat');
  WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
  Sleep(600);
  DeleteFile(PChar('c:\apagar.bat'));
  MemoBat.lines.clear;
end;

end.


Caral 06-05-2011 01:57:15

Hola
Creo que quieres que la funcion te calcule los segundos en horas, minutos, segundos.
Es asi?.
Saludos

emii89 06-05-2011 02:10:23

Cita:

Empezado por Caral (Mensaje 399117)
Hola
Creo que quieres que la funcion te calcule los segundos en horas, minutos, segundos.
Es asi?.
Saludos

Exacto!! no se por que me tira el error ese.

Caral 06-05-2011 02:20:42

Hola
INT = Integer.
REAL = Float.
Es simple, la funcion debe devolver un valor REAL (float), sin envargo contiene o trasforma los edits en INTEGER.
Analiza esto:
Código Delphi [-]

Function TForm1.TransformaTiempo:Real;
var h,m,s : Real;
Begin
  h:= StrToint(EdHora.Text);
  m:= StrToint(EdMin.Text);
  s:= StrToint(EdSeg.Text);
  TransformaTiempo:= h*3600 + m*60 + s;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MemoBat.lines.add('shutdown /s /t '+FloatToStr(TransformaTiempo));
 MemoBat.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'apagar.bat');
 WinExec(PChar(ExtractFilePath(Application.ExeName)+'apagar.bat'),SW_SHOWNORMAL);
 MemoBat.lines.clear;
end;
Se generan tres variable REAL y se les pasa el valor de los edit, a la hora de hacer el calculo es mucho mas sencillo hacerlo ya que no se tiene que hacer ninguna transformacion.
Espero que lo asimiles, si no pregunta.
Saludos

Caral 06-05-2011 02:37:42

Hola
Ahora, ya que no preguntas, pregunto yo:
Si hago esto:
Código Delphi [-]
Function TForm1.TransformaTiempo:Real;
var h,m,s : Real;
Begin
  h:= StrToint(EdHora.Text);
  m:= StrToint(EdMin.Text);
  s:= StrToint(EdSeg.Text);
  TransformaTiempo:= h*3600 + m*60 + s;
End;
Por que no hago esto ?:
Código Delphi [-]
Function TForm1.TransformaTiempo:Real;
var h,m,s : Integer;
Begin
  h:= StrToint(EdHora.Text);
  m:= StrToint(EdMin.Text);
  s:= StrToint(EdSeg.Text);
  TransformaTiempo:= h*3600 + m*60 + s;
End;
Varia en algo?.
Funcionan las dos?.
Por que?.

Saludos

emii89 06-05-2011 02:52:24

Cita:

Empezado por Caral (Mensaje 399121)
Hola
Ahora, ya que no preguntas, pregunto yo:
Si hago esto:
Código Delphi [-]Function TForm1.TransformaTiempo:Real; var h,m,s : Real; Begin h:= StrToint(EdHora.Text); m:= StrToint(EdMin.Text); s:= StrToint(EdSeg.Text); TransformaTiempo:= h*3600 + m*60 + s; End;

Por que no hago esto ?:
Código Delphi [-]Function TForm1.TransformaTiempo:Real; var h,m,s : Integer; Begin h:= StrToint(EdHora.Text); m:= StrToint(EdMin.Text); s:= StrToint(EdSeg.Text); TransformaTiempo:= h*3600 + m*60 + s; End;

Varia en algo?.
Funcionan las dos?.
Por que?.

Saludos

Solo cambiaste la definición de las variables?
Ninguna de las 2 la logro hacer funcionar, me sigue tirando el error en la misma línea de código!.

Como funcionar, deberían funcionar las 2, siempre y cuando los números que ingreses sean enteros.

Caral 06-05-2011 02:57:06

Hola
Las dos funcionan, la diferencia esta en que la primera DA la posivilidad de colocar decimales, cosa que no es correcta, en este caso.
El error es de conversion, no deberia darlo en ninguno de los dos casos.
Saludos

emii89 06-05-2011 03:00:19

Cita:

Empezado por Caral (Mensaje 399125)
Hola
Las dos funcionan, la diferencia esta en que la primera DA la posivilidad de colocar decimales, cosa que no es correcta, en este caso.
El error es de conversion, no deberia darlo en ninguno de los dos casos.
Saludos

No debería, pero lo da... de hecho mirá lo que hice, para cambiar un poco:

Código:

Function TForm1.TransformaTiempo:Integer;
Var
  H,M,S:Integer;
Begin
  H:=StrToInt(EdHora.Text);
  M:=StrToInt(EdMin.Text);
  S:=StrToInt(EdSeg.Text);
  TransformaTiempo:=H*3600+M*60+S;
End;


procedure TForm1.BotApagarClick(Sender: TObject);
Var
  Tiempo:Integer;

begin
  Tiempo:=IntToStr(TransformaTiempo);
  MemoBat.lines.add('shutdown /s /t '+Tiempo);
  MemoBat.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'Apagar.Bat');
  WinExec(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'),SW_SHOWNORMAL);
  Sleep(250);
  DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'));
  MemoBat.lines.clear;
end;

procedure TForm1.BotCancelarClick(Sender: TObject);
begin
  MemoBat.lines.add('shutdown -a');
  MemoBat.Lines.SaveToFile('c:\apagar.bat');
  WinExec(PChar('c:\apagar.bat'),SW_SHOWNORMAL);
  Sleep(600);
  DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'));
  MemoBat.lines.clear;
end;

procedure TForm1.Cerrar1Click(Sender: TObject);
begin
 Close;
end;

La línea que está en verde me dice que: [Error] Unit1.pas(57): Incompatible types: 'Integer' and 'String'

Caral 06-05-2011 03:11:03

Hola
El error es simplisimo.
El mismo programa te lo esta diciendo.
No son compatibles integer y string.
Veamos tu arreglo:
Hay dos datos iguales, uno el nombre de la funcion y otro el que adhieres a el memo, son el mismo, pero uno es Integer y otro string.
Tu funcion la cambiaste a integer:
Código Delphi [-]
Function TForm1.TransformaTiempo:Integer;
Var
  H,M,S:Integer;
Begin
  H:=StrToInt(EdHora.Text);
  M:=StrToInt(EdMin.Text);
  S:=StrToInt(EdSeg.Text);
  TransformaTiempo:=H*3600+M*60+S;
End;
bien, si funciona entonces deberias de recoger el dato de esa funcion en los mismos terminos, si pide integer, devuelvo integer:
Código Delphi [-]
procedure TForm1.BotApagarClick(Sender: TObject);
begin
  MemoBat.lines.add('shutdown /s /t '+IntToSTr(TransformaTiempo);
  MemoBat.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'Apagar.Bat');
  WinExec(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'),SW_SHOWNORMAL);
  Sleep(250);
  DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'));
  MemoBat.lines.clear;
end;
A ver que te dice ahora.
Saludos

emii89 06-05-2011 03:16:10

Huyy! que bobo que estoy! jaja cuando me empezó a tirar el primer error de conversión, no me di cuenta de que estaba dejando casilleros en blanco!! por eso era el error!! tengo que poner las excepciones! JAJAJA.

Caral 06-05-2011 03:19:56

Hola
Bueno, aqui esta tu seguimiento.
Saludos

emii89 06-05-2011 03:27:11

Ahora tengo problema con la excepción!:

Cita:

procedure TForm1.BotApagarClick(Sender: TObject);
begin
Try
MemoBat.lines.add('shutdown /s /t '+IntToStr(TransformaTiempo));
MemoBat.lines.SaveToFile(ExtractFilePath(Application.ExeName)+'Apagar.Bat');
WinExec(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'),SW_SHOWNORMAL);
Sleep(250);
DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'Apagar.Bat'));
MemoBat.lines.clear;
Except
On E: EConvertError do
Begin
Showmessage ('Estás dejando casilleros en blanco');
EdHora.Text:='0';EdMin.Text:='0';EdSeg.Text:='0';
End;
end;
end;
Qué es lo qué está mal?

Compila, pero me tira error igual.

Caral 06-05-2011 03:32:58

Hola
Excepción ?????
Osea: Quieres que si alguno de los edits esta en blanco salte una execpcion????.
Osea: Quieres dejar que se equivoquen ????.
Osea: mmmmmm.
No hace falta una excepcion cuando se puede hacer que la funcion trabaje dependiendo de .......
Código Delphi [-]
Function TForm1.TransformaTiempo:Real;
var h,m,s : Integer;
Begin
  h:= StrToint(Edit1.Text);
  m:= StrToint(Edit2.Text);
  s:= StrToint(Edit3.Text);
  If h or m or s <> StrToInt('') then // aqui esta la excepcion
  TransformaTiempo:= h*3600 + m*60 + s;
End;
Saludos

emii89 06-05-2011 03:36:42

Cita:

Empezado por Caral (Mensaje 399133)
Hola
Excepción ?????
Osea: Quieres que si alguno de los edits esta en blanco salte una execpcion????.
Osea: Quieres dejar que se equivoquen ????.
Osea: mmmmmm.
No hace falta una excepcion cuando se puede hacer que la funcion trabaje dependiendo de .......
Código Delphi [-]Function TForm1.TransformaTiempo:Real; var h,m,s : Integer; Begin h:= StrToint(Edit1.Text); m:= StrToint(Edit2.Text); s:= StrToint(Edit3.Text); If h or m or s <> StrToInt('') then // aqui esta la excepcion TransformaTiempo:= h*3600 + m*60 + s; End;

Saludos

Buena solución! gracias por ayudarme a pensar! te agradzco mucho de verdad!
Aunque estando algún casillero en blanco, el programa sigue "crasheando" con eso de que "EConvertError ''' is not a valid integer... bla bla bla.

Caral 06-05-2011 03:39:10

Hola
Eso es lo que trato, de que aprendas, si te doy todo resuelto no entenderas.
Me alegro que vayas bien.
Saludos

emii89 06-05-2011 03:43:55

Sí! es cierto, voy a seguir investigando, aunque en un rato seguro me iré a dormir... mañana lo terminaré! seguro!! tengo que poner que no se puedan ingresar letras y demás!

Muchas gracias!

Caral 06-05-2011 04:11:27

Hola
Todo tiene solución.
Efectivamente da el error.
Arreglarlo es solo cuestión de entender el por que de este.
De todos modos aquí hay muchos verdaderos maestros que te podrán decir muchas cosas mas que yo.
Por eso sigo siendo novato.
Saludos

Caral 06-05-2011 20:01:26

Hola
Aqui tienes el ejemplo.
Ahora verifica si los edits estan en blanco.
Saludos


La franja horaria es GMT +2. Ahora son las 10:49:50.

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