Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo te recomendaría, ahora que sabes cuál es la sección initialization releer mi primer mensaje en este hilo y tener cuidado con lo que estás escribiendo.

Sé que estás empezando con Delphi y el tema de las referencias de clase no es un tema básico, sin embargo no me queda claro si ya buscaste en la ayuda de Delphi acerca de ello y conviene que le des una leída para que los errores que te aparecen no parezcan tan en chino.

Te hago un resumen:

Las referencias de clase (en inglés class references) son algo así como meta clases-- Una variable cuyo tipo es una referencia de clase, es una variable cuyos valores son tipos de clases.

Considera este caso concreto:

Código:
type
  TForm = class
    ...
  end;

  TFormClass = class of TForm;
Esto es un resumenn de las declaraciones que se encuentran en la unidad forms.pas.

Aquí, TForm es un tipo de datos, particularmente una clase. Como cualquier otro tipo de datos puedes declarar variables de este tipo:

Código:
var
  Forma: TForm;
Por otro lado, TFormClass es una referencia de clase (una meta clase). También es un tipo de datos en el sentido de que puedes declarar variables de este tipo:

Código:
var
  FormaClase: TClassForm;
Pero la diferencia es que los valores que variables de este tipo pueden tomar son, a su vez, tipos de datos. No cualquier tipo de datos sino sólo aquellos que sean clases (como TForm) y de hecho no cualquier clase sino sólo TForm o descendientes de TForm.

Así, puedes asignar:

FormaClase := TForm1;

ya que la clase TForm1 es un descendente de TForm.

Observa aquí el punto importante:

Una asignación como

FormaClase := Forma;

donde Forma es como la declarada arriba, no es válida ya que Forma es un objeto de la clase TForm, es decir una variable de tipo TForm, más no es el tipo TForm.

¿Para qué sirven estas referencias de clase?

Recuerda cómo se construye un objeto, por ejemplo Forma:

Forma := TForm.Create(...);

Observa que antes del punto está un tipo de datos, una clase, TForm. Como una referencia de clase toma como valor un tipo de datos puedes sustituir TForm en la asignación anterior por una referencia de clase, cuyo valor sea igual a TForm:

Código:
FormaClase := TForm;
Forma := FormaClase.Create(...);
Pero si FormaClase no tiene un valor asignado entonces es nil y no se puede hacer nada con ella. Es decir, si usas

Forma := FormaClase.Create(...);

sin haber antes asignado TForm a FormaClase es como si hicieras

nil.Create(...);

lo que provoca un error de violación de acceso.

Regresando a tú problema específico. El procedimiento RegisterClass toma como parámetro una referencia de clase. Como FormaClase es de tipo referencia de clase el compilador no te marca ningún error. Sin embargo, seguramente FormaClase no ha sido inicializada, es nil, de manera que cuando pones

RegisterClass(FormaClase);

es como si pusieras

RegisterClass(nil);

y de ahí la violación de acceso.

Ahora bien, cuando tienes un procedimiento, por decir algo, con un parámetro de tipo Integer:

Código:
procedure MiProc(I: Integer);
begin
end;
para llamar a este procedimiento no es necesario que hagas:

Código:
I := 84;
MiProc(I);
sino que basta usar:

MiProc(84);

Lo mismo sucede con RegisterClass. En lugar de usar una variable como FormaClase para pasársela cómo parámetro, puedes pasarle directamente el valor que te interesa; en este caso TMiForma (o como quiera que se llame la clase de tu formulario):

RegisterClass(TMiForma);

// Continúa ...

Última edición por roman fecha: 09-11-2003 a las 04:35:46.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 23:46:28.


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