Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   [Consulta] Form`s - Volverlos al estado inicial (https://www.clubdelphi.com/foros/showthread.php?t=57438)

tanaka_reina 15-06-2008 05:12:56

[Consulta] Form`s - Volverlos al estado inicial
 
La consulta, viene ya que al realizar una accion con el programa en ejecucion.. completar un formulario X (datos personales, consultas a DB etc), tras cerrarlo y volverlo a abrir los datos continuan(es logico ya que no limpio los componentes).
Si alguien conoce(si es que existe) la forma de volver a 0(o estado inicial) un form(lo que busco es algo tan facil como cuando hacemos Edit1.Clear() :D ) la comente, actualmente lo puedo hacer limpieando cada edit, desconectando componetes(tipo DBgrid) de Querys, pero son bastantes componentes.

Thanks.

Fenareth 15-06-2008 06:54:28

Yo tengo un procedimiento especial para "limpiar o inicializar" componentes... cada vez que lo necesito, sólo lo mando llamar...

Si existe una manera de hacerlo más fácil nos ayudará a ambas saberlo :o :p :D

Saludos,

dec 15-06-2008 11:18:08

Hola,

No sé si servirá en este caso decir que, cuando se destruye un formulario, y se vuelve a crear, este se presenta "inicializado". Es decir, observemos el siguiente código: daría igual la cantidad de "Edits" que hubiera en el formulario "TFormTest", puesto que, siempre que se mostrara el mismo (luego de crearlo) dichos "Edits" estarían con su valor "de inicio".

Código Delphi [-]
begin
  with TFormTest.Create(nil) do
  try
    ShowModal();
  finally
    Free();
  end;
end;

Lepe 15-06-2008 12:32:45

Aparte de lo comentado por dec, sé que es una pregunta simplona, pero, ¿usaís algún bucle?

Lo normal sería:
Código Delphi [-]
procedure Limpia(T:TWincontrol);
begin
for i:= 0 to t.controlCount-1  do
begin
  if controls[i] is TwinControl then Limpia(c)
  else if controls[i] is TEdit then  TEdit(controls[i]).Clear
  else if controls[i] is TDBEdit then TDBedit(controls[i]).Datasource := nil;
end;

Para llamarlo:
Código Delphi [-]
  Limpia(Form1);

Habría que estudiarlo un poco mejor, pero creo que se puede hacer.

Saludos

xEsk 15-06-2008 13:30:25

El único problema de los inicializadores automáticos, es que no siempre un 0 o un '' es un valor inicial... xD

Siempre te toca realizar algunas comprobaciones, en la mayoría de los casos.

Saludos

tanaka_reina 15-06-2008 19:00:54

Cita:

Empezado por dec (Mensaje 293711)
Hola,

No sé si servirá en este caso decir que, cuando se destruye un formulario, y se vuelve a crear, este se presenta "inicializado". Es decir, observemos el siguiente código: daría igual la cantidad de "Edits" que hubiera en el formulario "TFormTest", puesto que, siempre que se mostrara el mismo (luego de crearlo) dichos "Edits" estarían con su valor "de inicio".


Código Delphi [-]
begin
with TFormTest.Create(nil) do
try
ShowModal();
finally
Free();
end;
end;




Agrege en el evento ONCLOSE del formulario

Código Delphi [-]
begin
with Create(nil) do
try
ShowModal();
finally
Free();
end;
end;




Lo que me devuelve, es lo mismo que cuando hago destroy() and Create()... error el componente xxxx ya existe.(y luego Access violation at address 000...)

tanaka_reina 15-06-2008 19:51:23

Cita:

Empezado por Lepe (Mensaje 293713)
Aparte de lo comentado por dec, sé que es una pregunta simplona, pero, ¿usaís algún bucle?

Lo normal sería:

Código Delphi [-]
procedure Limpia(T:TWincontrol);
begin
for i:= 0 to t.controlCount-1 do
begin
if controls[i] is TwinControl then Limpia(c)
else if controls[i] is TEdit then TEdit(controls[i]).Clear
else if controls[i] is TDBEdit then TDBedit(controls[i]).Datasource := nil;
end;




Para llamarlo:

Código Delphi [-]
Limpia(Form1);





Habría que estudiarlo un poco mejor, pero creo que se puede hacer.

Saludos


Error en "c" //if controls[i] is TwinControl then Limpia(c) <<< que tipo seria?, para que funcione le puse el nombre del form, y como resultado tengo un overflow..

Es bueno aclarar que no es solo borrar lo que esta en un edit... sino tambien reiniciar todos sus atributos,a el estado cuando se ejecuto inicialmente el programa (ejemplo, enable:=true, color xxx, etc etc). Como me parece mucho hacerlo uno por uno (ademas que corro riesgo de que se me pase por algo algun atributo y me estropee los datos almacenados en la DB).

Thanks

Lepe 15-06-2008 22:45:29

Código Delphi [-]
procedure TForm1.Limpia(T:TWincontrol);
begin
for i:= 0 to t.controlCount-1 do
begin
if controls[i] is TEdit then TEdit(controls[i]).Clear
else if controls[i] is TDBEdit then TDBedit(controls[i]).Datasource := nil
else if controls[i] is TwinControl then Limpia(controls[i]) // para que limpie los controles que están dentro de paneles
end;

Obviamente lo estoy haciendo de memoria ya que no tengo delphi a mano, ahora deben estar corregidos los dos errores.

Saludos

Caro 16-06-2008 05:10:15

Hola tanaka_reina, si necesitas que se limpie todo al cerrar tu formulario, deberías seguir lo que te explico Dec. El codigo que te puso de ejemplo no debes colocarlo en el OnClose de tu formulario, sino en el momento en que llamas a tu formulario, ademas que debes quitar el formulario del AutoCreate, ya que tu lo crearas y lo liberaras cuando lo necesites.

Para quitar del AutoCreate (Project->Options->Forms).

Si estas haciendo la llamada a tu formulario con Show, haces lo siguiente, digamos que Form1 es el formulario de donde llamaras a Form2:

En Form1, donde llames a Form2

Código Delphi [-]
 Form2 := TForm2.Create(Self); //Creamos Form2
 Form2.Show;

Y en el evento OnClose de Form2:

Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree; //liberamos Form2
end;

Y si estas haciendo la llamada a tu formulario con ShowModal, colocas este codigo en el momento en que lo estas llamando.

Código Delphi [-]
 Form2 := TForm2.Create(Self); //Creamos Form2
 try
   Form2.ShowModal;
 finally
   Form2.Free; //Una vez que se cierra Form2, se libera
 end;

Pero si necesitas limpiar estando dentro de tu formulario, sin cerrarlo, debes hacerlo como te explica Lepe.

Saluditos

tanaka_reina 16-06-2008 05:48:09

La idea apuntaba mas a la respuesta(ahora entendida :P) de Dec (Caro gracias por la explicacion, la verdad no entendia para que era....por eso lo mande donde se me ocurrio).

Hasta hace 5 minutos estaba haciendolo muy manualmente, lo que me llevaba muchos minutos por forms, ahora voy a probar de implementar estas formas(ambas sirven, tanto de limpiar cerrando el form, como sin cerrarlo).

Thanks.

tanaka_reina 16-06-2008 20:06:46

Cita:

Empezado por Caro (Mensaje 293765)
Hola tanaka_reina, si necesitas que se limpie todo al cerrar tu formulario, deberías seguir lo que te explico Dec. El codigo que te puso de ejemplo no debes colocarlo en el OnClose de tu formulario, sino en el momento en que llamas a tu formulario, ademas que debes quitar el formulario del AutoCreate, ya que tu lo crearas y lo liberaras cuando lo necesites.

Para quitar del AutoCreate (Project->Options->Forms).

Si estas haciendo la llamada a tu formulario con Show, haces lo siguiente, digamos que Form1 es el formulario de donde llamaras a Form2:

En Form1, donde llames a Form2


Código Delphi [-]
Form2 := TForm2.Create(Self); //Creamos Form2
Form2.Show;





Y en el evento OnClose de Form2:


Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree; //liberamos Form2
end;





Y si estas haciendo la llamada a tu formulario con ShowModal, colocas este codigo en el momento en que lo estas llamando.


Código Delphi [-]
Form2 := TForm2.Create(Self); //Creamos Form2
try
Form2.ShowModal;
finally
Form2.Free; //Una vez que se cierra Form2, se libera
end;





Pero si necesitas limpiar estando dentro de tu formulario, sin cerrarlo, debes hacerlo como te explica Lepe.

Saluditos

En efecto, funciona, con tan solo 6 lineas de codigo me ahorre cientos... interesante.


La franja horaria es GMT +2. Ahora son las 13:47:52.

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