GARANTIR DESCONTO

Fórum Duvida em Array Property #262070

15/12/2004

0

Criei uma classe bastante parecida com a classe abaixo:

type
ClasseTeste = class(SuperClasseTeste)
protected
elementos : array[1..4] of integer;
function getElemento(index: integer): integer;
procedure setElemento(index: integer; el: integer);
property pElementos[index: integer]: integer read getElemento write setElemento;
end;

E funcionou perfeitamente. Acontece que eu quero que a lista ´elementos´ possua strings como indice, porque pra mim fica mais facil referenciar os elementos desta lista através de seus códigos, que não são inteiros... Eu li que array properties podem possuir indices de outros tipos sem ser inteiros, mas não encontro nenhum exemplo onde o indice não é inteiro, e não estou sabendo como definir esta lista ´elementos´ para que seus indices NAO sejam inteiros... Eu queria fazer algo de modo que a funcao getElemento e setElemento ficariam mais ou menos assim:

function getElemento(index: string): integer;
procedure setElemento(index: sting; el: integer); ,

e a propriedade ficasse deste jeito:

property pElementos[index: string]: integer read getElemento write setElemento;

Apenas alterando assim, dá erro... Como eu preciso modificar a declaracao do atributo protected elementos, de forma que o codigo fique correto??

Obrigado!

José Gustavo


Joeygustavo

Joeygustavo

Responder

Posts

15/12/2004

Massuda

Este código...
type 
  ClasseTeste = class
  protected
     elementos : array[1..4] of integer;
     function getElemento(index: string): integer;
     procedure setElemento(index: string; el: integer);
     property pElementos[index: string]: integer read getElemento write setElemento;
  end;

function ClasseTeste.getElemento(index: string): integer;
begin
end;

procedure ClasseTeste.setElemento(index: string; el: integer);
begin
end;
Compila sem problemas... Que erro está informando?


Responder

Gostei + 0

15/12/2004

Fórum Vini

Olá,
o que você tentou fazer para passar o índice para String está correto, o problema deve ter ocorrido na implementação dos métodos Get e Set.. veja este exemplo:
function TClasseTeste.GetpElementos(Indice: String): Integer;
var
  cont: Integer;
begin
  for cont:= 0 to 4 do
    if fElementos[cont] = Indice then
    begin
      Result:= cont; //Coloquei para retornar o índice somente como um exemplo, mas vc poderia retornar qualquer coisa aqui;
    end;
end;

Já que os seus códigos são em String, eu coloquei um Array de String no lugar..


Responder

Gostei + 0

15/12/2004

Joeygustavo

Eu tinha pensado em fazer isso mesmo, só achei que o Delphi implementava alguma strutura de dados em que os indices poderiam ser strings, de modo que, se eu fizesse o seguinte:
elemento[´casa´] := ´verde´...
É porque no meu codigo, na verdade eu tenho um array de objetos... E eu queria indexar esse vetor pelo codigo destes objetos... Mas eu posso construir um record, com dois campos, um com o codigo e outro com o objeto, e usar deste jeito que vc falou, acho que resolve o problema!
Muito obrigado pela ajuda!


Responder

Gostei + 0

15/12/2004

Bruno_fantin

Tenta fazer isso...

Const Casa = 0;
Rua = 1;
Carro= 2;
Etc...


Ai você pode fazer o que queria....

elemento[Casa] := ´verde´...


Responder

Gostei + 0

15/12/2004

Fórum Vini

Eu tinha pensado em fazer isso mesmo, só achei que o Delphi implementava alguma strutura de dados em que os indices poderiam ser strings, de modo que, se eu fizesse o seguinte: elemento[´casa´] := ´verde´...

É possível fazer isso sim, mas é o programador quem tem que identificar o objeto no array que corresponde ao índice ´casa´, e também implementar o método para setar o valor desse item como ´verde´. Isso acontece porque as propriedades são somente métodos, você pode muito bem criar uma propriedade que não tenha nenhum campo( field ) associado à ela :wink:
Em outras palavras: uma propriedade array não está necessariamente ligada à um array, essa denominação é usada pela sintaxe parecida no código.
É porque no meu codigo, na verdade eu tenho um array de objetos... E eu queria indexar esse vetor pelo codigo destes objetos...

Ok, faça assim:
  TMeuObjeto = class
  public
    Codigo: String;
  end;

  TClasseTeste = class
  private
    FObjetos: array[0..4] of TMeuObjeto;
    function GetfMinhaProp(Codigo: String): TMeuObjeto;
    procedure SetfMinhaProp(Codigo: String; const Value: TMeuObjeto);
  public
    property fMinhaProp[Codigo: String]: TMeuObjeto read GetfMinhaProp write SetfMinhaProp;
  end;

function TClasseTeste.GetfMinhaProp(Codigo: String): TMeuObjeto;
var
  cont: Integer;
begin
  for cont:= 0 to 4 do
    if ( Codigo = fObjetos[cont].Codigo ) then
    begin
      Result:= fObjetos[cont];
      exit;
    end;
end;

procedure TClasseTeste.SetfMinhaProp(Codigo: String;
  const Value: TMeuObjeto);
var
  ObjAntigo: TObject;
begin
  // Observe que eu guardei a referência do
  // objeto antigo, para poder retirá-lo da memória depois
  ObjAntigo:= GetFMinhaProp( Codigo );
  GetFMinhaProp( Codigo ):= Value;
  ObjAntigo.Free;
end;

Se você precisar de um gerenciamento mais sofisticado da sua lista( ordenar itens, inserir em qualquer posição, adicionar, remover ), você pode usar a classe TList, que é específica para listas de objetos :wink:

Espero ter ajudado,
Vinicius;


Responder

Gostei + 0

15/12/2004

Massuda

Eu tinha pensado em fazer isso mesmo, só achei que o Delphi implementava alguma strutura de dados em que os indices poderiam ser strings, de modo que, se eu fizesse o seguinte: elemento[´casa´] := ´verde´...
No lugar de um array, você pode usar um TStringList para associar um objeto a uma string...
var
  Lista: TStringList;
  N: Integer;
begin
  Lista := TStringList.Create;

  // adiciona um objeto e seu identificador
  Lista.AddObject(´Um Identificador´, UmObjeto);
  Lista.AddObject(´Outro Identificador´, OutroObjeto);

  // busca um objeto pelo identificador
  N := Lista.IndexOf(´Identificador´);
  if N >= 0 then
    Objeto := Lista.Objects[N];
  else
    Objeto := nil;

  // atenção...
  // antes de destruir a lista de string, precisa destruir os objetos!
  for N := 0 to Lista.Count - 1 do
    Lista.Objects[N].Free;
  Lista.Free;



Responder

Gostei + 0

17/12/2004

Joeygustavo

As duas solucoes que voces apresentaram deu certo! Obrigado pela ajuda de todos, ela foi essencial!

Até mais!

José Gustavo


Responder

Gostei + 0

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

Aceitar