Classe e SubClasse

Delphi

03/07/2014

Boas pessoal, estou tentando trabalhar com classe e subclasse porem esteou tendo um erro de access violation ao tentar jogar a informacao no item (subclasse), se alguém puder dar uma luz agradeco desde ja.

segue:
FORM
procedure TForm1.Button3Click(Sender: TObject);
var
pedido : TPedido;
begin
try
try
pedido := TPedido.Create;

pedido.lote := 0;
pedido.numero_pedido := 1;
pedido.Itens.codigo_produto := 100; <<------------------ o erro ocorre aqui ( access violation )
finally
FreeAndNil(pedido);
end;
except
On E: Exception do
ShowMessage(e.Message);
end;
end;


Classe PEDIDO ---------------------------------------------------------------------------------------------
unit clPedido;

interface

uses clPedidoItem;

type TPedido = class
private
Fped_lote : integer;
Fped_numero_pedido : integer;

FItens : TPedidoItem;

protected

public

property lote : integer read Fped_lote write Fped_lote;
property numero_pedido : integer read Fped_numero_pedido write Fped_numero_pedido;

property Itens : TPedidoItem read FItens write FItens;

Constructor Create;
Destructor Destroy; Override;
end;


implementation

{ TPedido }

CLASSE ITEM PEDIDO ---------------------------------------------------------------------------------------------

unit clPedidoItem;

interface

uses
SysUtils, Variants, Classes, StdCtrls;

type TPedidoItem = class(TList)
private
Fite_codigo_produto : integer;

protected

public
property codigo_produto : integer read Fite_codigo_produto write Fite_codigo_produto;

Constructor Create;
Destructor Destroy; Override;

function AddItem : boolean;
end;

implementation
Ricardo Matarazzo

Ricardo Matarazzo

Curtidas 0

Respostas

Valquiria Silva

Valquiria Silva

03/07/2014

Ricardo, ta faltando vc criar o seu Objeto do Item.
     pedido.Itens:= TPedidoItem.create;


Algo assim.

Uma sugestão seria você criar este objeto no construtor da super classe.


Abs
GOSTEI 0
Ricardo Matarazzo

Ricardo Matarazzo

03/07/2014

Ok. muito obrigado.. vou fazer o teste e volto a postar o resultado
GOSTEI 0
Ricardo Matarazzo

Ricardo Matarazzo

03/07/2014

OK, Funcionou direitinho... obrigado novamente
GOSTEI 0
Ricardo Matarazzo

Ricardo Matarazzo

03/07/2014

Pessoal é as classes aparentemente estão funcionando, porém não sei onde estou comendo bola, pois ao incluir o objeto na lista, fica apenas o ultimo incluso, se alguem puder me informar onde ajustar.. agradeço.

CLASSE - PEDIDO----------------------------------------------
unit clPedido;

interface

uses clPedidoItem;

  type TPedido = class
    private
      Fped_lote            : integer;
      Fped_numero_pedido   : integer;
      Fped_data_digitacao  : TDateTime;
      Fped_data_entrega    : TDateTime;
      Fped_numero_nf       : integer;
      Fped_codigo_cliente  : integer;
      Fped_vendedor        : integer;
      Fped_forma_pagamento : integer;

      FItens : TPedidoItem;

    protected

    public

    property lote            : integer read Fped_lote write Fped_lote;
    property numero_pedido   : integer read Fped_numero_pedido write Fped_numero_pedido;
    property data_digitacao  : TDateTime read Fped_data_digitacao write Fped_data_digitacao;
    property data_entrega    : TDateTime read Fped_data_entrega write Fped_data_entrega;
    property numero_nf       : integer read Fped_numero_nf write Fped_numero_nf;
    property codigo_cliente  : integer read Fped_codigo_cliente write Fped_codigo_cliente;
    property vendedor        : integer read Fped_vendedor write Fped_vendedor;
    property forma_pagamento : integer read Fped_forma_pagamento write Fped_forma_pagamento;

    property Itens : TPedidoItem read FItens write FItens;

    Constructor Create;
    Destructor Destroy; Override;
  end;


