![]() |
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 |
Bueno, situemonos :D ya me rio por no llorar :D
Con esto he conseguido que cuando cierro y vuelvo a entrar me aparezca todo perdeterminado. Ahora bien, dentro de este formulario que detruyo y creo, tengo 1 dataset y 1 query que la primera vez que ejecuto funcionan pero al destruir y volver a crear no funcionan :confused: |
Bien!! :)
Ahora si pones un breakPoint en el OnCreate (donde lanzas la Query) passa siempre, verdad? Si no es así.... mal rollo, estamos donde al principio (a no ser que no pase por alguna sentencia condicioinal :D) Si es así.... a no ser que no se ejecute por alguna sentencia condicional o que no contenga valores correctos (cosa rara porque se crea de 0 el Form).... no se me ocurre nada. Aunque podrías poner todo el código (sino es muy largo :p) del OnCreate y lo miramos entre todos (un millon de ojos ven más que 2) Pero asegurate que se ejecuta el OnCreate cada vez que llamas al formulario |
Comprobado que pasa por el OnCreate cada vez que pincho para entrar en el formulario.
procedure TPresu.FormCreate(Sender: TObject); begin // Alineacion a la derecha SysLocale.MiddleEast := True; valor:=0; Edit1.BiDiMode := bdRightToLeft; Edit2.BiDiMode := bdRightToLeft; Edit3.BiDiMode := bdRightToLeft; Edit4.BiDiMode := bdRightToLeft; Edit5.BiDiMode := bdRightToLeft; Edit6.BiDiMode := bdRightToLeft; Edit7.BiDiMode := bdRightToLeft; Edit8.BiDiMode := bdRightToLeft; Edit9.BiDiMode := bdRightToLeft; Edit10.BiDiMode := bdRightToLeft; Edit11.BiDiMode := bdRightToLeft; Edit12.BiDiMode := bdRightToLeft; Edit13.BiDiMode := bdRightToLeft; Edit14.BiDiMode := bdRightToLeft; Edit15.BiDiMode := bdRightToLeft; Edit26.BiDiMode := bdRightToLeft; Edit27.BiDiMode := bdRightToLeft; Edit28.BiDiMode := bdRightToLeft; Edit29.BiDiMode := bdRightToLeft; Edit30.BiDiMode := bdRightToLeft; Edit31.BiDiMode := bdRightToLeft; Edit33.BiDiMode := bdRightToLeft; Edit37.BiDiMode := bdRightToLeft; Edit38.BiDiMode := bdRightToLeft; Edit41.BiDiMode := bdRightToLeft; Edit42.BiDiMode := bdRightToLeft; Edit43.BiDiMode := bdRightToLeft; Edit44.BiDiMode := bdRightToLeft; Edit45.BiDiMode := bdRightToLeft; Edit46.BiDiMode := bdRightToLeft; Edit51.BiDiMode := bdRightToLeft; Edit52.BiDiMode := bdRightToLeft; Edit54.BiDiMode := bdRightToLeft; Edit56.BiDiMode := bdRightToLeft; Edit59.BiDiMode := bdRightToLeft; Edit63.BiDiMode := bdRightToLeft; Edit64.BiDiMode := bdRightToLeft; Edit65.BiDiMode := bdRightToLeft; // fin alineacion a la derecha //esto lo puse pq como no cargaba // pero sin esto la primera vez me carga el query y funciona //o sea que esto no sirve para mucho qobj.Active:=false; qobj.sql.Clear; qobj.SQL.add('Select * from objur order by nombre'); qobj.Open; //fin query end; :rolleyes: |
Esto no lo puedes hacer en diseño?
Cita:
Código:
varBueno, con lo que respecta a la Query, cuando dices que no te funciona... a qué te refieres? no hace el Open? hace el Open pero no se visualizan valores? hace el Open, visualiza valores pero son erroneos? Tienes la Query enlazada a algún componente DataAware para visualizar sus valores? La tierra es redonda? Mi mamá me mima? :p |
Mi mama tambien me mima :D
En el edit 1 cuando introduzco 1 numero, tiene que hacer 1 busqueda y si no la encuentra abrirme 1 nuevo form :rolleyes: en el cual aparece 1 dbgrid con un "select *" (aclaro que el nuevo form se coge los datos del formulario que estamos tratando). bien en cuanto reconstruimos el form le meto al edit 1 valor existente pero no lo encuentra y me saca el nuevo form con el dbgrid vacio :confused: |
no termino de verlo claro. Si siempre pasa por las inicializaciones... no veo claro el que te funcione la primera vez y no las siguientes
Miraré de hacer alguna prueba y te cuento |
Muchas gracias por tu interes ;)
|
| La franja horaria es GMT +2. Ahora son las 09:43:03. |
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