Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   limpiar todos los valores del formulario (https://www.clubdelphi.com/foros/showthread.php?t=3646)

cisterpe 15-09-2003 18:55:32

limpiar todos los valores del formulario
 
Aqui vengo con otra de mis dudas :rolleyes: .

Tengo 1 formulario con infinidad de Edits y labels, y quiero que cuando el formulario "close" pues que todos los valores vuelvan a su valor por defecto.

¿Es posible?

O tengo que currarme cada elemento con "clear"

:(

Viet 15-09-2003 20:15:42

Lo que se me ocurre es que puedes crear en forma dinamica, y destruir el form cada ves que los cierres.

Eso lo haces con

If Form1=nil Then
Application.CreateForm(TForm1, Form1)
Form1.Show;

Suerte

Viet 15-09-2003 20:20:05

Me olvidaba de decirte de quebes sacar del listado de forms que genera automaticamente el proyecto al iniciarce

;)

roman 16-09-2003 06:15:19

cisterpe,

si el formulario se cierra, ¿cuál es el interés que tienes en sus valores?

Como bien dice viet, si cada vez que lo abres lo creas entonces tendrás siempre los valores originales.

Ahora bien, si necesitas cerrar el formulario pero sin destruirlo puedes borra los valores con un ciclo:

Código:

for I := 0 to Pred(ComponentCount) do
begin
  if Components[i] is TEdit then
    TEdit(Components[i]).Clear
  else if Components[i] is TLabel then
    TLabel(Components[i].Caption) := '';
end;

// Saludos

cisterpe 16-09-2003 09:28:21

Muchas gracias a los 2. Voy a probar lo de desctruir el form cada vez y ya esta ;)

cisterpe 16-09-2003 09:43:32

No me funciona.

El form1 lo crea cuando pulso el boton sin problemas pero le he puesto en el evento OnClose -> form1.destroy; y me da error el compilador cuando estoy ejecutando y cierro el form :(

cisterpe 16-09-2003 09:48:56

Ahora tengo otro problema.

He solucionado el anterior destruyendo el form cuando le pregunto si existe:

If form1=nil Then
begin
Application.CreateForm(TForm, form1);
end
else
begin
form1.Destroy;
Application.CreateForm(Tform1, form1);
end;
form1.show;

Pero la 2ª vez que creo el formulario no me crea los componentes Data source y query que tenia en el formulario
:confused:

__cadetill 16-09-2003 10:16:44

hola cisterpe

Una buena manera para crear y destruir formularios que llamas con el método Show es poner en su evento OnClose esto

Código:

  Action := caFree;
Quizas esto te arregle tu problema

cisterpe 16-09-2003 11:02:58

Gracias Cadetill, pero poniendo lo que tu dices sigue sin funcionar :( .

Lo que no se es pq cuando vuelvo a crear el form de la otra forma que lo he hecho no me crea los controles para la base de datos :confused:

__cadetill 16-09-2003 11:06:21

donde haces la creación, en el OnCreate o en el OnShow? Mira de poner un BreakPoint allí a ver cuando pasa y cuando no (para ir descartando posibilidades)

cisterpe 16-09-2003 12:01:01

El create lo he puesto en el evento onclick de 1 boton.

Evento on close del form (nombre= Presu)

procedure TPresu.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.Enabled:=true; <- (Break point) OK
Action:=cafree;
presu.Destroy;

end;<- (Break point) OK
------------------------------------------------------- <<<Error>>>
end.


Error -> Acces violation at adress 00000002. Read of adress FFFFFFFF

Error -> Abstract error.

Programa sigue funcionando pero si intento volver a crear el form me da el mismo error otra vez.


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Si en vez de eso elimino el form antes de volverlo a crear, no me crea los controles de la base de datos

He añadido al Oncreate del formulario:

qobj.Active:=true;
qobj.sql.Clear;
qobj.SQL.add('Select * from objur order by nombre');
qobj.Open;

por si se borraba y no me da error pero sigue sin funcionar cualquier consulta :confused:

__cadetill 16-09-2003 13:26:03

Veamos, que creo que nos estamos liando :p

Tenemos dos forms (digamos Form1 y Form2). Desde Form1 llamamos a Form2 y queremos que los datos de Form2 se inicialicen cada vez que es llamado.

Primero: si lo haces la llamada con un simple Show, ten en cuenta que se podrá llamar a From2 tantas veces como se quiera des de Form1, por lo que eso habra que contemplarlo. Así que la forma de llamar a Form 2 puede quedar así

Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Form2 = nil then
    Form2 := TForm2.Create(Application);
  try
    Form2.Show;
  except
      FreeAndNil( Form2 );
  end;
end;

de esta manera mostramos la misma instancia de Form2 si ya está creado.

Luego, en Form2, en su evento OnCreate, hacemos las inicializaciones pertinentes.

Código:

procedure TForm2.FormCreate(Sender: TObject);
begin
  // aqui las inicializaciones
end;

Y luego tenemos que asegurarnos de su destrucción en el OnClose del forms (Form2)

Código:

procedure TForm2.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;

A ver si con esto lo logramos arreglar :)

cisterpe 16-09-2003 13:34:24

Si pongo lo que tu dices, tengo el mismo problema, pero en vez de salirme el error cuando salgo me lo presenta cuando intento volver a entrar.


No se si sera pq tiene componentes de base de datos :confused:

__cadetill 16-09-2003 13:37:05

Cita:

Posteado originalmente por cisterpe
No se si sera pq tiene componentes de base de datos :confused:
Pues no, no tiene nada que ver. A ver, haz una cosa, pon lo que haces en los eventos que yo he puesto arriba a ver si localizamos el error

cisterpe 16-09-2003 13:57:47

-----------------OnClick ----------------------------------
procedure TForm1.Presupuestos1Click(Sender: TObject);
begin
IF(FORM1.qlogin['PRESUPUESTO'] ='True') then //permisos usuario
BEGIN
form1.Enabled:=false;

if presu = nil then
presu := Tpresu.Create(Application);
try
presu.Show;
except
FreeAndNil( presu );
end;


// <<<---- Con esto me funciona pero no me carga los sql---->>>
//If Presu=nil then
//begin
//Application.CreateForm(TPresu, Presu);
//end
//else
//begin
//presu.Destroy;
//Application.CreateForm(TPresu, Presu);
//end;
//presu.show;
// <<<-------------- Fin comentarios --------------->>>

END
else
showMesSage('No tiene permisos para acceder a esta zona.');
end;




---------------OnCreate---------------------------
procedure TPresu.FormCreate(Sender: TObject);
begin
SysLocale.MiddleEast := True;
valor:=0;
Edit1.BiDiMode := bdRightToLeft;
.
.
.
.
Edit65.BiDiMode := bdRightToLeft;
qobj.Active:=true; // Por si no cargaba la consulta sql
qobj.sql.Clear;
qobj.SQL.add('Select * from objur order by nombre');
qobj.Open; // fin consulta sql
end;





-----------------On close-----------------------------------
procedure TPresu.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.Enabled:=true;
Action := caFree;
end;


Siento causar tantas molestias :o

__cadetill 16-09-2003 15:53:54

Ante todo, no son molestias, estamos aqui para esto y lo que haga falta (pero sin pasarse, eh!!!) ;)