implementation

{ TPedido }

constructor TPedido.Create;
begin
  Itens:= TPedidoItem.create;
end;

destructor TPedido.Destroy;
begin
  Itens.Free;
  inherited;
end;

end.


CLASSE ITEM PEDIDO -------------------------------------------------------------------------------------------------------------------------------------------------
unit clPedidoItem;

interface

uses
  SysUtils, Variants, Classes, StdCtrls, Dialogs;

  type TPedidoItem = class
    private
      Fite_data_digitacao    : TDateTime;
      Fite_numero_pedido     : integer;
      Fite_operacao          : integer;
      Fite_prd_sequencia     : integer;
      Fite_codigo_produto    : integer;

    protected
    // atributos e metodos protegidos
    public
    // atibutos e metodos publicos
    // propiedade publicas
    property data_digitacao       : TDateTime read Fite_data_digitacao write Fite_data_digitacao;
    property numero_pedido        : integer read Fite_numero_pedido write Fite_numero_pedido;
    property operacao             : integer read Fite_operacao write Fite_operacao;
    property prd_sequencia        : integer read Fite_prd_sequencia write Fite_prd_sequencia;
    property codigo_produto       : integer read Fite_codigo_produto write Fite_codigo_produto;

    Constructor Create; // declaração do metodo construtor
    Destructor Destroy; Override; // declaração do metodo destrutor
// metodos da classe

    function AddItem(Itens : TPedidoItem) : boolean;
    function TotalItens: integer;
    function TotalItensView(i: integer): TPedidoItem;
  end;

implementation

var
  Lista : TList;

{ TPedidoItem }

function TPedidoItem.AddItem(Itens : TPedidoItem): boolean;
begin
  Lista.Add(Itens);
end;

function TPedidoItem.TotalItens : integer;
begin
  Result := Lista.Count;
end;

function TPedidoItem.TotalItensView(i : integer) : TPedidoItem;
begin
  Result := Lista.Items[i];
end;

constructor TPedidoItem.Create;
begin
  Lista := TList.Create;
end;

destructor TPedidoItem.Destroy;
begin
  Lista.Free;
  inherited;
end;

end.
GOSTEI 0
Valquiria Silva

Valquiria Silva

03/07/2014

Oi Ricardo.

Bom, da forma como estão suas classes, vai realmente ser adicionado o último item. Por que a variável Lista pertence a cada item, ou seja cada item terá sua própria Lista de Itens.
Minha sugestão:

cria uma classe ;

type
TListItem = class(TList)
public
function adiconaItem: TPedidoItem;
function TotalItens : integer;
function TotalItensView(i : integer) : TPedidoItem;
end;

function TListItem.adiconaItem: TPedidoItem;
var
Item: TPedidoItem;
begin
Item:= TPedidoItem.create;
self.Add(Item);
Result := Item;
end;

function TListItem.TotalItens : integer;
begin
Result := Self.Count;
end;

function TListItem.TotalItensView(i : integer) : TPedidoItem;
begin
Result := Self.Items[i];
end;


na classe Tpedido declare uma property do tipo dela

private
FItens : TListItem;
public
property Itens : TListItem read FItens write Fitens;
end;

e no Create da classe mestre (TPedido), ao invés de criar o objeto Item, você cria a lista.

FItens := TListItem.Create;


Dessa for você teria que retirar a List que existe na classe TPedidoItem, e suas referências, sendo que assim a classe TPedidoItem recebe as características dos itens, e a TListItem pode ser encarada como um array de Obejtos do tipo TpedidoItem.

Você pode estudar também TCollection e TCollectionItem, que podem ser úteis para esse tipo de implementação.

Abs.
GOSTEI 0
Ricardo Matarazzo

Ricardo Matarazzo

03/07/2014

Obrigado novamente..
legal.. vou procurar tambem sobre Tcollection e TcollectionItem vlw pela dica
GOSTEI 0
POSTAR