Array
(
)

Atribuir valor a propriedade pelo nome em String, como?

Yallebr
   - 16 fev 2006

Olá pessoal,

Preciso atribuir uns valores as propriedades, porém quero passar o nome da propriedade em string, pois gero em Run Time.

Exemplo:

for Cont := 1 to 10 do
Nome := ´Prop´ + InttoStr(Cont)

Objeto.Nome := 10;

Gostaria de fazer tipo o FieldByName de uma tabela.

Obrigado.


Marco Salles
   - 16 fev 2006

acredito que esse objeto é de algum tipo ..então :

TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;


Martins
   - 16 fev 2006


Citação:
acredito que esse objeto é de algum tipo ..então :

TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;

Concordo com vc Marco Salles


Citação:
Gostaria de fazer tipo o FieldByName de uma tabela.


FieldByName é do tipo TField

Um pequeno exemplo usando TField
#Código


procedure CriaCampos( Tabela : TDataSet );
var
Campo : TField;
i : Integer;
begin
Tabela.Fielddefs.Update;
for i:= 0 to Pred(Tabela.FieldDefs.count) do
begin
Campo := Tabela.FindField( Tabela.FieldDefs[i].Name );
if Not assigned(Campo) then
begin
Campo := Tabela.FieldDefs[i].CreateField( Tabela.Owner );
Campo.Name := Tabela.Name +Tabela.FieldDefs[i].Name;
end;
end;
end;


Use assim:

#Código

CriaCampos(Table1);


veja o q vc pode aproveitar para seu código.

Boa sorte!!!!


Yallebr
   - 16 fev 2006


Citação:
acredito que esse objeto é de algum tipo ..então :

TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;


Esse código que passou estou nomeando meu objeto, não é isso que quero.
Quero acessar as propriedades do meu objeto, porém o nome da propriedade tenho em Run Time em forma String.

Por exemplo.


#Código


Obj = class(TObject)
property N1: Integer....
property N2: Integer....
....
property N100: Integer....
end;

var
NomeProp: string
begin
NomeProp := ´N´;
for x := 1 to 100 do
begin
NomeProp := NomeProp + IntToStr(Count);
Obj.NomeProp := Count;
end;


O que o Martins falou poderia servir se fosse TDataSet, porém isso seria simples. O meu objeto é filho de TObject não existe o FieldByName nem TField.

Quero acessar a propriedade através de uma string.

Ficou claro?

Abraços


Marco Salles
   - 16 fev 2006


Citação:
Esse código que passou estou nomeando meu objeto, não é isso que quero.


Ha então e isso ...

procure no site sobre GetPropValue ou SetPropValue


Martins
   - 16 fev 2006

para usar GetPropValue ou SetPropValue, inclua TypInfo na uses.

Código passado pelo colega fabiobb em outro tópico datado de Qui Jun 02, 2005 10:28 am
#Código


// Verificar se existe a propriedade que vc deseja
if IsPublishedProp(Objeto, ´NomePropriedade´) then

// Para setar a propriedade. O valor é variant
SetPropValue(Objeto, ´Propriedade´ , Valor);

// Para recuperar o valor. O último parâmetro diz se vc prefere o conteúdo
em texto ou não. De preferencia chame assim
GetPropValue(Objeto, ´Propriedade´, False);


Boa sorte!!


Yallebr
   - 17 fev 2006

Obrigado pessoal.


Marco Salles
   - 17 fev 2006


Citação:
Obrigado pessoal.


Eta...

Pera ai...

eu fui testar estas instruçoes com Tobject e nã consegui .. Da erro na execução..
Passei estas informaçoes para voce , porque ja tinha feito algo semelhante usando outra classe na definição.. Porem com Tobject não to conseguindo

Voce consegui :?: :?: :?:
Como consegui :?: :?: :?:

Olhe o erro que da
[URL=http://imageshack.us][img:889135d5fc]http://img117.imageshack.us/img117/6173/imagemparaweller14ec.jpg[/img:889135d5fc][/URL]

:arrow: :arrow: :arrow: :arrow: :arrow: :arrow:

Olha com defini a minha classe

#Código

type
Obj = class(Tobject)
private
FN1:integer;
FN2:integer;
function getn1: Integer;
function getn2: Integer;
procedure setn1(const Value: Integer);
procedure setn2(const Value: Integer);

published
property N1: Integer read getn1 write setn1;
property N2: Integer read getn2 write setn2;
public
constructor Create;
Destructor Destroy;override;
end;


#Código
var
my:obj;



#Código
function TForm1.getn1: Integer;
begin
result:=Fn1;
end;

function TForm1.getn2: Integer;
begin
result:=Fn2;
end;

procedure TForm1.setn1(const Value: Integer);
begin
Fn1:=value;
end;

procedure TForm1.setn2(const Value: Integer);
begin
Fn2:=value;
end;


#Código
constructor Obj.Create;
begin
FN1:=5;
FN2:=10;
end;

destructor Obj.Destroy;
begin
inherited;
end;


Para carregar

#Código
procedure TForm1.CarregarClick(Sender: TObject);
var
NomeProp:string;
x:integer;
begin
my:=obj.Create;
if (My is Obj) then
showmessage(´instanciado´);
NomeProp := ´N´;
for x := 0 to 3 do
begin
NomeProp := NomeProp + IntToStr(x);
if IsPublishedProp(My,NomeProp ) then
SetPropValue(My,NomeProp ,inttostr(x));
NomeProp:=´N´;
end;
end;


Para ler

#Código
procedure TForm1.lerClick(Sender: TObject);
var
NomeProp:string;

X:integer;
begin
NomeProp:=´N´;
for x:=1 to 2 do
begin
NomeProp:=NomeProp+inttostr(x);
showmessage(inttostr(GetPropValue(My,NomeProp ,true)));
NomeProp:=´N´;
end
end;


Porem dá erro

Como eu disse anteriormente , indiquei esses métodos porque ja o conhecia , ao executa-lo com outro tipo de classe ..Por exemplo na definiçao abaixo

#Código
type
Obj = class(Tcomponent)
private
FN1:integer;
FN2:integer;
function getn1: Integer;
function getn2: Integer;
procedure setn1(const Value: Integer);
procedure setn2(const Value: Integer);

published
property N1: Integer read getn1 write setn1;
property N2: Integer read getn2 write setn2;
public
constructor Create(Aowner:Tcomponent);override;
Destructor Destroy;override;
end;


O método funciona OK

Porem para Obj = class (Tobject) eu to obtendo este erro

sabe o porque desse erro nassuda :?: :?: :?: