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.430
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.430
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: 18
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.430
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
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 18:56:29.


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