Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-03-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 22
Albano Va por buen camino
Hola a todos! Otra vez con problemas referentes al tema de Frames, a continuación lo describo:
Por aqui anduve leyendo y me encontré con que, para destruir un componente de manera sencilla en alguna parte de mi aplicación, el owner tendría que ser yo o "nil", asi que tengo el siguiente código para crear mi frame:
Código Delphi [-]
  FrameCamAlt := TFrameCamAlt.Create(nil);
  FrameCamAlt.Parent := panelcontenido;
Aqui, como pueden ver, creo el frame con owner = nil y lo pongo sobre un panel (por lo menos eso es lo que creo que hago).
Después trato de destruir este frame con un botón que tengo en el mismo frame con el siguiente código:
Código Delphi [-]
procedure TFrameCamAlt.BtnSalirClick(Sender: TObject);
begin
  FrameCamAlt.Free;
end;
En algunas ocaciones me han dicho que debo de tener cuidado al momento de destruír los componentes. que debo hacer que apunte a nil nuevamente, pero eso no lo entiendo, además, con lo que he hecho hasta ahora, me marca el error de
Cita:
Abstract Error
Qué tengo que hacer para destruir mi frame de manera correcta?
Gracias otra vez...
__________________
"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
Responder Con Cita
  #2  
Antiguo 31-03-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 26
vtdeleon Va por buen camino
Prueba con FreeAndNil(FrameCamAlt)

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 31-03-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 22
Albano Va por buen camino
Sigo teniendo el mismo problema, pero acabo de darme cuenta de que la primera vez que lo destruyo no pasa nada, solo aparece a partir de la segunda ocación que lo elimino. Es que este frame lo puedo mandar llamar varias veces sin necesidad de salirme del programa.
La solución que estoy pensando implementar es ocultar el frame cada vez que oprima el botón de salir y destruirlo al salirme de la aplicación, ¿hay otra solución?
__________________
"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
Responder Con Cita
  #4  
Antiguo 01-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Problemas no hay ninguno mientras no solapes las 2 creaciones del objeto.
Esto es inaceptable:

Código Delphi [-]
procedure TFrameCamAlt.BtnSalirClick(Sender: TObject);
begin
  FrameCamAlt.Free;
end;

Porque desde una clase TFRameCamAlt, estas intentando liberar la memoria del objeto que lo instancia.

Imagina un código así:
Código Delphi [-]
var x:TFrameCamAlt;
begin 
  x := TFrameCamalt.Create(nil);

end;
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:
Código Delphi [-]
TFrameCamAlt = class(Tframe)
...
private 
   FOnSalir : TnotifyEvent;
public
   property OnSalir:TnotifyEvent read FOnSalir write FOnSalir;
end;

implementation

procedure TFrameCamAlt.BtnSalirclick(....);
begin
  if Assigned(FOnSalir) then FOnSalir(Self);
end;

Ahora la ventana donde quieres incluir el frame en ejecución:
Código Delphi [-]
TForm1 = class (TForm);
...
private 
    CamAlt : TFRameCamAlt;
    procedure RecibeEventoSalir(Sender:TObject);
....

implementation

procedure Tform1.FormCreate(...); supongo que creas el frame al crear el Form
begin
   CamAlt := TFRameCamAlt.Create(nil);
   CamAlt.OnSalir := RecibeEventoSalir;
end;

procedure TForm1.RecibeEventoSalir(Sender:TObject);  
begin
  FreeAndNil(CamAlt);
end;

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.
Responder Con Cita
  #5  
Antiguo 25-04-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 22
Albano Va por buen camino
Cita:
Empezado por Lepe
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.
Ya seguí estos pasos y sigo teniendo el mismo problema... Voy a escribir lo que hice:
Puse todo el código que me recomendó Lepe nada mas que modifiqué un poco el procedimiento RecibeEventoSalir, lo puse de la siguiente manera:
Código Delphi [-]
procedure TForm2.RecibeEventoOnSalir(Sender: TObject);
begin
  if FrameCamAlt <> nil then FreeAndNil(FrameCamAlt);
  if FrameCliAlt <> nil then FreeAndNil(FrameCliAlt);
end;
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:
Empezado por Lepe
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.
Me gusta la idea, muchas gracias por el tiempo que tomaste para explicarmelo, espero que pueda hacerla funcionar.

Cita:
Empezado por D&W
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í.
Lo malo de esta opción sería la cantidad de Frames que utilizo, son algunos y no es recomendable tenerlos todos creados. Pero muchas gracias por la opción, creo que la voy a usar en otro proyecto que tengo pensado hacer muy pronto.
Cita:
Empezado por Roman
Lo que tienes que implementar es la forma de colocar uno u otro Frame según la opción del menú seleccionada. Yo he hecho esto, pero como he usado muy pocos Frame, opté por insertarlos todos de inicio y sólo cambio su visibilidad según me muevo por el menú. Pero si sin muchos módulos, lo mejor será crearlos bajo demanda.
__________________
"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
Responder Con Cita
  #6  
Antiguo 26-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
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:
Código Delphi [-]
procedure TForm2.RecibeEventoOnSalir(Sender: TObject);
begin
  if (FrameCamAlt <> nil) and (Sender is TFrameCamAlt) then FreeAndNil(FrameCamAlt);
  if (FrameCliAlt <> nil) and (Sender is TFrameCliAlt)then FreeAndNil(FrameCliAlt);
end;

El truco viene de la definición del frame, en la línea que se lanza el evento:
Código Delphi [-]
FOnSalir(Self);
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í:
Código Delphi [-]
constructor Create;
procedure  Close;
cuando debería decir:
Código Delphi [-]
constructor Create;override; 
procedure  Close;override;
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.
Responder Con Cita
  #7  
Antiguo 26-04-2007
Avatar de Albano
Albano Albano is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nogales, Sonora, Mexico
Posts: 422
Poder: 22
Albano Va por buen camino
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:
Código Delphi [-]
  RecibeEventoOnSalir(Sender);
  FrameCamAlt := TFrameCamAlt.Create(nil);
  FrameCamAlt.OnSalir := RecibeEventoOnSalir;
  FrameCamAlt.Parent := panelcontenido;
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
Responder Con Cita
  #8  
Antiguo 16-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 14:51:43.


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
Copyright 1996-2007 Club Delphi