Composição de Classes no Delphi

Delphi

10/04/2014

Galera, bom dia...

Estou começando a programar em OO com o Delphi... Criei uma Classe mestre (NotaFiscal) com propriedades e métodos normalmente... Não estou conseguindo agora fazer os Itens desta nota Fiscal. Não sei como criar uma propriedade que tenha os meus itens (que é uma segunda classe)... Alguem poderia me dar um exemplo simples de como criar esta propriedade e como carregar ela com todos os itens da nota?
Emerson

Emerson

Curtidas 0

Respostas

Cauê Nishijima

Cauê Nishijima

10/04/2014

Posta o que você tem até agora.

Pelo que entendi você tem duas Classes, uma TNotaFiscal e outra TItens(que contem os itens da nota fiscal) é isso?

na classe TNotaFiscal você precisa fazer um Uses pra classe TItens, depois precisa declarar a propriedade itens do tipo TItens:
   property itens: TItens read FItens write FItens;


Em seguida no construtor da classe TNotaFiscal você deve instanciar um objeto TItens e atribuir para FItens, assim você pode acessar os itens da nota fiscal da seguinte forma:

   nf = TNotaFiscal.Create(Self);
   edtDescricao.Text := nf.itens.descricao;
GOSTEI 0
Emerson

Emerson

10/04/2014

É isso mesmo, o que não to conseguindo é "carregar" os itens na propriedade que criei. Não to sabendo como ir incrementando item a item na propriedade (que deve ser um vetor)...

Veja a Classe de Nota:


unit uNotaFiscal;

interface

uses Classes, ADODB, Variants, System.SysUtils, Data.DB, uNotaFiscalItens,
     Dialogs, Forms, StrUtils;

type
  TNotaFiscal = class(TPersistent)

  private
    { private declarations }
    FEmpresa: Integer;
    FNumero: Integer;
    FSerie: Integer;

    function getItens(index: Integer): TNotaFiscalItens;

  protected
    { protected declarations }

  public
    { public declarations }
    procedure setItens(index: Integer; const value: TNotaFiscalItens);

    property Empresa: Integer read FEmpresa write FEmpresa;
    property Numero: Integer read FNumero write FNumero;
    property Serie: Integer read FSerie write FSerie;

    property Itens[index: Integer]: TNotaFiscalItens read getItens write setItens; default;

    constructor Create;

  end;

implementation
{ TNotaFiscal }

constructor TNotaFiscal.Create;
begin
  inherited Create;
end;

function TNotaFiscal.getItens(index: Integer): TNotaFiscalItens;
begin
  Result := Itens[Index];
end;

procedure TNotaFiscal.setItens(index: Integer; const value: TNotaFiscalItens);
begin
  Itens[Index].Assign(Value);
end;

end.



e a Classe de Itens da nota:


unit uNotaFiscalItens;

interface

uses Classes, ADODB, Variants, System.SysUtils, System.StrUtils, Data.DB;

type
  TNotaFiscalItens = class(TCollectionItem)

  private
    { private declarations }
    FItem: Integer;
    FProduto: Integer;
    FVlrUnitario: Double;

  protected
    { protected declarations }

  public
    { public declarations }
    property Item: Integer read FItem write FItem;
    property Produto: Integer read FProduto write FProduto;
    property ValorUnitario: Double read FVlrUnitario write FVlrUnitario;

    constructor Create;

  end;
implementation

{ TNotaFiscalItens }

constructor TNotaFiscalItens.Create;
begin
  inherited Create;
end;

end.

GOSTEI 0
Cauê Nishijima

Cauê Nishijima

10/04/2014

Fiz umas modificações no seu código, não sei se é bem isso que você quer, mas experimenta usar o seguinte código:

uNotaFical.pas:

unit uNotaFiscal;

interface

uses Classes, ADODB, Variants, System.SysUtils, Data.DB, uNotaFiscalItens,
  Dialogs, Forms, StrUtils;

type
  TNotaFiscal = class(TPersistent)

  private
    { private declarations }
    FEmpresa: Integer;
    FNumero: Integer;
    FSerie: Integer;
    FItens: TList;
    function getItens(index: Integer): TNotaFiscalItens;

  protected
    { protected declarations }

  public
    { public declarations }
    procedure setItens(index: Integer; const value: TNotaFiscalItens);

    property Empresa: Integer read FEmpresa write FEmpresa;
    property Numero: Integer read FNumero write FNumero;
    property Serie: Integer read FSerie write FSerie;

    property Itens[index: Integer]: TNotaFiscalItens read getItens
      write setItens; default;

    constructor Create;

  end;

implementation

{ TNotaFiscal }

constructor TNotaFiscal.Create;
begin
  inherited Create;
  FItens := TList.Create;
end;

function TNotaFiscal.getItens(index: Integer): TNotaFiscalItens;
begin
  result := FItens.Items[index];
end;

procedure TNotaFiscal.setItens(index: Integer; const value: TNotaFiscalItens);
begin
  FItens.Insert(index,value);
end;

end.



uNotaFiscalItens:

unit uNotaFiscalItens;

interface

uses Classes, ADODB, Variants, System.SysUtils, System.StrUtils, Data.DB;

type
  TNotaFiscalItens = class

  private
    { private declarations }
    FItem: Integer;
    FProduto: Integer;
    FVlrUnitario: Double;

  protected
    { protected declarations }

  public
    { public declarations }
    property Item: Integer read FItem write FItem;
    property Produto: Integer read FProduto write FProduto;
    property ValorUnitario: Double read FVlrUnitario write FVlrUnitario;
  end;
implementation

{ TNotaFiscalItens }


end.


fiz um teste colocando um button em um form e escrevendo o seguinte código no onClick do mesmo:

procedure TForm1.Button1Click(Sender: TObject);
var
  item: TNotaFiscalItens;
  nf : TNotaFiscal;
begin
  item := TNotaFiscalItens.Create;
  item.Item := 1;
  item.Produto := 1;
  item.ValorUnitario := 12.01;

  nf := TNotaFiscal.Create;
  nf.setItens(0,item);

  ShowMessage(FloatToStr(nf.Itens[0].ValorUnitario));

end;
GOSTEI 0
Emerson

Emerson

10/04/2014

Cara, ache deu certo assim... muito obrigado pela ajuda...

Eu tava pensando em montar um Array de Itens.. e ir alimentando ele.. não tinha pensado em List... Valeu pela ajuda...
GOSTEI 0
POSTAR