Atribuir valor a propriedade pelo nome em String, como?

16/02/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.


Yallebr

Respostas

16/02/2006

Marco Salles

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

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


Responder Citar

16/02/2006

Martins

acredito que esse objeto é de algum tipo ..então : TTipoDesseObjeto(Objeto).Name:=´nome que ser quer dar´;[/quote:a09cbf80b8] Concordo com vc [b:a09cbf80b8]Marco Salles[/b:a09cbf80b8] [quote]Gostaria de fazer tipo o FieldByName de uma tabela.


[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&93;.Name );
    if Not assigned(Campo) then
    begin
      Campo := Tabela.FieldDefs[i&93;.CreateField( Tabela.Owner );
      Campo.Name := Tabela.Name +Tabela.FieldDefs&91;i&93;.Name;
    end;
  end;
end;


Use assim:

  CriaCampos(Table1);


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

Boa sorte!!!!


Responder Citar

16/02/2006

Yallebr

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.


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


Responder Citar

16/02/2006

Marco Salles

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


Responder Citar

16/02/2006

Martins

para usar GetPropValue ou SetPropValue, inclua [b:0a43a0399a]TypInfo[/b:0a43a0399a] na uses.

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!!


Responder Citar

17/02/2006

Yallebr

Obrigado pessoal.


Responder Citar

17/02/2006

Marco Salles

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 :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 :?: :?: :?:


Responder Citar