Criação de componentes - fácil porém difícil

Delphi

26/02/2004

Acho que ninguém vai me responder (eu só quero saber coisas doidas, né?), mas lá vai...

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

Renatosilva

Curtidas 0

Respostas

Paulo_amorim

Paulo_amorim

26/02/2004

Olá

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
Renatosilva

Renatosilva

26/02/2004

É, tô eu aqui respondendo minha própria pergunta de novo!

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
Beppe

Beppe

26/02/2004

É, tô eu aqui respondendo minha própria pergunta de novo! 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


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
Renatosilva

Renatosilva

26/02/2004

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?


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
Pain_elemental

Pain_elemental

26/02/2004

Tudo a partir de TPersistent pode ter suas propriedades publicadadas gravadas em stream. Caso você crie uma propriedade de um tipo que requer tratamento especial, você pode criar seu próprio TWriter para guardar seu componente em uma stream, sem problema algum.


GOSTEI 0
Renatosilva

Renatosilva

26/02/2004

pain_elemental, você está falando de tópicos desconhecidos por mim.

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
Pain_elemental

Pain_elemental

26/02/2004

Quer dizer que os descendentes de TPersistent perdem sua funcionanlidade?


Não perdem. Você usa o TWriter para gravar propriedades de forma específica em uma stream.

Onde posso obter informações sobre stream?

Veja no Help do delphi a classe TStream, e suas descendentes mais usadas, TFileStream e TMemoryStream.

Como gravar as propriedades num DFM, pode dar uma dica?


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
Renatosilva

Renatosilva

26/02/2004

Não perdem. Você usa o TWriter para gravar propriedades de forma específica em uma stream.


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
Vitor Rubio

Vitor Rubio

26/02/2004

Nunca criei um componente para delphi 4. Eu sei que no delphi 7 basta criar um componente dentro de outro, com se fosse uma de suas propriedades, colocar no published e usar a procedure setsubcomponent para dizer que ele é um subcomponente do principal, aí ele aparece no object inspector normalmente.


GOSTEI 0
Michael

Michael

26/02/2004

Olá amigo!

É 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
POSTAR