Fórum Duvida em Array Property #262070
15/12/2004
0
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
Curtir tópico
+ 0Posts
15/12/2004
Massuda
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;
Gostei + 0
15/12/2004
Fórum Vini
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..
Gostei + 0
15/12/2004
Joeygustavo
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!
Gostei + 0
15/12/2004
Bruno_fantin
Const Casa = 0;
Rua = 1;
Carro= 2;
Etc...
Ai você pode fazer o que queria....
elemento[Casa] := ´verde´...
Gostei + 0
15/12/2004
Fórum Vini
É 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.
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;
Gostei + 0
15/12/2004
Massuda
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;
Gostei + 0
17/12/2004
Joeygustavo
Até mais!
José Gustavo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)