Fórum Criação de componentes - fácil porém difícil #216723
26/02/2004
0
Poxa, como eu faço para publicar uma classe como uma propriedade no Object Inspector (daquelas em que aparece um + para as subpropriedades) [color=red:ca4c62a847]e fazer com que tais subpropriedades sejam armazenadas no DFM[/color:ca4c62a847]? Como eu tenho feito, apenas uma referência ao nome do objeto é feita, mas não há as subpropriedades:
object PowerButton1: TPowerButton Left = 256 Top = 128 Width = 75 Height = 25 Caption = ´PowerButton1´ TabOrder = 0 Son = PowerButton1.AlgumNomeAtribuido end
Onde PowerButton1 contém um objeto TTimer na propriedade Son, e como se vê não descreve-se o objeto (o que eu quero) mas apenas referencia seu nome. Será que tem a ver com a classe editora de propriedade? Eu registro a TClassProperty no pacote do componente para fazer aparecer as subpropriedades.
Outra coisa: o construtor do botão é executado um monte de vezes (por exemplo quando saio da visualização textual do form para a normal) fazendo com que as alterações das propriedades sejam perdidas.
Renatosilva
Curtir tópico
+ 0Posts
26/02/2004
Paulo_amorim
Eu penso que isso não seja algo tão simples, e mesmo assim isso não tem a ver com a Linguagem em si , mas sim se trata de um detalhe!
Há momentos em que ele não eh tao ´amigável´ ,mas ha outras vantagens
Até+
Gostei + 0
03/03/2004
Renatosilva
Bem, uma propriedade objeto não pode ser um TComponent, pois não podemos colocar componentes dentro de componentes, como propriedades. A solução é descender o objeto de TPersistent. Para componentes como TButton e TTimer por exemplo, só é possível criar propriedades de referência como em TDataSource.DataSet
Gostei + 0
03/03/2004
Beppe
Tem certeza? O que é então FocusControl no TLabel? E TComponent não deriva de TPersistent? Um control não pode abrigar outro control desde quando?
Gostei + 0
05/03/2004
Renatosilva
Beppe, pelo menos no Delphi 4 o FocusControl é apenas uma referência. Pelo que sei os Delphi novos têm o recurso de exibir as subpropriedades de um componente referenciado(ex: selecionamos o DataSet de um DataSource e dali mesmo acessamos suas propriedades).
Mas não sei como fazem isso, não sei se no Delphi novo eu posso ter TComponent como propriedade e suas propriedades serem salvas no DFM. Sei que aqui no D4 elas não são. Apenas quando mudei a classe do objeto para TPersistent, como recomendado em uma apostila, é que as subprobriedades passaram a ser salvas no DFM.
Qual é o seu Delphi?
Experimente criar um simples componente com outro dentro (ex: TButton com TButton) e registre TClassProperty como editor da propriedade objeto. Então me diga o que acontece.
Você pode também criar uma classe simples em vez de uma já existente, descendê-la de TComponent e ver se funciona. Se não, experimente mudar a classe ascendente para TPersistent.
Aguardo resposta.
Gostei + 0
05/03/2004
Pain_elemental
Gostei + 0
05/03/2004
Renatosilva
Quer dizer que os descendentes de TPersistent perdem sua funcionanlidade?
Onde posso obter informações sobre stream?
Como gravar as propriedades num DFM, pode dar uma dica?
Gostei + 0
05/03/2004
Pain_elemental
Não perdem. Você usa o TWriter para gravar propriedades de forma específica em uma stream.
Veja no Help do delphi a classe TStream, e suas descendentes mais usadas, TFileStream e TMemoryStream.
Bem, usei os TWriters para gravar os componetes em streams para depois utiliza-los. Já que o delphi usa TWriters para gravar os componentes, deve ser possível interceptar a gravação no DFM usando seu próprio tratamento na função ReadState e WriteState da classe TComponente.
Gostei + 0
09/03/2004
Renatosilva
Aí é que tá, o que quis dizer é o seguinte: eu não preciso fazer NADA para o TPersistent ficar gravado no form, já o TComponent por ser descendente também deveria ser assim, mas cê tá dizendo que eu tenho que MANUALMENTE escrever as propriedades no form. Entendeu por que eu acho que perde a funcionalidade?
Por falar em coisas doidas de componentes, cê sabe como criar forms com propriedades novas no Object Inspector? Eu tentei mas o published não aparece... Às vezes o Delphi dá no ****, né?
Gostei + 0
19/04/2005
Vitor Rubio
Gostei + 0
19/04/2005
Michael
É possível sim fazer o q vc quer. Tome como exemplo o componente TLabeledEdit, onde o label acoplado ao Edit permite que vc altere suas propriedades no Object Inspector diretamente, sem fazer uma referência.
Também é possível publicar novas propriedades em um componente TForm no Object Inspector. Tem uma edição da ClubeDelph que ensina a fazer isso.
Abraços!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)