Fórum Herdando um TForm -gt; Problema fora do padrão. #209476

26/01/2004

0

Olá, pessoal.

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

Ildefonso

Responder

Posts

26/01/2004

Renatosilva

Cara, não sei o que é KeyPreview, parece que sua propriedade está ligada a isso né? Bem, valores padrão de propriedades também já foram um problema pra mim. Inicializar propriedades no construtor da classe é um problema, aí então eu começei a retornar o valor padrão no leitor da propriedade, tipo:

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]


Responder

Gostei + 0

26/01/2004

Osocram

OI....

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


Responder

Gostei + 0

26/01/2004

Ildefonso

Obrigado, obrigado...

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.


Responder

Gostei + 0

26/01/2004

Beppe

Ao invés de usar o construtor, tente usar o Loaded.


[b:ea9c3058e0]protected[/b:ea9c3058e0]
[b:ea9c3058e0]procedure [/b:ea9c3058e0]Loaded; [b:ea9c3058e0]override[/b:ea9c3058e0];



Responder

Gostei + 0

27/01/2004

Ildefonso

Olá, Beep.

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.


Responder

Gostei + 0

27/01/2004

Renatosilva

Cara, suas novas propriedades são salvas no DFM? Se não estão sendo salvas, tente adicionar a diretiva [b:9e1e04e28d]stored[/b:9e1e04e28d]:

property EnterToTab: Boolean read FEnterToTab write FEnterToTab stored True default True;  


E as propriedades? Eu coloco no published mas não aparece nada...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar