[Lazarus-es] registerclass, error

José Mejuto joshyfun en gmail.com
Sab Abr 16 16:24:44 CEST 2011


Hello Paola,

Friday, April 15, 2011, 9:35:43 PM, you wrote:

PB> tengo un form editpaises...
PB> type
PB>    { TEditPaises }
PB>    TEditPaises = class(TForm)
PB>      BitBtn1: TBitBtn;
PB>      BitBtn2: TBitBtn;
PB>      DBEdit1: TDBEdit;
PB>      Label1: TLabel;
PB>    private
PB>      { private declarations }
PB>    public
PB>      { public declarations }
PB>    end;
PB> ahora, en el form principal de la aplicación, en el evento oncreate,
PB> intento registrar esta clase:
PB>    RegisterClass(TEditPaises);
PB> y obtengo el error:
PB> frmMain.pas(192,28) Error: Incompatible type for arg no. 1: Got "Class
PB> Of TEditPaises", expected "WNDCLASS"

Eso es por que "RegisterClass" ya lo incorpora Lazarus para otras
tareas (streaming de componentes). Primero tienes que crearte una
clase que se encargue de registrar las clases y devolvertelas por el
nombre asignado. Por supuesto no puedes usar el nombre de
"RegisterClass", yo usaría algo como "RegisterMyForm" o algo más
particular en el nombre.

Para añadir el form al sistema de registro que hayas creado tienes que
hacerlo usando el "Initialize" de cada "Unit", de modo que las clases
se autoregistren al cargarlas en el uses, sin tener que instanciarlas.
Si lo haces en el "OnCreate" primero ya la habrás instanciado, por lo
tanto ya sabías su nombre, entonces el sistema de registro no sirve
para nada (siempre que sea eso lo que quieres hacer).

PB> alguna idea?
PB> Intento con esto crear un form sabiendo su nombre de clase (que está en
PB> un string)

Básicamente creas una clase que lleve un listado de clases con un
nombre asociado, lo cual es básicamente un "TStringList" con un par de
métodos para buscar un nombre y para "registrar" clases nuevas. Esa
clase la metes en un Unit y debe de aparecer de los primeros en tu
.lpr, al menos antes de ningún form. En todo los forms que quieres que
se puedan crear con la factoría debes de añadir en el uses la Unit que
gestiona tu factoría y al final del form añadir:

Initialization
  MyFactory.RegisterMyForm(TForm1);

Para que cuando lo metas en un uses, automáticamente quede registrado.

Este ejemplo es más correcto y más versátil, tienes más control de
todo lo que sucede:

http://clubdelphi.com/foros/showpost.php?p=10811&postcount=4
  
-- 
Best regards,
 José





More information about the Lazarus-es mailing list