Array properties

Delphi

09/04/2005

Olá galera,
Estou precisando implementar um array indexado por nomes, e achei os array properties, li, entendi e estou tentando implementa o exemplo do delphi, mas ao entrar em SetValue, o programa fica num loop infinito. O que estou fazendo de errado?
Abaixo o código...

TMinhaClasse = class
public
function GetValue(const Name: string):string;
procedure SetValue(const Name, Value:string);
property Values[const Name: string]: string read GetValue write SetValue;
end;

var
Form1: TForm1;
MinhaClasse: TMinhaClasse;

implementation

{$R *.dfm}

{ TMinhaClasse }

function TMinhaClasse.GetValue(const Name: string): string;
begin
Result:= Values[Name];
end;

procedure TMinhaClasse.SetValue(const Name, Value: string);
begin
Values[Name]:= Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MinhaClasse.Values[Edit1.Text]:= Edit2.Text;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// MinhaClasse:= TMinhaClasse.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// MinhaClasse.Free;
end;

Valeu a força pessoal!! :D


Garibaldi

Garibaldi

Curtidas 0

Respostas

Beppe

Beppe

09/04/2005

procedure TMinhaClasse.SetValue(const Name, Value: string); begin Values[Name]:= Value; // isso naum se faz... end;

Você não pode fazer isto, já que isto leva a uma outra chamada à SetValues. Vc deve ter um array ou lista ou semelhante pra armazenar estes valores.


GOSTEI 0
Garibaldi

Garibaldi

09/04/2005

de fato, faz sentido, na procedure de escrita eu estaria pedindo pra escrever, mas e isso:

property Items: TTreeNodes read FTreeNodes write SetTreeNodes;

procedure TCustomTreeView.SetTreeNodes(Value: TTreeNodes);
begin
Items.Assign(Value);
end;

a diferença é o assign? e por que está fazendo o assign para Items e não para FTreeNodes?


GOSTEI 0
Beppe

Beppe

09/04/2005

a diferença é o assign? e por que está fazendo o assign para Items e não para FTreeNodes?

Sim, o Assign é a diferença. Na verdade, qualquer método chamado seria a diferença.

Quando um método é invocado, o [i:7319eaad99]read[/i:7319eaad99] acaba por ser usado.

Veja exemplos(em coments o que realmente é feito):
write em ação:
// SetObjeto(NovoValor);
Objeto := NovoValor;

read em ação:
// FObjeto.Método(...);
// GetObjeto.Método(...);
Objeto.Método(...)



GOSTEI 0
POSTAR