Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2010
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Creador generico de formulario.

Hola club... aqui liandome la cabeza yo solo...

en mis progamas siempre para crear/mostrar los formularios uso las siguientes lineas:
Código Delphi [-]
if not Assigned(Form) then
  Application.CreateForm(TForm, Form);
Form.Show;

y luego al cerrar los formularios en el evento OnClose le coloco estas otras lineas
Código Delphi [-]
  Action := caFree;
  Form := nil;

Como el código lo tengo que repetir una y otra vez, me puse a darme solo contra el código e hice este procedimiento, basandome en lo que he leido aqui en el club y en otras partes:

Código Delphi [-]
procedure CreateForm(ClassName: TPersistentClass; FormName: String);
  var
    Component : TComponent;
begin
  Component := Application.FindComponent(FormName);
  if not Assigned(Component) then begin
    try
      FindClass('T'+FormName);
    except
      classes.RegisterClass(ClassName);
    end;
    Application.CreateForm(TComponentClass(ClassName), TForm(FormName));
  end else
      TForm(Component).Show;
end;

Funciona!... pero cuando voy a cerrar el formulario... en algunas ocasiones, me lanza un error "Invalid pointer"... y no se donde está el error exactamente pq es lo único que dice... además que no se deja capturar para revisión... solo sale el error y ya...

de ahi en adelante, el programa sigue trabajando bien hasta que lo cierro y vuelve a sacar el error una y otra vez.

el error "Invalid pointer" no sale siempre, como puede salir en relación 1:10, tambien puede ser 1:1 o 1:20...

se que es un error en el procedimiento que cree, pq al usarlo de la otra manera... ya no salen errores.

bueno ya dejo de tirar lora... y si alguien me puede hacer un comentario o aporte... se lo agardeceré.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #2  
Antiguo 02-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo creo que esta línea te puede estar dando problemas:

Código Delphi [-]
  
Application.CreateForm(TComponentClass(ClassName), TForm(FormName));

En el segundo parámetro estás haciendo el CAST como TForm de un string.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 02-03-2010
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
así lo ví en un sitio... creo que fué en aboutdelphi... y funciona... a mi también me pareció extraño... pero funcionó... la cuestión es cuando voy a cerrar dicho formulario... y eso no todas las veces.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #4  
Antiguo 02-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo en todo caso lo hubiera puesto así:

Código Delphi [-]
Application.CreateForm(TComponentClass(ClassName), TForm(component));
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 02-03-2010
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Así me genera un error cuando el formulario no ha sido creado aún... la primera línea evalúa si el formulario está creado... cuando no está creado devuelve siempre nil y si lo coloco como parametro del CreateForm me genera un error.

Quité el cast, dejando solo el string como parametro y es más estable que antes... ya el error se presenta muy pocas veces.
Código Delphi [-]
Application.CreateForm(TComponentClass(ClassName), FormName);
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #6  
Antiguo 02-03-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Hola movorack, en éste hilo se ha tratado el tema del error y en mi opinión particular para poder resolverlo creo que la respuesta de hach es la mejor solución.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 02-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sigo pensando que esa referencia al nombre del formulario va a dar siempre error.
Yo lo he probado cambiando por component, tal y como te he dicho antes y eliminandole el último else y parece que funciona.

Aquí te subo el ejemplo.

Código Delphi [-]
procedure CreateForm1(ClassName: TPersistentClass; FormName: String);
var
  Component : TComponent;
begin
  // busco si el form está ya creado  (a)
  Component := Application.FindComponent(FormName); 
  // No está creado?  ==> Lo creo
  if not Assigned(Component) then begin
    try
      // Buscar la clase
      FindClass('T'+FormName);
    except
      // si no la ha encontrado la registro
      classes.RegisterClass(ClassName);
    end;
    // Creo el form a partir de la clase (queda en component -referencia-) (b)
    Application.CreateForm(TComponentClass(ClassName), component);
  end;

  // Abro el form, ya sea por encontrado(a) o por creado(b)
  TForm(Component).Show;
end;
Archivos Adjuntos
Tipo de Archivo: zip OpenForms.zip (11,3 KB, 10 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 02-03-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

El problema que veo no está en cómo se crea el formulario sino mas bien en cómo se está destruyendo, recalco el problema del FreeAndNil(bueno en éste caso se asigna "nil" al formulario en el evento OnClose) es la cuestion y creo que roman lo a explicado claramente en éste hilo.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 02-03-2010 a las 14:38:20.
Responder Con Cita
  #9  
Antiguo 02-03-2010
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por rgstuamigo Ver Mensaje
El problema que veo no está en cómo se crea el formulario sino mas bien en cómo se está destruyendo
Gracias rgstuamigo, de verdad a mi tampoco me gusta mucho esta forma... la uso porque me "funciona" ... leí el hilo y me parece interesante el comentario de román... aunque en realidad no habia tenido problemas con la destrucción del formulario.

Cita:
Empezado por Neftali Ver Mensaje
Yo lo he probado cambiando por component, tal y como te he dicho antes y eliminandole el último else y parece que funciona
Gracias Neftali, si funciona y no me ha arrojado ningún error hasta ahora... bacano.

--
Comparto este artículo que encontré (Understanding the Birth, Life and Death of a Delphi Form), pues me parece relevante al tema...
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
Respuesta



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
Procedimiento Generico para oprimir un boton GerTorresM Varios 4 29-12-2009 15:24:35
procedimiento de asignación genérico gushynet OOP 23 09-09-2008 10:50:15
Apuntar a un tipo genérico Guillermo80 Varios 4 09-03-2008 11:48:22
reporte generico piyugo Impresión 8 07-05-2004 18:20:03
Configuar Generico/solo texto en Win 2000 sperezp Impresión 0 13-01-2004 15:13:43


La franja horaria es GMT +2. Ahora son las 10:41:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi