Fórum Array Propert #411915

25/01/2012

0

Tenho a seguinte estrutura:

function getEndereco(index: integer): TclsEndereco_Pessoa;
procedure setEndereco(index: integer; const Value: TclsEndereco_Pessoa);

fArraycli_Endereco_Cliente:array of TclsEndereco_Pessoa;

property array_pes_endereco[index:integer]:TclsEndereco_Pessoa read getEndereco write setEndereco;


function TclsPessoa.getEndereco(index: integer): TclsEndereco_Pessoa;
begin
Result:= fArraycli_Endereco_Cliente[index];
end;

procedure TclsPessoa.setEndereco(index: integer;
const Value: TclsEndereco_Pessoa);
begin
fArraycli_Endereco_Cliente[index]:= value;
end;

-------------------------------------------------------------------------
Quando tento fazer assim em tempo de copilação esta dando erro :[DCC Error] clsCliente.pas(119): E2029 [ expected but ) found.
E o para no for.

{Incluir na tabela de Endereços}

for I := 0 to High(array_pes_endereco) do
array_pes_endereco[i].Mantem(pAcao);
Osvaldo Junior

Osvaldo Junior

Responder

Posts

25/01/2012

Marco Salles

qual o delphi que voce esta utilizando

Da suporte a generrics ???
Responder

Gostei + 0

25/01/2012

Emerson Nascimento

como array_pes_endereco é uma propriedade e não um array, creio que seja necessário criar um método Count (assim como a contagem de linhas de um Memo ou de um StringList). dessa forma você poderá varrer os itens da sua propriedade com o uso do for.

function TclsPessoa.Count: integer;
begin
try
Result := Length(fArraycli_Endereco_Cliente);
except
Result := 0;
end;
end;



então você poderá usar assim:

for i := 0 to clsPessoa.Count-1 do
clsPessoa.array_pes_endereco[i].Mantem(pAcao);
Responder

Gostei + 0

25/01/2012

Osvaldo Junior

Marco o delphi e o 2007.
Responder

Gostei + 0

25/01/2012

Osvaldo Junior

Emerson, vou tentar da forma que voce falou.
Responder

Gostei + 0

25/01/2012

Marco Salles

O delphi 2007 não tem generics... Então tente como o emerson falou que voce está em boas
mãos
Responder

Gostei + 0

26/01/2012

José Rubens

Olá pessoal,

Não sei se foi omitido do código mas vou perguntar assim mesmo. Como estamos trabalhando com array dinâmico não temos que criar o elemento antes de atribuir um algo a ele?

Está em outra parte do código este redimensionamento do array?

Responder

Gostei + 0

26/01/2012

Marco Salles

Olá pessoal,
Não sei se foi omitido do código mas vou perguntar assim mesmo. Como estamos trabalhando com array dinâmico não temos que criar o elemento antes de atribuir um algo a ele?
Está em outra parte do código este redimensionamento do array?


Bem Jose , eu não gostomuito desse Modelo , porque existem classes no Delphi que dão uma Orientação
Melhor e facilita o Trabalho neste sentido. Porém acredito que deva sim de alguma for alocar
Memória para o Array.. Uma das formas , talves não a melhor é esta

procedure Tteste.setEndereco(index: integer; const Value: TclsEndereco_Pessoa);
begin
if index > High(fArraycli_Endereco_Cliente) then
begin
index:= High(fArraycli_Endereco_Cliente)+1
SetLength(fArraycli_Endereco_Cliente,Length(fArraycli_Endereco_Cliente)+1);
end
else
begin
// destruição do Objeto para Alocação de Outro Objeto posteriomente
fArraycli_Endereco_Cliente[index].Free;
fArraycli_Endereco_Cliente[index]:=nil
end;
//Sobreposição ou Novo Objeto Atribuido ao Indice Index
fArraycli_Endereco_Cliente[index]:= value;
end;


Responder

Gostei + 0

26/01/2012

Osvaldo Junior

Emerson da forma que voce falou ficou ok, obrigado.
Marcos que classe voce usaria?
Responder

Gostei + 0

26/01/2012

Emerson Nascimento

Creio que ele esteja usando o mesmo esquema das listas padrão: Add.
Responder

Gostei + 0

26/01/2012

Marco Salles

Emerson da forma que voce falou ficou ok, obrigado.
Marcos que classe voce usaria?


Então o delphi é muito Rico em recursos ... existem várias coleções que se pode usar
O delphi nas versões novas nen se fala .. mas segue ai um classe pouco utilizada]
mas muito interressante .. As classes TCollectionItem e TCollection

segue

 TclsEndereco_Pessoa = class (TCollectionItem)
  public
    Rua:String;
  end;

  TclsPessoa = class (TCollection)
  end;



var
endereco_Um,Endereco_Dois: TclsEndereco_Pessoa;
Pessoas:TclsPessoa;
i:integer;
begin
  Pessoas:= TclsPessoa.Create(TclsEndereco_Pessoa);//************************ Hegemonia ******
  try
  endereco_Um:=TclsEndereco_Pessoa.Create(pessoas);
  endereco_Um.Rua:=Rua_Um;
  Endereco_Dois:=TclsEndereco_Pessoa.Create(Pessoas);
  Endereco_Dois.Rua:=Rua_Dois;

   for i := 0 to pred(Pessoas.Count) do
     Showmessage(TclsEndereco_Pessoa(Pessoas.GetItem(i)).Rua);
  finally
   pessoas.Free;
  end;
end;


Uma grande vantagem desta abortagem é a A restrição imposta pela TCollectionItem de criar instancias da sua
coleção unicamente da classe que foi especificada em seu contructor
Isto garante a homogenidade da coleção

Por exemplo imagine uma classe

 Teste = class (TCollectionItem)
  public
    Rua:String;
  end;
[code]/

Como  o Constructor de Pessoas esta definido para a classe TclsEndereco_Pessoa so Objetos
desta instancia podem fazer parte desta coleção .. Logo ao FAzer em RumTime

[code]
  obtTeste:=TTeste.Create(pessoas); //***************ERRO*****
  obtTeste.Rua:=teste;
[code]


Obteremos um erro em rumtime que nos alertara para a inclusão de um Objeto
que não pertence a Lista

enfim espero que te sirva para alguma coisa
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar