Fórum Herdando um TForm -gt; Problema fora do padrão. #209476
26/01/2004
0
Uma das coisas que realmente me irritam é quando uma tarefa deveria funcionar de um jeito e, na verdade, funciona de outro.
Já construi componentes e sempre consegui fazer o que estou me propondo agora, mas parece que a lógica não quer prevalecer, neste caso.
Usando dicas da revista e de outros documentos na Web, criei um TRForm, no qual acrescento uma propriedade que quero que seja publicada e definir o fonte padrão com Arial. O Código é o seguinte:
type
TRForm = class(TForm)
private
FNavegator: TAccessBar;
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property EnterToTab: Boolean
read FEnterToTab write FEnterToTab Default True;
end;
implementation
{$R *.DFM}
constructor TRForm.Create(AOwner: TComponent);
begin
inherited;
KeyPreview := True;
Font.Name := ´Arial´;
end;
Depois, como nas dicas, coloquei este novo formulário no repositório para usá-lo a partir de herança (inherited).
Quando faço isso, o novo formulário aparece com a nova propriedade no ObjectInspector. Eles até vem com nomes TRForm1, TRForm2, etc., o que significa que o IDE do Delphi os reconheceu. Mas eu defino seu valor da nova propriedade para False e durante o run-time ele volta para True.
Pela lógica, após a inicialização com o inherited, os valores de criação seriam sobrepostos pelo IDE do Delphi com o armazenamento das propriedades. Aliás, olhando o formulário em modo texto, a propriedade está lá: TabOnEnter = False.
O interessante é que salvando o formulário, a propriedade é salva corretamente. É durante o run-time que ela não processa o valor que eu defini.
Por outro lado, o fonte nem se meche. Não aparece como Arial nunca em sua propriedade no ObjectInspector.
Senhores... isso é urgente.
Agradeço.
Ildefonso
Curtir tópico
+ 0Posts
26/01/2004
Renatosilva
function TMyClass.GetMyProperty: string; begin if FMyProperty = ´´ then FMyProperty := ´Valor padrão´; Result := FMyProperty; end;
Com relação à fonte, cuja propriedade já existe, acho que não dá pois o método leitor da propriedade provavelmente é privado.
[color=red:e1da1cad7f]Cara eu estou com essa dúvida cruel: como cê consegue colocar um form com novas propriedades no Object Inspector? Me envia uma MP com os passos certinhos? Eu e meu colega estamos doidos com isso!!![/color:e1da1cad7f]
Gostei + 0
26/01/2004
Osocram
Acho q o seu prob naum eh o Keypreview... na verdade p isso q vc quer acho q nem precisa dele....
mas oq esta faltando eh
font.name :=´arial´
parentFont :=true;
depois me avise se deu certo
Gostei + 0
26/01/2004
Ildefonso
Mas ainda ´não é isso.
O KeyPreview já está orientado para True, neste meu TRForm, e sempre que eu o herdo a propriedade está corretamente definida.
O problema é a leitura do parâmetro salvo. Vejam só: o KeyPreview, por default, é False... mas o meu TRForm o está guardando corretamente como True, que é uma das minhas modificações.
Ou seja o [b:f6a970f015]ParametersBag[/b:f6a970f015] ([size=11:f6a970f015]no VB, quando criamos componentes, somos obrigados a salvar e ler os valores das propriedades no braço, através de um objeto interno do IDE, que se não me engano chama-se ParametersBag[/size:f6a970f015]) do IDE do Delphi guarda e recupera os valores das propriedades simples que ele já tem, tal como o KeyPreview, mas não recupera os valores das propriedades que eu criei, como o TabToEnter.
Propriedades complexas como o Font, que por si só já é um objeto TFont, ele não está manipulando, também.
Por vafor... não desistam. Continuo precisando de sua ajuda.
Agradecido.
Gostei + 0
26/01/2004
Beppe
[b:ea9c3058e0]protected[/b:ea9c3058e0]
[b:ea9c3058e0]procedure [/b:ea9c3058e0]Loaded; [b:ea9c3058e0]override[/b:ea9c3058e0];
Gostei + 0
27/01/2004
Ildefonso
Fazer o que no Loaded?
Não experimentei nada quanto a minha propriedade, mas já tenho este evento herdado para chamar uma função no MDIForm, informando o status do formulário recém aberto. Mas não consigo enxergar o que fazer ali em relação ao valor da propriedade. Eu tinha é que já receber o valor armazenado e com o julgamento tomar uma providência. Mas se sempre é True, julgar o que?
Eu já testei com o DEBUG: a propriedade, eu vejo no IDE, está como False. Mas ao rodar o programa ela fica True, assumindo o valor do constructor.
A sequência descrita nos manuais é que o Create inicializa - notem que a cláusula default não atribui nada, apenas informa qual o valor padrão para o IDE armazenar e atribuir os valores diferentes. É o método Create que deve providenciar o valor padrão. Na sequencia do Create é que, então, os valores diferentes dos Defaults são atribuídos às propriedades. Já tentei com e sem a cláusula default no fim da propriedade e nada.
Experimentei colocar um EnterToTab := False no evento OnCreate. Dai a propriedade fica certa, mas isso não é usar o IDE e o poder de OO. Se fosse para ficar assim eu não precisaria de tanta bagunça. O correto é a propriedade ser armazenada e recuperada como outra qualquer do ObjectInspector.
Olhem só... O IDE está reconhecendo a herança, tanto que o próprio gerador do código padrão nomeia as procedures de eventos como RFormCreate, RFormClose, etc., já que o seu tipo é o TRForm.
É algum detalhezinho que está me escapando.
Aguardo novas sugestões. Muito agradecido.
Gostei + 0
27/01/2004
Renatosilva
property EnterToTab: Boolean read FEnterToTab write FEnterToTab stored True default True;
E as propriedades? Eu coloco no published mas não aparece nada...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)