Fórum Classe e SubClasse #484415
03/07/2014
0
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
Curtir tópico
+ 0Posts
03/07/2014
Ricardo Matarazzo
Gostei + 0
03/07/2014
Ricardo Matarazzo
Gostei + 0
03/07/2014
Ricardo Matarazzo
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
04/07/2014
Valquiria Silva
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
04/07/2014
Ricardo Matarazzo
legal.. vou procurar tambem sobre Tcollection e TcollectionItem vlw pela dica
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)