Fórum Dúvida sobre criação de componentes #257220

04/11/2004

0

Olá! Essa é uma dúvida que eu tenho há muito tempo sobre construção de componentes. Imaginem que eu queira construir um DBGrid que faz com que todas as teclas pressionadas sejam convertidas para maiúsculas.
Ou melhor, eu queria implementar uma propriedade CharCase para o DBGrid. Eu tentei fazer da seguinte forma:

No constructor do componente eu coloquei:
OnKeyPress := MyKeyPress;


Na rotina MyKeyPress eu checo o valor da propriedade CharCase e se for
ecUpperCase ele faz: UpCase(Key) e etc.

A dúvida vem agora. Se eu intalar esse componente o usuário vai poder colocar outra rotina no OnKeyPress fazendo com que meu código não funcione. Como fazer então para que eu possa executar um código em um evento da Classe Base?

E uma outra pequena dúvida: Não existe nenhuma função que faça o contrário da função UpCase? LowerCase só aceita string. Alguma idéia?

Bem, valeu ae pela atenção! Até!


Delphi32

Delphi32

Responder

Posts

04/11/2004

Gilvanj

> Se eu intalar esse componente o usuário vai poder colocar outra
> rotina no OnKeyPress fazendo com que meu código não funcione
Pode ocorrer sim. Se o usuário utilizar OnKeyPress, ele deveria chamar a instrução ´inherited´ para que o tratamento da classe seja executado, caso contrário será ignorado (prevalecendo o que o usuário do componente codificar).
Vc tb pode criar seu novo componente baseado no TCustomDBGrid e dessa forma não publicar OnKeyPress e criar um novo evento para que seja tratado o pressionamento de teclas pelo usuário do componente.

Sobre o UpCase, tente fazer isso:

var
vCar : Char;
begin
vCar := UpperCase(´x´)[1];
...


Responder

Gostei + 0

04/11/2004

Michael

Olá amigo Delphi32!

É fácil a solução do seu problema. Você disse que no construtor da classe adicionou a linha OnKeyPress := MyKeyPress, não é? MyKeyPress, presumo eu, seja um tipo-procedure do mesmo tipo do evento OnKeyPress, não é? Se for, basta adicionar ao final da implementação que você fez para tornar os caracteres maíusculos as linhas abaixo:

if Assigned(OnKeyPress) then
  OnKeyPress(Self, Key);


Assim, ao término da execução do seu novo código, se o usuário tiver inserido uma nova função para o evento OnKeyPress, este será executado apenas depois do seu.

Qualquer dúvida, é só perguntar!

Abraços!


Responder

Gostei + 0

05/11/2004

Rodc

Se você realmente criou seu componente DBGrid herdando do DBGrid do Delphi, então é só herdar a função OnKeyPress do Componente e implementar.

[color=darkred:aa0f71281c]type
  TDBGridteste = class(TDBGrid)
  private
    { Private declarations }
  protected
    procedure KeyPress(var Key: Char); override;[/color:aa0f71281c]

E implemente o código do KeyPress DO COMPONENTE:

[color=darkred:aa0f71281c]procedure TDBGridteste.KeyPress(var Key: Char);
begin
  inherited;
  Key := upCase(key);
end;[/color:aa0f71281c]

Aí, quando no programa você for colocar código no KeyPress do seu componente, ele vai executar primeiro o seu código para depois ir no código do usuário do componente. Entendeu?
Qualquer coisa avisa que te ajudo...

Rodrigo Cesar


Responder

Gostei + 0

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

Aceitar