Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Como usar RegisterClass en Lazarus ?

Hola,

Como referencia, estoy usando el Lazarus 1.1 que viene con la última versión de Code Typhon.

He creado un paquete que, entre otras cosas, crea un descendiente de un módulo de datos especializado. La compilación del paquete no tuvo problemas. Bueno, reconstruír el IDE es superlento (mas de 20 minutos); pero, la compilación del paquete en sí es rápida. Eso sí, después de configurar las opciones de compilación porque con el default es una tortuga.

La razón de hacer eso es para migrar un aplicativo Delphi a Lazarus que usa ese tipo particular de módulo de datos.

Mi problema empieza cuando ya desde mi proyecto normal voy a abrir el formulario que usa la clase creada. El sistema muestra un error y me pregunta si suspendo la carga de la clase. Si le digo que sí, y después compilo, pasa bien la parte donde se referencia a la clase, por lo que pareciera que sintácticamente la reconoce.

El mensaje de error es :

Unable to find the component class "TMyClass". It is not registered via RegisterClass and no lfm was found

Ahora bien, lo que he investigado es que, al igual que en Delphi, Lazarus debe registrar automáticamente la mayoría de clases "persistentes"; pero, en algunos casos, hay que registrar explícitamente las que deban ser manejada directamente por el IDE de Lazarus, y esto debe hacerse vía RegisterClass.

En teoría sería solo registrar la clase al igual de como se hace con las que vienen con Lazarus; pero, ni la clase padre de la mía, ni otros descendientes de ella que forman parte de las clases que vienen con Lazarus, aparecen registradas en el código fuente de los paquetes Lazarus. O sea, no encontré ninguna lllamada a RegisterClass que usara como parámetro la clase respectiva (incluso hice la busqueda desde el propio directorio C:\codetyphon). Sin embargo, si uso directamente las clases que vienen con Lazarus el asunto si funciona.

Haciendo analogía con Delphi, donde RegisterClass se usa generalmente en el procedure Register junto con RegisterComponents, probé a usar RegisterClass en el procedure Register de la unidad que implementa a esa clase; pero nada.

El procedure Register se usa normalmente para registrar clases creadas en una unidad que interactuan con el IDE; típicamente usando RegisterClass, y RegisterComponents si la clase debe agregarse a la paleta de componentes.

El procedure Register Se debe declarar en la sección de interface e implementarse con algo como :

Código Delphi [-]
Procedure Register;
Begin
       RegisterComponents('Mi paleta', [TMiClase01]);
       RegisterComponents('Mi paleta', [TMiClase02]);
       ......
       ...
       RegisterClass(TMiClase01);
       RegisterClass(TMiClase02);
End;

Igualmente probé a usar RegisterClass en la sección de INITIALIZATION de la unidad de mi proyecto que no carga bien; pero, tampoco funcionó.

Mañana pienso probar poniendo el RegisterClass en el constructor de la clase. Normalmente espero a que se me agoten las ideas antes de hacer preguntas; pero, considerando lo que demora reconstruir el IDE, creo que es mejor documentar ya este caso.

Alguién puede explicar como debe hacerse ese registro de la clase ?.
Responder Con Cita
  #2  
Antiguo 09-10-2012
Avatar de jt.logosoft
jt.logosoft jt.logosoft is offline
Miembro
 
Registrado: jul 2007
Ubicación: San José, Costa Rica
Posts: 19
Poder: 0
jt.logosoft Va por buen camino
Un pequeño aporte

Hola! este tema se trató en el foro de Lazarus, en http://www.lazarus.freepascal.org/in....html#msg26872 , a lo mejor te sirve. No tengo experiencia personal con RegisterClass, y me interesa saber cómo se resuelve.
Responder Con Cita
  #3  
Antiguo 10-10-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Gracias. No hay progreso

Cita:
Empezado por jt.logosoft Ver Mensaje
Hola! este tema se trató en el foro de Lazarus, en http://www.lazarus.freepascal.org/in....html#msg26872 , a lo mejor te sirve. No tengo experiencia personal con RegisterClass, y me interesa saber cómo se resuelve.
Hola,

Gracias por comentar.

No, ese hilo no ayuda mayor cosa.

