Propriedades de classes
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
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
Curtidas 0
Respostas
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:
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:
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
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
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
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:
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