Array properties
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
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
Curtidas 0
Respostas
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
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?
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
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