![]() |
Optimizando Creación de Formularios MDI
Hola Gente,
Ando ya varios dias buscando pero no con mucha suerte algo referente a una duda que tengo en esto de las aplicaciones MDI. Todo esta ok con referente al formulario padre e hijos, llamados, liberacion de memoria etc, funciona de 10, pero mi aplicación tiene como 30 Forms child y a la hora del llamado es algo engorroso a lo cual se viene mi duda de tener una funcion o procedimiento que me pueda crear mis formularios child ya establecidos. Llamo a los formularios de la sgte forma:
Ahora me entenderan de poner todo eso en los mas de 30 onlclick para llamar a los Forms que tengo en la aplicacion, por eso me parece que un procedimiento .....
.... seria mucho más practico pero nose como hacerlo. Pero de tanto revisar me encontre algo :
Pero no logro acoplarlo a mi codigo, porque el parametro es un string y mi frmC1 es un objeto TfrmC1. Nota: Uso D7. De antemano muchas gracias. |
Creo que la instruccion FindComponent podría serte de ayuda para lo que quieres hacer, espero que así sea. puedes ver ejemplos de su utilización en estos hilos:
http://www.clubdelphi.com/foros/show...=FindComponent http://www.clubdelphi.com/foros/show...=FindComponent http://www.clubdelphi.com/foros/show...=FindComponent Un saludo. |
sigo penando ...
Esto de optimizar me parece complicado, revise tus hilos recomendados pero ninguno llena la expectativa, lo mio es aparentemente simple una funcion que cree los Form child, dichos form ya tiene sus componentes objetos etc.
De antemano muhas gracias. |
Servira esto?
Yo uso la siguiente funcion
Y la llamo asi ShowForm(tfrmVentas); Se que son para ventanas modales pero podrias acomodarlas para MDI. Saludos |
Yo uso una pequeña variante de jcarteagaf. Al hacerlo así, tenemos que añadir los "uses" de la ventana que queremos crear; con el tiempo y muchos Forms hijos, acabamos con referencias circulares y un dolor de cabeza.
El tipo "TOpen" lo añado a una unidad publica.pas (sin form asociado), todas las ventanas hacen uso de ella. Cada ventana hija, tiene en el Onclose Action := cafree, por lo que se libera de memoria. Tampoco uso las variables globales FrmCliente, FrmFactura que propone delphi. Saludos |
Hola...
Yo uso un procedimiento como este:
Saludos... |
Tomando lo mejor de todos
Me disculpan apreciados compañeros, pero en mi humilde conocimiento al respecto me parecen que han estado escribiendo código -que muy bien puede servir- no es el más adecuado a mi parecer.
El código original propuesto por nelostanley es el que devería de seguirse. Acá mi sugerencia: Espero sirva de algo. Saludo. [/font] |
afinando algunas dudas
Antes de todo, muchas gracias por su ayuda a todos, les cuento que ya me estaba resignando y tuve que poner todo mi "extenso" codigo en cada onclick :).
Vayamos al grano .... Probe dos sugerencias que me venian como anillo al dedo ... las demas se ven interesantes pero al tratar de hacerlas me complique un poco asi que las obvie. del amigo maeyanes ..... funciono casi perfecto, pero hay un detalle, cuando dentro del mismo formulario quiero a acceder a:
muestra el clasico error "Access Violation" ..... al revisar paso a paso muestra "inaccesible value" .... entonces decide cambiar a ....:
entonces compilo y funciono correctamente ...entonces va mi pregunta existe alguna forma que funcione el procedimiento .... indicando la referencia del frmC1 ?? el motivo que no funcione ??.... segun mi humilde opinion es porque al declarar TfrmClass implica ya por defecto los componentes de la clase del Form?? Pero debo serles sincero me gusto a primera vista los del amigo D&W obviamente entenderan que esta casi un 90% de mi codigo original. Pero compila muy bien pero al llamar al procedimiento me manda el clasico error "Access Violation" ..... quice pincelear un poco el codigo pero ....no pude. Quizas sino fuera molestia y para cerrar este hilo me gustaria que aclararan mis dudas haciendo referencia a las propuesta de D&W y maeyanes. De antemano muchisimas gracias. |
¿código adecuado? Perdona D&W, pero no se ha dicho si quiere una instancia o varias del mismo Form, hecho que nos haría modificar bastante nuestro código.
Tampoco se dice si se quiere tener una referencia a la ventana creada, o no le importa. Código adecuado no creo que exista, lo tendrá que adaptar a sus necesidades y a su gusto. Al menos yo pretendía dar ideas, después él tendrá que adaptarlo. Cita:
Otros comentarios: - La línea 3 puede quitarse, como son mdichild, al crear la ventana se muestra por defecto. nelostanley en el código de maeyanes, no verás ninguna parte hacer referencia a frmC1, por eso no puedes hacer referencia con frmC1.LoQueSea. Aunque es fácil convertir ese procedimiento a una función y que devuelva el "aForm". Saludos |
un empujonsito mas ...
Cita:
Gracias por tu tiempo. |
Dentro de un tiempo, no tanto como crees, sonreirás al ver este mensaje ;). Te invito a que intentes deducir qué hace el código metiendo ShowMessages, cambiando líneas de código, etc, ya que es la única forma de aprender.
Ahora puedes llamar a esa rutina así:
Saludos |
no da....
Compila correcto ... pero cuando haces refrencia a F.Cualquiercosa sigue el error de "Access Violation".
Ejm. Cuando en un reporte R1 quieres hacer refrencia algo de F1.CualquierCosa, te tira el mismo error, cosa que no sucede en lo absoluto cuando llamas al formulario.
Asi corre de 10 !! pero cuando lo llevas a la funcion o procedimiento no funcina las refrencias. Para evitarme recodificar varias cosas he optado por llamar algunos formularios directamente sin funcion o procedimiento. Ojala alguien tenga un poquito de paciencia, sino de todas formas gracias. |
Supongo que no estas haciendo la asignación al llamar a la función.
La llamada debiera lucir algo como esto:
Hasta luego. ;) |
Cita:
En la Unit del TForm1, no harás referencia para nada a FrmC1 ¿verdad? Me explico, si tienes un código así:
Eso dará un Access Violation, porque estamos creando la ventana con la variable "F" (desde nuestra rutina), pero en el TForm1 estamos usando la variable frmC1 que no ha sido creada, tiene un puntero nulo. Saludos |
Cita:
Cita:
Cita:
Cita:
aquí va la modificación, espero sirva. Para llamar a la función lo haces así:
|
Solo una observación.
Cita:
Si se hacen dos llamadas consecutivas, por ejemplo:
Se tendrá dos instancias de TForm1. Hasta luego. ;) Sugerencia: Si querés crear una rutina que asigne el valor de esa variable, date una vuelta por el código fuente del método CreateForm de la clase TApplication. |
Gracias por la observación jachguate tienes toda la razón. Nunca había probado el código hasta después de lo que me comentastes. Ya lo he reparado -según yo- :)
Para llamarlo así:
Saludos. |
Si ves el método que he propuesto, te darás cuenta que hay manera de evitar el moldeado de tipo en la llamada.
Hasta luego. ;) |
El moldeado es porque la declaración del procedimiento CreateOrRestoreForm a cambiado y ha quedado así:CreateOrRestoreForm(var aForm : TForm; aFormClass : TFormClass);
No sé que versión de Delphi usa, pero en la 7 no me deja compilar si no hago el moldeado ahora con la declaración Var. Saludos. |
claro, no te dejará en ninguna.
Quien esté interesado, puede darse una vuelta por el método propuesto y realizar la mejora necesaria a la rutina para que esto no sea necesario. Hasta luego. ;) |
La franja horaria es GMT +2. Ahora son las 19:59:02. |
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