Por otro lado, hasta ahora todas las pruebas han fracasado y a estas altura estoy bastante preocupado porque, si esto no funciona, tocaría cambiar a mano muchas cosas. El proceso de migración sería tan lento que se volvería inviable

Lo que no he podido descubrir es como hace Lazarus para registrar las clases del paquete original. Prácticamente ya he copiado toda esa unidad, cambiando lo que necesito; pero, sigo sin conseguir que me funcione y al mismo tiempo no aparece en todo el código de Lazarus una referencia a la clase original que razonablemente pueda siquiera sospechar que es ahí donde se hace el registro.

Ojalá alguién pueda aportar algo más al respecto

Saludos
Responder Con Cita
  #4  
Antiguo 13-10-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Hasa ahora toda ha fracasado. Alguna idea ?

Hola,

Bueno, he seguido probando he investigando. Opté por hacer el ejemplo más sencillo posible; o sea, crea un proyecto de prueba con un único formulario que simplemente desciende de la clase que he definido; sin ningún tipo de código adicional.

Ni siquiera así logro que Lazarus me abra el formulario; aunque si he podido compilar el proyecto. Eso me tiene muy confundido.

Si Lazarus enlaza de manera estática, la única explicación que veo es que la clase en sí está bien. Asumo que lo que falla es su registro con el IDE de Lazarus; pero, como se hace para registrarla en el IDE ?.

No he encontrado ninguna documentación que lo explique claramente. En lo que he leído se dice vagamente que el registro es normalmente automático; pero, no se indica como revisar si una clase está registrada, ni como agregarla manualmente.

Igualmente se menciona una "fábrica de clases"; incluso hay ejemplos de la clase que la implementa; pero, no de como el contenido de esta se enlaza con el IDE.

Así, en la unidad de la clase padre hay un Procedure para efectuar registros que usa ese método de "fábrica". Ese procedimento es incluído automáticamente en la sección de inicialiazación del proyecto de prueba; pero, solo para registrar la última clase creada. Eso igual aplica en los ejemplos que usan el paquete standard y con ellos si funciona.

Dicho así parece algo enredado. Lo voy a poner en perspectiva.

Empecemos con el paquete standard. Ahí tenemos algo así :

TClaseBase ----> TClaseHija1 ----> TClaseHija2 ----> TClaseHija3

Así que la clase que realmente usan los proyectos es TClaseHija3

El procedimiento de registro, que usa la "fábrica" está codificado para TClaseBase y sus descdendientes. Es publicado en la unidad donde se define TClaseBase .

Cuando se genera un proyecto normal el Lazarus crea un formulario en que tenemos algo así :

Código Delphi [-]
TMiClaseProyecto = Class(TClaseHija3)
End;

Y en la sección de inicialización se crea algo así :

Código Delphi [-]
INITIALIZATION
RegisterAlgo('TMiClaseProyecto',TMiClaseProyecto);

Donde, lógicamente, RegisterAlgo es la rutina que mencioné antes para registrar clases.

Esto es lo standard y definitivamente funciona bien. Notese que la llamada a la rutina de registro ocurre solo sobre la última clase de la cadena; o sea, la que se crea solo para el proyecto final. No aparece ni en el proyecto ni en las unidades standard llamadas a RegisterAlgo que apliquen a TClaseHija1, TClaseHija2 o TClaseHija3.

Yo que hice. Escribí un paquete análogo así

TClaseBase ----> TMiClaseHija1 ----> TMiClaseHija2 ----> TMiClaseHija3

En ese enfoque, mis 3 clases descienden de la misma clase base que las clases análogas del paquete standard. Esa clase base y su procedimiento de registro están en unidades suministradas por el paquete standard.

Mi paquete compila y se instala sin errores

Así pués, confiando en eso, yo creo mi proyecto y hago también lo mismo que en la generación autmática que usa el standard; o sea,

Código Delphi [-]
TMiClaseProyecto = Class(TMiClaseHija3)
End;

Y la sección de inicialización es la misma que en el proyecto creado por el ejemplo standard.

Sin embargo, aquí si no funciona. En cambio, cada vez que trato de abrir el formulario me dice que TMiClaseHija3 no está registrada con RegisterClass; pero, como he dicho antes, para las clases análogas del standard (TClaseHija3, etc) no aparecen llamadas que las registren. Bueno, al menos la busqueda de texto que hago en todo el subdirectorio CodeTyphon no encuentra nada (Y lo hago desde CodeTyphon por seguridad, debería ser solo sobre el directorio fuente del paquete standard)

Alguna idea ?
Responder Con Cita
  #5  
Antiguo 07-11-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Unhappy Aún no hay solución. Alguna sugerencia ?

Hola a todos,

Mis prioridades cambiaron en las últimas semanas y he tenido abandonado este tema.

Estoy retomándolo y veo que aún no hay ninguna idea de como solucionarlo.

Por mi parte, estuve intentándo un rato; pero, aún nada.

Agradezco cualquier sugerencia, ya que sin resolver esto, no puedo avanzar en absolutamente más nada con Lazarus
Responder Con Cita
  #6  
Antiguo 18-12-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Red face Aún sin solución. Nuevo enfoque

Hola a todos,

Ha pasado muchísimo tiempo y nadie parece saber nada de este tema.

Por mi parte, después de que retomé el tema, hice varios intentos sin ningún éxito. Finalmente, ante su liberación acabo de instalar el nuevo CodeTyphon 3.1; pero, el problema sigue igualito y se me ha vuelto crítico porque sin esto no tiene sentido desarrollar nada de mi proyecto en Lazarus.

Hoy más que nunca necesito solucionarlo porque fuimos donde un cliente y nos exigió que pusieramos la parte de servidor en Linux.

Por eso quiero cambiar el enfoque de la pregunta y para ello he abierto un nuevo hilo :

http://www.clubdelphi.com/foros/showthread.php?t=81795
Responder Con Cita
  #7  
Antiguo 19-12-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Rolando.

De Lazarus no sé gran cosa, pero me pregunto si has intentado "aislar" el problema.

Es decir, crear una nueva aplicación en blanco con lo mínimo necesario para producir el error. Y a partir de ahí revisar el código propio y de bibliotecas que pudiera estar causando el fallo.

Saludos.
Responder Con Cita
  #8  
Antiguo 19-12-2012
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Si, por supuesto.

Cita:
Empezado por Al González Ver Mensaje
Hola Rolando.

De Lazarus no sé gran cosa, pero me pregunto si has intentado "aislar" el problema.

Es decir, crear una nueva aplicación en blanco con lo mínimo necesario para producir el error. Y a partir de ahí revisar el código propio y de bibliotecas que pudiera estar causando el fallo.

Saludos.
Hola Al,

Gracias por contestar.

Si, por supuesto eso fue lo primero porque, de hecho, como estoy empezando con Lazarus, hago pruebas de cada cosa que necesito migrar.

El caso es que aquí el inconveniente no es un error de lógica en el código mio sino de desconocimento de como opera el mecanismo de registro de Lazarus para estos data module.

He revisado el código de fpweb que viene con Lazarus, incluso tan solo usando una copia del mismo a la que le he cambiado nombres de clases y verificando con Winmerge los cambios; pero, nada funciona. Supongo que hay alguna otra parte de código que maneja esa parte de registro automática que mencionan en varias partes; pero, ni haciendo busqueda en todo el directorio de CodeTyphon he encontrado archivos con palabras claves que aparezcan en fpweb que me sugieran que puede estar faltando.

Por eso es que abrí el otro hilo, en la esperanza de que alguien que haya desarrollado un descendiente, similar al que necesito, describa los pasos que siguió y yo pueda detectar que es lo que me hace falta.

Saludos
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
Como usar SQLite con Lazarus¿ mcs Lazarus, FreePascal, Kylix, etc. 6 12-03-2014 00:04:57
Usar componentes de Lazarus en Delphi buenarquero Varios 12 22-11-2011 17:52:02
Que versión de Lazarus usar? mcs Lazarus, FreePascal, Kylix, etc. 27 13-12-2010 19:29:47
ayuda para usar lazarus Robert01 Linux 9 21-08-2006 11:09:35
RegisterClass MARIOR Varios 1 06-01-2004 11:53:30


La franja horaria es GMT +2. Ahora son las 09:38:49.


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