Atribuir valor a propriedade pelo nome em String, como?
16/02/2006
0
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.
Yallebr
Posts
16/02/2006
Marco Salles
TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;
16/02/2006
Martins
TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;[/quote:a09cbf80b8]
Concordo com vc [b:a09cbf80b8]Marco Salles[/b:a09cbf80b8]
[b:a09cbf80b8][color=darkred:a09cbf80b8]FieldByName[/color:a09cbf80b8] [/b:a09cbf80b8]é do tipo [b:a09cbf80b8][color=brown:a09cbf80b8]TField[/color:a09cbf80b8][/b:a09cbf80b8]
Um pequeno exemplo usando [b:a09cbf80b8]TField[/b:a09cbf80b8]
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:
CriaCampos(Table1);
veja o q vc pode aproveitar para seu código.
Boa sorte!!!!
16/02/2006
Yallebr
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.
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
16/02/2006
Marco Salles
Ha então e isso ...
procure no site sobre GetPropValue ou SetPropValue
16/02/2006
Martins
Código passado pelo colega [b:0a43a0399a]fabiobb[/b:0a43a0399a] em outro tópico datado de [i:0a43a0399a][b:0a43a0399a]Qui Jun 02, 2005 10:28 am[/b:0a43a0399a] [/i:0a43a0399a]
// 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!!
17/02/2006
Marco Salles
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 :cry: :cry: :cry:
Voce consegui :?: :?: :?:
Como consegui :?: :?: :?:
[b:889135d5fc]Olhe o erro que da [/b:889135d5fc]
[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
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;
var my:obj;
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;
constructor Obj.Create; begin FN1:=5; FN2:=10; end; destructor Obj.Destroy; begin inherited; end;
[b:889135d5fc]Para carregar[/b:889135d5fc]
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;
[b:889135d5fc]Para ler[/b:889135d5fc]
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;
[b:889135d5fc]Porem dá erro [/b:889135d5fc] :cry: :cry: :cry:
[b:889135d5fc][color=darkblue:889135d5fc]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[/color:889135d5fc][/b:889135d5fc]
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;
[b:889135d5fc]O método funciona OK[/b:889135d5fc]
[b:889135d5fc]Porem para Obj = class (Tobject) eu to obtendo este erro[/b:889135d5fc]
sabe o porque desse erro nassuda :?: :?: :?:
Clique aqui para fazer login e interagir na Comunidade :)