Duvida em Array Property
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
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
Curtidas 0
Respostas
Massuda
15/12/2004
Este código...Compila sem problemas... Que erro está informando?
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
Fórum Vini
15/12/2004
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:
Já que os seus códigos são em String, eu coloquei um Array de String no lugar..
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
Joeygustavo
15/12/2004
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!
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
Bruno_fantin
15/12/2004
Tenta fazer isso...
Const Casa = 0;
Rua = 1;
Carro= 2;
Etc...
Ai você pode fazer o que queria....
elemento[Casa] := ´verde´...
Const Casa = 0;
Rua = 1;
Carro= 2;
Etc...
Ai você pode fazer o que queria....
elemento[Casa] := ´verde´...
GOSTEI 0
Fórum Vini
15/12/2004
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;
GOSTEI 0
Massuda
15/12/2004
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;
GOSTEI 0
Joeygustavo
15/12/2004
As duas solucoes que voces apresentaram deu certo! Obrigado pela ajuda de todos, ela foi essencial!
Até mais!
José Gustavo
Até mais!
José Gustavo
GOSTEI 0