![]() |
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" :( |
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 |
Me olvidaba de decirte de quebes sacar del listado de forms que genera automaticamente el proyecto al iniciarce
;) |
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 |
Muchas gracias a los 2. Voy a probar lo de desctruir el form cada vez y ya esta ;)
|
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 :( |
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: |
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; |
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: |
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)
|
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: |
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); Luego, en Form2, en su evento OnCreate, hacemos las inicializaciones pertinentes. Código:
procedure TForm2.FormCreate(Sender: TObject); Código:
procedure TForm2.FormClose(Sender: TObject; |
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: |
Cita:
|
-----------------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 |
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:
Cita:
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 |
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: |
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; |
undeclared intentifier NeedDataFrm :confused:
|
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 04:41:00. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi