FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#21
|
||||
|
||||
Problemas no hay ninguno mientras no solapes las 2 creaciones del objeto.
Esto es inaceptable:
Porque desde una clase TFRameCamAlt, estas intentando liberar la memoria del objeto que lo instancia. Imagina un código así: Cuando el usuario pulse el botón salir, se querrá liberar la variable FrameCamAlt que sabe dios si está creada o no. La solución a tu problema, desde mi punto de vista, es crear al frame un evento OnSalir, cuando el usuario pulsa el botón salir, se lanza ese evento, que lo recoge la ventana donde se creó el Frame, y desde allí se destruye el Frame. Resultará complejo, pero deberías hacerlo así: Definición del Frame:
Ahora la ventana donde quieres incluir el frame en ejecución:
Aquí está el detalle importante: La misma ventana que crea el frame es el que lo destruye. Además evitas dolores de cabeza, muy típico cuando depuras un programa: "El frame se crea en el form1... pero ¿donde se destruye? ahhh ... siii, en el Form25 cuando se pulsa el boton XXX"... demasiado lío compañero. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 01-04-2007 a las 02:40:19. |
#22
|
||||
|
||||
No sé si para la plataforma Net exista una componente llamado TNotebook que en delphi 7 se dencuentra en la paleta win 3.1, es algo antiguo y por eso no estoy seguro. Si no exite todavía podrías utilizar el TpageControl y en cada página colocar un frame (modulo) distinto y cambiar la página activa como PageControl1.activepage := X
con esta forma te evitarás el enorme trabajo de estar ocultado y mostrando los frames. El PageControl lo puedes personalizar para no mostrar las ventanas, aún así yo en lo personal prefiero utilizar el TNoteBook porque obtengo una mejor apariencia, y creo que sería la mejor para tí. El problema con el PageControl es que a pesar de ocultar las pestañas, este se muestra de un forma 3D, que creo que no haría uniformidad con tu aplicación. Puedes buscar alternativas en internet. La mejor alternativa que conozco es un componente que creo que se llama TNoteoBookForm o algo por el estilo, es del paquete LM Tools, tienen un paquete gratuito y otro comercial, talvez el componente que te mensiono sea parte del gratuito. Te aseguro que sería lo mejor que puedes obtener para tu apliación ya que carga formularios en páginas de un NoteBook. de esta formar ahorraría mucha memoría. |
#23
|
||||
|
||||
Cita:
Puse todo el código que me recomendó Lepe nada mas que modifiqué un poco el procedimiento RecibeEventoSalir, lo puse de la siguiente manera: Esto lo hice para poder usarlo con algunos Frames que tengo en la aplicación (ahí solo muestro 2, pero son mas). El error que me marca es el de Abstract Error, después de la última línea del código que acabo de poner, pero la primera vez que lo ejecuto no, hasta la segunda pasa. Cita:
Cita:
Cita:
__________________
"Sé de tal manera y vive una vida tal, que si todos los hombres fueran como tú y vivieran como tú, nuestro mundo sería un paraíso terrenal" Siempre hazlo con la ayuda de Dios
|
#24
|
||||
|
||||
Estas usando ese mismo evento para destruir varios frames, y debe tenerse en cuenta.
Por ejemplo: - has creado 2 frames (para simplificar los nombres) uno es "Cam" y el otro "Cli". - Ahora cierras un frame. - Se ejecuta el evento TForm2.RecibeEventoOnSalir que liberará de memoria los dos frames ¿eso no importa? Lo pregunto porque yo no sé la lógica de tu programa, pero al menos no lo veo del todo correcto. Una posible solución sería esta:
El truco viene de la definición del frame, en la línea que se lanza el evento: como ves, se le pasa el parámetro "Self", que será un TFrameCamAlt o un TFrameCliAlt, según quien lance el evento. De esta forma solo liberamos el Frame donde se pulse el boton salir. No lo he dicho, pero en el OnClose del TForm2 también tendrías que mirar si hay algún frame creado para liberarlo. El "Abstract error" viene a decir que estamos ejecutando un método que está marcado como abstracto (abstract es una palabra reservada de delphi) que precisamente se pone para eso, para evitar un problema mayor del que estas teniendo. Imagina que el programa se cierra sin indicar ningún mensaje de error... ¿por donde empiezas a buscar?. Ahora te muestra el mensajito de error y ya sabes que el problema está en la creación y destrucción de objetos, y es más que probable que hayas creado un método así: cuando debería decir: Para indicar que ese método que estas creando no es uno nuevo, sino que sustituye a uno existente en la clase de la que estas heredando (esa clase puede ser un Frame, un Form, etc). Saludos y buena caza.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#25
|
||||
|
||||
Hice eso que me mencionabas del "Sender", pero lo último que me propones no se donde ponerlo, la creación de los frames la hice como me indicaron Dec y tu, al darle click a un botón, pongo el siguiente código:
Donde se tiene que poner eso de override?
__________________
"Sé de tal manera y vive una vida tal, que si todos los hombres fueran como tú y vivieran como tú, nuestro mundo sería un paraíso terrenal" Siempre hazlo con la ayuda de Dios
|
#26
|
||||
|
||||
Se hace cuando heredas de un frame o de una forma, normalmente usas estos 2 métodos especiales:
Si no has usado ni constructor ni destructor, pues.... el problema vendrá por otro sitio. Como ya ves es difícil de resolver, precisamente porque ese tipo de fallos son de concepto (crees que estas haciendo las cosas bien) y no detectas el fallo. La solución viene por estudiar (con F1 por ejemplo) todo aquello que puedas intuir que da fallos, y comprobar que está bien. No sé si pueda ayudarte el Call Stack. Primero activa tools- > options -> debugger "Stop on delphi exception", así al producirse la excepción "abstract error" el IDE de delphi se parará, a continuación mira en View -> Stack Call (llamadas de pila). Las primeras llamadas serán bastante raras y no te sonarán de nada, pero si sigues mirando, igual encuentras algún elemento de tu programa (un Form, un frame) etc, y muy probablemente se encuentre el error por ahí. Suerte
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Frames | Caro | Varios | 4 | 17-06-2005 16:55:01 |
Varios forms, frames y un Data Module | gluglu | Varios | 1 | 07-04-2005 19:28:51 |
Uso de Frames | jdangosto | OOP | 7 | 20-01-2005 00:15:03 |
Frames | pepelu1975 | OOP | 2 | 21-05-2004 17:32:01 |
Frames | pepelu1975 | Varios | 2 | 17-02-2004 18:00:30 |
|