Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-12-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
habilitar una clase antes de su uso en un componente

Hola compañeros tengo un componente para mostrar varios display pongo el principio del código

Código Delphi [-]
unit MultiDisplay;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls, Graphics,UDiGDisplayJL2;

type

  TDisplay1 =class(TPersistent) //Para crear propiedades agrupadas   2/
  private
       FDigits: byte; { Número de digitos a representar }
       FValue: string; { Valor a arepresentar }
       FBckgndColor, FDigitOnColor, FDigitOffColor: TColor; { Colores }
       FAlignment: TAlignment; { Alineación horizontal }
       FLeadingZeros: boolean; { Rellenar con ceros }
       FTipoVisor  :  TTypeVisor;
       procedure setTipoVisor(const Value:TTypeVisor);
       procedure SetDigits(Value: byte);
       procedure SetValue(Value: String);
       procedure SetBckgndColor(Value: TColor);
       procedure SetDigitOnColor(Value: TColor);
       procedure SetDigitOffColor(Value: TColor);
       procedure SetAlignment(Value: TAlignment);
       procedure SetLeadingZeros(Value: boolean);
  published
       property LeadingZeros    : boolean   read FLeadingZeros   write SetLeadingZeros default False;
       property Alignment  : TAlignment   read FAlignment   write SetAlignment default           taRightjustify;
       property Digits    : byte     read FDigits     write SetDigits default 4;
       property Value    : string   read FValue     write SetValue;
       property BckgndColor  : TColor   read FBckgndColor   write SetBckgndColor;
       property DigitOnColor  : TColor   read FDigitOnColor   write SetDigitOnColor;
       property DigitOffColor  : TColor   read FDigitOffColor   write SetDigitOffColor;
       property TipoVisor   : TTypeVisor  read FTipoVisor    write SetTipoVisor default VNumeric;
  end;

type
  TDisplay2 =class(TPersistent) //Para crear propiedades agrupadas   2/
  private
       FDigits: byte; { Número de digitos a representar }
       FValue: string; { Valor a arepresentar }
       FBckgndColor, FDigitOnColor, FDigitOffColor: TColor; { Colores }
       FAlignment: TAlignment; { Alineación horizontal }
       FLeadingZeros: boolean; { Rellenar con ceros }
       FTipoVisor  :  TTypeVisor;

       procedure setTipoVisor(const Value:TTypeVisor);
       procedure SetDigits(Value: byte);
       procedure SetValue(Value: String);
       procedure SetBckgndColor(Value: TColor);
       procedure SetDigitOnColor(Value: TColor);
       procedure SetDigitOffColor(Value: TColor);
       procedure SetAlignment(Value: TAlignment);
       procedure SetLeadingZeros(Value: boolean);
  published
       property LeadingZeros    : boolean   read FLeadingZeros   write SetLeadingZeros default False;
       property Alignment  : TAlignment   read FAlignment   write SetAlignment default           taRightjustify;
       property Digits    : byte     read FDigits     write SetDigits default 4;
       property Value    : string   read FValue     write SetValue;
       property BckgndColor  : TColor   read FBckgndColor   write SetBckgndColor;
       property DigitOnColor  : TColor   read FDigitOnColor   write SetDigitOnColor;
       property DigitOffColor  : TColor   read FDigitOffColor   write SetDigitOffColor;
       property TipoVisor   : TTypeVisor  read FTipoVisor    write SetTipoVisor default VNumeric;
  end;

type
  TDisplay3 =class(TPersistent) //Para crear propiedades agrupadas   2/
  private
       FDigits: byte; { Número de digitos a representar }
       FValue: string; { Valor a arepresentar }
       FBckgndColor, FDigitOnColor, FDigitOffColor: TColor; { Colores }
       FAlignment: TAlignment; { Alineación horizontal }
       FLeadingZeros: boolean; { Rellenar con ceros }
       FTipoVisor  :  TTypeVisor;

       procedure setTipoVisor(const Value:TTypeVisor);
       procedure SetDigits(Value: byte);
       procedure SetValue(Value: String);
       procedure SetBckgndColor(Value: TColor);
       procedure SetDigitOnColor(Value: TColor);
       procedure SetDigitOffColor(Value: TColor);
       procedure SetAlignment(Value: TAlignment);
       procedure SetLeadingZeros(Value: boolean);
  published
       property LeadingZeros    : boolean   read FLeadingZeros   write SetLeadingZeros default False;
       property Alignment  : TAlignment   read FAlignment   write SetAlignment default           taRightjustify;
       property Digits    : byte     read FDigits     write SetDigits default 4;
       property Value    : string   read FValue     write SetValue;
       property BckgndColor  : TColor   read FBckgndColor   write SetBckgndColor;
       property DigitOnColor  : TColor   read FDigitOnColor   write SetDigitOnColor;
       property DigitOffColor  : TColor   read FDigitOffColor   write SetDigitOffColor;
       property TipoVisor   : TTypeVisor  read FTipoVisor    write SetTipoVisor default VNumeric;
  end;

type
  TComunes =class(TPersistent) //Para crear propiedades agrupadas   2/
  private
       FComun:    Boolean;  //Usa en los displays las mismas caracteristicas
       FDigits: byte; { Número de digitos a representar }
       FBckgndColor, FDigitOnColor, FDigitOffColor: TColor; { Colores }
       FAlignment: TAlignment; { Alineación horizontal }
       FLeadingZeros: boolean; { Rellenar con ceros }
       FTipoVisor  :  TTypeVisor;
       procedure SetComun(value:Boolean);
       procedure setTipoVisor(const Value:TTypeVisor);
       procedure SetDigits(Value: byte);
       procedure SetBckgndColor(Value: TColor);
       procedure SetDigitOnColor(Value: TColor);
       procedure SetDigitOffColor(Value: TColor);
       procedure SetAlignment(Value: TAlignment);
       procedure SetLeadingZeros(Value: boolean);
  published
       property Comun           : Boolean       read FComun    write SetComun   default False;
       property LeadingZeros    : boolean   read FLeadingZeros   write SetLeadingZeros default False;
       property Alignment  : TAlignment   read FAlignment   write SetAlignment default           taRightjustify;
       property Digits    : byte     read FDigits     write SetDigits default 4;
       property BckgndColor  : TColor   read FBckgndColor   write SetBckgndColor;
       property DigitOnColor  : TColor   read FDigitOnColor   write SetDigitOnColor;
       property DigitOffColor  : TColor   read FDigitOffColor   write SetDigitOffColor;
       property TipoVisor   : TTypeVisor  read FTipoVisor    write SetTipoVisor default VNumeric;
  end;


type
  TEspacio = 0..5;
  TNumbers = 1..3;
  TMultiDisplay = class(TPanel)
  private
      { Private declarations }
      FDisplay1    :TDisplay1;
      FDisplay2    :TDisplay2;
      FDisplay3    :TDisplay3;
      FComunes    :TComunes;
      FSpace     :TEspacio;
      FNumbersDisplays  :TNumbers;
      FDisp1    :TDigitDisplayJL_R; //HAy que tener instalado la unidad UdigiDiplsy
      FDisp2    :TDigitDisplayJL_R;
      FDisp3    :TDigitDisplayJL_R;
      procedure SetSpace(Value:TEspacio);
      procedure SetNumbersDisplays(Value:TNumbers);
  protected
    { Protected declarations }
    procedure Paint; override;
    procedure Resize; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure clear;
  published
    property Space    :TEspacio    read FSpace    Write SetSpace;
    property NumbersDisplays    :TNumbers        read FNumbersDisplays  write SetNumbersDisplays;
    property Display1    :TDisplay1   read FDisplay1    write FDisplay1;
    property Display2    :TDisplay2   read FDisplay2    write FDisplay2;
    property Display3    :TDisplay3   read FDisplay3    write FDisplay3;
    property Comunes    :TComunes   read FComunes    write FComunes;
    { Published declarations }
  end;

hasta aquí todo bien, el problema surge cuando quiero acceder a un cambio desde por Ejemplo Tdisplay1.value a Disp1.value, investigando en internet he visto en otros componetes que declaran la clase del componente antes de su uso (de que realmente se cree) de la siguiente forma, seria por ejemplo en el TDisplay1

Código Delphi [-]
TMultiDisplay = class;

y luego dentro de mi Tdiplay1 iría las siguientes lineas de código

Código Delphi [-]
uses
  SysUtils, Classes, Controls, ExtCtrls, Graphics,UDiGDisplayJL2;

 TMultiDisplay = class;
type

  TDisplay1 =class(TPersistent) //Para crear propiedades agrupadas   2/
  private
       FDigits: byte; { Número de digitos a representar }
       FMulti :TMultiDisplay;
       FValue: string; { Valor a arepresentar }
       FBckgndColor, FDigitOnColor, FDigitOffColor: TColor; { Colores }
       FAlignment: TAlignment; { Alineación horizontal }
       FLeadingZeros: boolean; { Rellenar con ceros }
       FTipoVisor  :  TTypeVisor;
       procedure setTipoVisor(const Value:TTypeVisor);
       procedure SetDigits(Value: byte);
       procedure SetValue(Value: String);
       procedure SetBckgndColor(Value: TColor);
       procedure SetDigitOnColor(Value: TColor);
       procedure SetDigitOffColor(Value: TColor);
       procedure SetAlignment(Value: TAlignment);
       procedure SetLeadingZeros(Value: boolean);
       procedure SetMulti(value:TMultiDisplay);
  published
       property LeadingZeros    : boolean   read FLeadingZeros   write SetLeadingZeros default False;
       property Alignment  : TAlignment   read FAlignment   write SetAlignment default           taRightjustify;
       property Digits    : byte     read FDigits     write SetDigits default 4;
       property Value    : string   read FValue     write SetValue;
       property BckgndColor  : TColor   read FBckgndColor   write SetBckgndColor;
       property DigitOnColor  : TColor   read FDigitOnColor   write SetDigitOnColor;
       property DigitOffColor  : TColor   read FDigitOffColor   write SetDigitOffColor;
       property TipoVisor   : TTypeVisor  read FTipoVisor    write SetTipoVisor default VNumeric;
       property Multi: TMultiDisplay  read FMulti   write SetMulti;
  end;

Pero me da los siguientes errores

Cita:
[DCC Error] MultiDisplay.pas(10): E2086 Type 'TMultiDisplay' is not yet completely defined
[DCC Error] MultiDisplay.pas(131): E2004 Identifier redeclared: 'TMultiDisplay'
[DCC Error] MultiDisplay.pas(28): E2005 'TMultiDisplay' is not a type identifier
Si me podéis explicar que estoy haciendo mal y cual sería la forma correcta, me ayudaríais mucho.

Como siempre gracias
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 08-12-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

En el código que has puesto arriba el "TMultiDisplay = class;" debería ir dentro del bloque "type" y no antes como se ve arriba. Creo que la única "limitación" de los "forward class declaration" en Delphi es que estos deben estar dentro del mismo bloque "type" que al cabo declara las clases. Ese también puede ser el problema en tu código: debes usar los mismos bloques "type" cuando usas los "forward class declaration".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 08-12-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
Hola,

En el código que has puesto arriba el "TMultiDisplay = class;" debería ir dentro del bloque "type" y no antes como se ve arriba. Creo que la única "limitación" de los "forward class declaration" en Delphi es que estos deben estar dentro del mismo bloque "type" que al cabo declara las clases. Ese también puede ser el problema en tu código: debes usar los mismos bloques "type" cuando usas los "forward class declaration".
Gracias Dec lo mirare, pero juraria que el componente en el que lo mire lo tiene fura de type, de hecho creo recordar que esta entre 2 Type.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 09-12-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.273
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por José Luis Garcí Ver Mensaje
Gracias Dec lo mirare, pero juraria que el componente en el que lo mire lo tiene fura de type, de hecho creo recordar que esta entre 2 Type.
Sea de una manera o de otra, debe ir dentro de una declaración de Type. Con eso te debería funcionar sin problemas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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 crear un componente sin derivarlo de otra clase? DarkBlue Varios 8 08-11-2011 16:41:04
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Es posible hacer una nueva clase de componente ?? ilichhernandez OOP 7 05-05-2008 16:01:30
Cuando van habilitar seccion componente leodelca23 La Taberna 1 20-09-2006 14:26:22
Una clase como propiedad de un componente? setry2 OOP 3 30-12-2003 21:30:58


La franja horaria es GMT +2. Ahora son las 09:57:42.


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