Bueno, visto tu código, sólo le veo una cosa "rara". Antes de cargar el SQL, estas activando la Query, por lo que... no se cómo no te "peta" ya la primera vez que habres el formulario :confused:

La linea
Cita:

qobj.Active:=true; // Por si no cargaba la consulta sql
yo la cambiaría por
Cita:

qobj.Active:=false; // Por si no cargaba la consulta sql
Ya que antes de cambiar el SQL del Query, hay que desactivar ésta.

Otra cosa que puedes probar (por si no era esto), es poner un breakpoint en el OnCreate y ver cuantas veces pasa por ahí. De esta manera sabrás si la segunda vez que haces la llamada realmente se vuelve a crear la ventana o sencillamente es que se está destruyendo mal

Bueno, ya nos contarás a ver

cisterpe 16-09-2003 17:05:42

Ahi voy con las pruebas

if presu = nil then
presu := Tpresu.Create(Application); <- break point 1
try
presu.Show;
except
FreeAndNil( presu ); <- Break point 2
end;


Al abrirlo la 1ª vez , sin problemas.

Al intentarlo la 2ª cuando le doy a RUN despues de que me de el error el programa se coloca en el break 2

:confused:

__cadetill 16-09-2003 17:47:44

no no, me referia a que pusieras el break en el OnCreate del Form2 (presu). De todas maneras, el error que te da es un Access Violation?

Bueno. Lo acabo de probar y, me da un Access Violation de P.M. :o

Lo que he hecho para solucionar el problema es añadir una linea al OnClose del Form 2 (lo que pasa es que no se si esto puede afectar a la destrucción de los demas componentes del Form, esto te lo diran mejor otros compañeros que dominan más que yo el tema de objetos)

Código:

procedure TForm2.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
  NeedDataFrm := nil;
end;

Lo he probado y pasa cada vez por el OnCreate del Form2 (que es lo que querías, creo)

cisterpe 16-09-2003 18:29:35

undeclared intentifier NeedDataFrm :confused:

__cadetill 16-09-2003 20:01:02

ups, me cole al copiar y pegar, ese el es nombre de mi formulario. Allí tienes que poner el nombre de tu dormulario :o

Lo siento


La franja horaria es GMT +2. Ahora son las 22:54:04.

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