Ir al contenido


Foto

habilitar una clase antes de su uso en un componente


  • Por favor identifícate para responder
3 respuestas en este tema

#1 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 08 diciembre 2013 - 05:33

Hola compañeros tengo un componente para mostrar varios display pongo el principio del 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;[/DELPHI]

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

[DELPHI]TMultiDisplay = class;[/DELPHI]

y luego dentro de mi Tdiplay1 iría las siguientes lineas de 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;
[/DELPHI]

Pero me da los siguientes errores

[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
  • 0

#2 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 08 diciembre 2013 - 06:18

Hola

Lo que noto con lo que tienes es lo siguiente:

1.  No es necesario crear varias clases del del Tipo TDisplay1, TDisplay2..., si son iguales, basta con crear una sola clase y lo que puedes hacer en el programa es crear varias instancias de la clase.

Var
  Dis1, Dis2, Dis3, Dis4 : TDisplay;

2. No es necesario repetir la directiva Type si todos los tipos los defines en la misma área.

3. Asegurate que todos los métodos estén implementados, ya que ese es el error que te está presentando.
4. En cuanto a los errores que mencionas corresponden a
    E2086 Type 'TMultiDisplay' is not yet completely defined : No has definido la implementación de la clase, cada método debe tener su respectiva implementación


  • 0

#3 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 08 diciembre 2013 - 10:20

Hola Desart

Cuando colocas este código



delphi
  1. TMultiDisplay = class;



Se espera que la declaración e implementación de la clase TMultiDisplay se encuentre más adelante en la misma unidad.

Si la declaración se encuentra en otra unidad, entonces no es necesario usar TMultiDisplay = class , bastará con colocar la unidad que contiene su definición en la sección uses.

Saludos
  • 0

#4 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 09 diciembre 2013 - 02:02

Hola

Lo que noto con lo que tienes es lo siguiente:

1.  No es necesario crear varias clases del del Tipo TDisplay1, TDisplay2..., si son iguales, basta con crear una sola clase y lo que puedes hacer en el programa es crear varias instancias de la clase.

Var
  Dis1, Dis2, Dis3, Dis4 : TDisplay;

2. No es necesario repetir la directiva Type si todos los tipos los defines en la misma área.

3. Asegurate que todos los métodos estén implementados, ya que ese es el error que te está presentando.
4. En cuanto a los errores que mencionas corresponden a
    E2086 Type 'TMultiDisplay' is not yet completely defined : No has definido la implementación de la clase, cada método debe tener su respectiva implementación



Muchas gracias genriquez y tienes toda la razón , no me había dado cuenta y he cometido el  mismo error en varias ocasiones.

Hola Desart

Cuando colocas este código



delphi
  1. TMultiDisplay = class;



Se espera que la declaración e implementación de la clase TMultiDisplay se encuentre más adelante en la misma unidad.

Si la declaración se encuentra en otra unidad, entonces no es necesario usar TMultiDisplay = class , bastará con colocar la unidad que contiene su definición en la sección uses.

Saludos


Gracias Héctor, entonces si declaro dentro del mismo bloque type la clase aunque haga uso de ella más tarde, me permitirá acceder a todas las propiedades de esta clase, eso entiendo,  por cierto, cada vez que declaro una clase con sus partes debe acabar con un end, espero se me entienda
  • 0




IP.Board spam blocked by CleanTalk.