Criação de componentes - fácil porém difícil
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:
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.
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
Curtidas 0
Respostas
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é+
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
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
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
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
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
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
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?
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
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
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
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
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!
É 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