![]() |
Dudas con el funcionamiento del RegisterClasses en Delphi 6.0
Buenas...
Tengo un paquete de runtime con estas unidades... unit uListadosInit; interface implementation uses Classes, uLstUsuariosApp{frmLstUsuariosApp}, uLstAlfabetico{frmLstAlfabetico}, uLstAplicaciones{frmLstAplicaciones}, uLstAppUsuario{frmLstAppUsuario}, uLstEquipos{frmLstEquipos}, uLstEstructura{frmLstEstructura}, uLstEtiquetas{frmLstEtiquetas}, uLstFichaAplicacion{frmLstFichaAplicacion}, uLstInternet{frmLstInternet}, uLstNoFunciona{frmLstNoFunciona}, uLstUbicacion{frmLstUbicacion}, uMDInventario{dmInventario: TDataModule}; initialization RegisterClasses([TfrmLstUsuariosApp,TfrmLstAlfabetico,TfrmLstAplicaciones, TfrmLstAppUsuario,TfrmLstEquipos,TfrmLstEstructura,TfrmLstEtiquetas, TfrmLstFichaAplicacion,TfrmLstInternet,TfrmLstNoFunciona,TfrmLstUbicacion]); finalization UnRegisterClasses([TfrmLstUsuariosApp,TfrmLstAlfabetico,TfrmLstAplicaciones, TfrmLstAppUsuario,TfrmLstEquipos,TfrmLstEstructura,TfrmLstEtiquetas, TfrmLstFichaAplicacion,TfrmLstInternet,TfrmLstNoFunciona,TfrmLstUbicacion]); end. Cuando intento buscar la clase TfrmLstAlfabetico en my app: procedure TfrmInventario.mListadosAlfabeticoClick(Sender: TObject); var FChildForm: TForm; AClass : TFormClass; begin result := nil; FChildForm := TForm( Application.Mainform.FindComponent('uLstAlfabetico') ); if not Assigned(FChildForm) then begin AClass := TFormClass( GetClass('TfrmLstAlfabetico') ); if AClass <> nil then begin LockWindowUpdate(Application.MainForm.Handle); ... La funcion getClass devuelve nil, parece como si el registerClasses no funcione pq el getClass 1º comprueba si esta registrada y entonces la obtiene, esto con delphi 5.0 funciona pero con delphi 6.0 ya no funciona o eso me parece, que es lo que me falta o hago mal? Gracias, salu2... |
Yo probé este sencillo código en Delphi 6, y funciona sin problemas:
Código:
procedure TForm1.Button1Click(Sender: TObject); ¿Estas usando alguna vez en el proyecto la unit que registra las clases? ¿Si pones un BreakPoint en la línea del RegisterClass se detiene ahí? |
si.
si, se detiene pero no la encuentra, es codigo que funciona en Delphi 5, pero que al pasarlo a delphi 6 ya no me funciona, pero no se pq...? |
¿Te funciona el código que puse en este hilo?
|
si, funciona
|
Cargar el paquete
¡Hola a todos!
Cita:
Espero esto sea de utilidad. Seguimos en contacto. Al González :). |
Hola, tengo una unidad de inicializacion por cada paquete donde hago el RegisterClasses de todas las clases de las unidades que contiene ese paquete, por ahi pasa y aparentemente las registra, pero cuando hago el getClass de la unidad que quiero utilizar entonces me devuelve un nil (vamos como si no la hubiera registrado).
En la unidad de inicializacion , tengo en las uses todas las unidades de las clases que registro. gracias |
Cita:
Por otro lado, dices que el flujo de la aplicación sí pasa por el RegisterClasses pero el GetClass posterior falla. ¿Qué pasa si, para probar, usas un GetClass inmediatamente después del RegisterClasses: Código:
RegisterClasses(...); |
Es decir...
¡Buen día a todos!
Complementando lo que nos dice Román. Es decir, ¿estás seguro de que cuando se ejecuta tu programa, éste ejecuta las sentencias RegisterClasses que nos mencionas? Una cosa es que los paquetes llamen a RegisterClasses, cuando son cargados por el entorno de Delphi. Y otra muy distinta, que la aplicación también llame a RegisterClasses cuando comienza a ejecutarse. Quizás ésto último no sucede. De todas formas, me gustaría saber más sobre este caso. Espero esto sea de utilidad. Seguimos en contacto. Al González :). |
Cita:
|
Cita:
|
Creo que a lo que van roman y delphi.com.ar es a la posibilidad que el optimizador haya eliminado la llamada a registerclass en tu ejecutable, o bien que la unidad no esté incluida en el uses de ninguna otra, por lo que la clase no existirá en el proyecto...
Cómo estas seguro que eso no ha ocurrido? Creo que facilmente podes hacer algo como lo indicado en el código sigiuente para tener un test completo: Código:
Procedure TForm1.Button1Click(Sender : TObject); |
jachguate:
Te darás cuenta de que el código Código:
if PunteroClase = nil Then Realmente este problema es muy extraño. La pregunta que le hice era tan sólo por no dejar pero si realmente GetClass devuelve nil inmediatamente después de RegisterClass pues creo que tu segundo Assert (el que jamás se ejecuta) realmente es cierto: '¡Sigue siendo nil, RegisterClass ya no sirve!'. // Saludos |
ups... es cierto... :o :o
es la rápidez con la que respondi... Basta con hacer entonces: Código:
Procedure TForm1.Button1Click(Sender : TObject); lo siento de nuevo y mil gracias roman por la corrección... |
¡ClassNameIs es sensible al tamaño!
¡Buen día a todos!
En vista de lo intrigante de este caso, decidí escudriñar un poco en la mejor referencia que hay de Delphi: el código fuente de su biblioteca. GetClass llama indirectamente al método clase ClassNameIs heredado de TObject. Me di cuenta que éste es sensible al tamaño. De hecho si hago esta prueba: Código:
RegisterClasses ([TForm1]); No estoy seguro si en Delphi 5 era insensible al tamaño (habría que ver el código de TObject.ClassNameIs en la unidad System.pas de Delphi 5). Pero esa pudiera ser la causa del problema aquí planteado. Si este no fuera el caso, todavía cabe la posiblidad de que GetClass devuelva Nil por algo que encontré en el método TRegGroups.GetClass de la unidad Classes.pas: Código:
function TRegGroups.GetClass(const AClassName: string): TPersistentClass; Seguiremos investigando :cool:. Al González :). |
Cita:
Cita:
// Saludos |
Cita:
¿De casualidad no estarás tratando de cargar dinámicamente los paquetes? De ser así acuérdate de que debes usar la opción "Build with runtime packages" // Saludos |
[quote=Al González
Me di cuenta que éste es sensible al tamaño.[/quote] En primer lugar yo diria sensible a Mayusculas y minusculas. Al principio no sabia exactamente lo que querias decir. He realizado la prueba en delphi 4 c/s y c <> nil; Hasta luego. ;) |
Buenas, parece que he encontrado una posible solucion:
initialization ActivateClassGroup(Tcontrol); RegisterClasses( [ TFClass1, TFClass2 ]); El sistema permite que las clases puedan ser cargadas y grabadas para ser registradas en grupos separados. Esto permite distinguir al IDE entre las clases VCL y CLX. Esta llamada activa un grupo de clases que contiene la clase especifica. Aunque yo en la app solo utilizo VCL, se esta haciendo un lio con las clases VCL y CLX. Vamos, si utilizo ActivateClassGroup(TControl), se evita el problema. Gracias a todos. |
¡Ah! Muy interesante. Por fin comienza a aparecer cierta lógica en este asunto. No sé porque se está confundiendo con las componentes, yo jamás uso nada de Kylix y me limito a desactivar las componentes desde que instalo Delphi. ¿Tú las tienes activadas?
// Saludos |
La franja horaria es GMT +2. Ahora son las 04:45:51. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi