Propriedades de classes

Delphi

06/06/2009

Olá pessoal,

Preciso que a propriedade TEXT da classe TStrings seja Published.

Gostaria de saber se é possível e como fazer ?

Porém, eu também utilizo o TStringList que é derivado do TStrings, portanto não basta apenas criar uma classe descendente de TStrings, porque eu teria que criar uma descendente de TStringList, etc.


[]s
AASN


Aasn

Aasn

Curtidas 0

Respostas

Discorpio

Discorpio

06/06/2009

Boa noite AASN

Olha, voce não pode mudar a classe TStrings e nem a TStringList que herda de TStrings.

Entretanto voce pode criar uma classe que herde de TStringList e criar uma propriedade publicada, que leia uma propriedade public da classe descendente, como :?: Assim:

   TMeuString = class(TStringList)
   public
       function GetTexto: String;
       procedure SetTexto(Const Value: String);
   published
       property Texto: String read GetTexto write SetTexto;
   end;

   implementation

  { TMeuString }

  function TMeuString.GetTexto: String;
  begin
    Result := Text;
  end;

  procedure TMeuString.SetTexto(const Value: String);
  begin
    Text := Value;
  end;


Repare que eu criei os métodos estáticos GetTexto e SetTexto que não existem em TStrings e nem em TStringList, os métodos virtuais lá existentes são o GetText e SetText sem o ´O´ final, assim como mudei também o nome da propriedade ´Text´ para ´Texto´. Contudo esses novos métodos armazenam o valor na propriedade Text da classe ancestral com SetTexto e lê de propriedade Text da classe ancestral com GetTexto, ou seja uma propriedade armazenando e lendo de outra propriedade da classe ancestral.

É só fazer o teste assim:

  procedure TForm1.Button1Click(Sender: TObject);
  var textteste: TMeuString;
  begin
    textteste := TMeuString.Create;
    textteste.Texto := ´Teste1´ + #13 + ´Teste2´;
    ShowMessage(textteste.Texto);
  end;



GOSTEI 0
Aasn

Aasn

06/06/2009

Olá Discorpio,

O meu problema é o seguinte:

eu estou montando uma rotina para preenchimento automático de controles de tela (Edit, CheckBox, Memo, etc) com as propriedades das classes (TCliente, TContato, etc), até aí tudo bem, porém, quando a propriedade é uma outra classe é que começa a complicar.

É por isso a necessidade de transformar o TEXT em published para que eu possa pegar o seu valor através de RTTI.

Abração.

AASN


GOSTEI 0
Discorpio

Discorpio

06/06/2009

Bom dia AASN.

Se bem entendi, voce quer desenvolver um Framework que possua com propriedade um objeto do tipo TStringList e que também contenha a sua propriedade Text publicada para que o Object Inspector possa exergá-la.

Como disse antes, a Classe TStrings e TStringList não podem ser modificadas porque elas pertencem a uma biblioteca interna do Delphi, que estão declaradas na Unit Classes.

Contudo, nada impede de voce enxergar a propriedade Text na execução da RTTI (Run Time Type Information), bastando para isso criar um Classe intermediária que descenda de TStringList, tal qual te dei a dica da Classe TMeuString, só que, ao invés de publicar uma propriedade como TStrings, publique-a como TMeuString, Assim:

   TMeuString = class(TStringList) 
   public 
       function GetTexto: String; 
       procedure SetTexto(Const Value: String); 
   published 
       property Texto: String read GetTexto write SetTexto; 
   end;

   TMeuFramework = class
   private
      MString: TMeuString;
      ...
   public
      function GetMeuString: TMeuString;
      procedure SetMeuString(Const Value: String);
      ...
   protected
      ...
   published
      property MeuString: TMeuString read GetMeuString write SetMeuString
      ...
   end;



GOSTEI 0
POSTAR