![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
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 |
|
#2
|
||||
|
||||
|
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(...); Assert(GetClass(una de tus clases) <> nil, '¡Es nil!'); |
|
#3
|
||||
|
||||
|
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 . |
|
#4
|
|||
|
|||
|
Cita:
|
|
#5
|
||||
|
||||
|
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);
Var
Instancia : TClase;
{si esto compila estoy seguro que la unidad ha sido incluida en el uses }
PunteroClase : TObjectClass;
Begin
Instancia := TClass.Create(Parametros);
Instancia.Free; // para que el optimizador no quite la variable Instancia del camino...
PunteroClase := GetClass('TClass')
Assert(PunteroClase <> nil, '¡Es nil!');
if PunteroClase = nil Then
Begin
// intentamos de nuevo registrar la clase, a ver que ocurre...
RegisterClass(TClass);
Assert(GetClass('TClass') <> nil, '¡Sigue siendo nil, RegisterClass ya no sirve!');
End;
end;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#6
|
||||
|
||||
|
jachguate:
Te darás cuenta de que el código Código:
if PunteroClase = nil Then
Begin
// intentamos de nuevo registrar la clase, a ver que ocurre...
RegisterClass(TClass);
Assert(GetClass('TClass') <> nil, '¡Sigue siendo nil, RegisterClass ya no sirve!');
End;
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 |
|
#7
|
||||
|
||||
|
ups... es cierto...
es la rápidez con la que respondi... Basta con hacer entonces: Código:
Procedure TForm1.Button1Click(Sender : TObject);
Var
Instancia : TClase;
{si esto compila estoy seguro que la unidad ha sido incluida en el uses }
PunteroClase : TObjectClass;
Begin
Instancia := TClass.Create(Parametros);
Instancia.Free; // para que el optimizador no quite la variable Instancia del camino...
PunteroClase := GetClass('TClass')
if PunteroClase = nil Then
ShowMessage('¡Es nil!');
if PunteroClase = nil Then
Begin
// intentamos de nuevo registrar la clase, a ver que ocurre...
RegisterClass(TClass);
Assert(GetClass('TClass') <> nil, '¡Sigue siendo nil, RegisterClass ya no sirve!');
End;
end;
lo siento de nuevo y mil gracias roman por la corrección...
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#8
|
|||
|
|||
|
Cita:
|
![]() |
|
|
|