Ver Mensaje Individual
  #6  
Antiguo 26-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Yendo al tema que nos ocupa, y aunque estoy muy espeso (y no sé si se me entenderá) diré que no parece ser posible asignar la variable del "record" que nos ocupa tal como lo quieres hacer. Claro, mira tú, ¡si fuera posible no estaríamos aquí hablando de ello! Si es que... cuando digo que estoy espeso...

Lo siguiente sí que es posible:

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, Graphics;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;


type
  TTipoGrafico = record
    Tipo  : Integer;
    Trazo : byte;
    ColorSerie: TColor;
  end;

  TPGSeries = class
  private
    FGrafico: TTipoGrafico;
    FItem: Integer;
    procedure SetTipoGrafico(value: TTipoGrafico);
  public
    property Grafico: TTipoGrafico read FGrafico write SetTipoGrafico;
    property Item: Integer read FItem write FItem;
    constructor Create;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  SysUtils, Dialogs;

// TPGSeries

constructor TPGSeries.Create;
begin
  inherited;
end;

procedure TPGSeries.SetTipoGrafico(value: TTipoGrafico);
begin
  FGrafico := value;
end;

// TForm1

procedure TForm1.Button1Click(Sender: TObject);
var
  tg: TTipoGrafico;
  PGSeries: TPGSeries;
begin
  PGSeries := TPGSeries.Create;
  try
    tg.Tipo := 1;
    tg.Trazo := 1;
    tg.ColorSerie := 0;

    // Asignación correcta
    PGSeries.Grafico := tg;

    // Mostrará 0
    ShowMessage( IntToStr ( PGSeries.Grafico.ColorSerie ) );

  finally
    PGSeries.Free;
  end;
end;

end.

Pero, claro, tú lo que quieres dar un valor a un elemento en concreto del "record" "TTipoGrafico", y no tener que dar valor a todas las variables. Está bien.

Entonces esta línea de tu código tiene conlleva una contradicción, causa el problema, o yo estoy equivocado:

Código Delphi [-]
property Grafico: TTipoGrafico read FGrafico write FGrafico;

¿Ahí no se está diciendo, "la propiedad Grafico es de tipo "TTipoGrafico" y para leerla puede accederse a la variable privada "FGrafico", y para escribirla ha de escribirse la variable "FGrafico"...?

Es decir, "para escribirla hay que escribir la variable "FGrafico", de tipo "TTipoGrafico". No sé exactamente porqué, pero, por lo que se ve no puedes acceder a los elementos de la variable "FGrafico" por separado. O eso, o alguien que sepa más nos lo explica.

¿Y entonces? ¿Qué pasa si quieres dar la posibilidad de cambiar el valor de un elemento de la variable "FGrafico"? Pues a mí a bote pronto se me ocurre algo que añado al código que puse anteriormente:

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, Graphics;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;


type
  TTipoGrafico = record
    Tipo  : Integer;
    Trazo : byte;
    ColorSerie: TColor;
  end;

  TPGSeries = class
  private
    FGrafico: TTipoGrafico;
    FItem: Integer;
    procedure SetGrafico(value: TTipoGrafico);
    procedure SetTipoGrafico(value: Integer);
    function GetTipoGrafico: Integer;
  public
    property TipoGrafico: Integer read GetTipoGrafico write SetTipoGrafico;
    property Grafico: TTipoGrafico read FGrafico write SetGrafico;
    property Item: Integer read FItem write FItem;
    constructor Create;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  SysUtils, Dialogs;

// TPGSeries

constructor TPGSeries.Create;
begin
  inherited;
end;

function TPGSeries.GetTipoGrafico: Integer;
begin
  Result := FGrafico.Tipo;
end;

procedure TPGSeries.SetTipoGrafico(value: Integer);
begin
  if FGrafico.Tipo <> value then
    FGrafico.Tipo := value;
end;

procedure TPGSeries.SetGrafico(value: TTipoGrafico);
begin
  FGrafico := value;
end;

// TForm1

procedure TForm1.Button1Click(Sender: TObject);
var
  tg: TTipoGrafico;
  PGSeries: TPGSeries;
begin
  PGSeries := TPGSeries.Create;
  try

    PGSeries.TipoGrafico := 1;

    // Mostrará 1
    ShowMessage( IntToStr ( PGSeries.Grafico.Tipo ) );

  finally
    PGSeries.Free;
  end;
end;

end.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita