Mensagem de Componente

Delphi

19/11/2005

Caros amigos,

Tenho um componente que não permite que as teclas pressionadas sejam identificadas quando o foco está sobre ele. Já tentei corrigir este problema em seus fontes, porém não consegui. Por isso pergunto: alguem pode me ajudar a solucionar este problema?

Desde já agradeço.


Alex Maia

Alex Maia

Curtidas 0

Respostas

Martins

Martins

19/11/2005

[quote:443919fa75=´Alex Maia´]Caros amigos,

Tenho um componente que não permite que as teclas pressionadas sejam identificadas quando o foco está sobre ele. Já tentei corrigir este problema em seus fontes, porém não consegui. Por isso pergunto: alguem pode me ajudar a solucionar este problema?

Desde já agradeço.[/quote:443919fa75]

Continua sendo aquele probleminha lá do componente q quando recebe o foco não lhe deixa utilizar as teclas de função?


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

É este mesmo amigo. Vc pode me ajudar?


GOSTEI 0
Martins

Martins

19/11/2005

[quote:f91b971dee=´Alex Maia´]É este mesmo amigo. Vc pode me ajudar?[/quote:f91b971dee]

Vou baixar o componente no link passado pelo [b:f91b971dee]Massuda[/b:f91b971dee] no tópico anterior, e dar uma olhada no código dele.


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Preciso com urgência... não estou conseguindo. Alguem pode me ajudar?


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Alguem pode ajudar??


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Por favor... alguem pode me ajudar???
Desde já agradeço.


GOSTEI 0
Ramms

Ramms

19/11/2005

amigo declare aki o seu problema...
eu não vi o outro tópico que vcs estão falando....


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Mais uma vez!!!

Caros amigos,

Tenho um componente que não permite que as teclas pressionadas sejam identificadas quando o foco está sobre ele. Já tentei corrigir este problema em seus fontes, porém não consegui. Por isso pergunto: alguem pode me ajudar a solucionar este problema?

Desde já agradeço.


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Alguem por favor... eu mando os fontes!!!!!!!!!!!


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Alguem??


GOSTEI 0
Edilcimar

Edilcimar

19/11/2005

se o componente não permite a visualização da tecla somente quando o mesmo está focado então o problema está no componente, mostre o código do onkeypress ou onkeydown do componente


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Este é o código:

procedure TXiButton.WMKeyDown(var msg: TWMKeyDown);
begin
if msg.CharCode = VK_SPACE then FBtnState:= bsDown;
if msg.CharCode = VK_RETURN then Click;
Paint;
end;


GOSTEI 0
Edilcimar

Edilcimar

19/11/2005

veja este exemplo
procedure TForm30.Edit12KeyPress(Sender: TObject; var Key: Char);
begin
If Key = (´,´) then
Key := (´.´)
Else
If ((Key < #47) or (Key > 58)) and (Key <> 46) and (Key <> 08) then
Begin
ShowMessage(´AQUI SÓ É PERMITIDO DIGITAR NÚMEROS OU PONTO´);
Key := 08;
End;
end;
aqui funciona, só que eu uso no onkeypress e não no onkeydown


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Não amigo, vc não está entendendo... É o seguinte:

Quando adicionamos um componente button do delphi, setamos a propriedade KeyPreview do form para True e colocamos algum código que identifique as teclas pressionadas no OnKeyDown do form, não importando em qual componente está o foco; as teclas são identificadas e as funções do evento são realizadas quando pressionamos algo. O meu problema é que quando o foco está no meu componente Button as mensagens de pressinamento de teclas não são identificadas pelo windows e, por isso, as funções não são executadas. O que eu quero é uma ajuda para corrigir o código fonte do meu componente para eliminar este problema. A identificação das teclas deve funcionar sem que seja necessário colocar alguma linha no evento onkeydown ou onkeypress do componente. entendes??

Sendo assim, mais uma vez eu pergunto:

ALGUEM PODE ME AJUDAR????????

DESDE JÁ AGRADEÇO.


GOSTEI 0
Michael

Michael

19/11/2005

Olá!

Testei aqui e comigo funcionou perfeitamente. O componente só sobrepõe as teclas configuradas no evento [b:13c6271d34]OnKeyPress [/b:13c6271d34]do formulário caso as propriedades [b:13c6271d34]Cancel[/b:13c6271d34] e/ou [b:13c6271d34]Default [/b:13c6271d34]estejam setadas para [b:13c6271d34]true[/b:13c6271d34]. E isso é perfeitamente normal. O componente [b:13c6271d34]TButton [/b:13c6271d34]da VCL tbm se comporta assim.

Não há nada errado com o componente.

[]´s


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Só que não uso o OnKeyPress, mas sim o OnKeyDown.

Para ver se funciona a captura dessas teclas, crie um novo projeto, adicione um label, adicione um XiButton no form, mude a propriedade do keypreview do form para True e no evento OnKeyDown do form use o seguinte comando:


if key = vk_F1 Then Label1.caption:=´TeclaF1´;


Neste exemplo, se o foco estiver no botão e a tecla F1 for pressionada o label1 não receberá o texto (TeclaF1). Este é o problema...

Alguem sabe me informar por que isso acontece??
Que código falta neste botão?

Desde já agradeço.


GOSTEI 0
Martins

Martins

19/11/2005

Olá! Testei aqui e comigo funcionou perfeitamente. O componente só sobrepõe as teclas configuradas no evento [b:6b5fff7f41]OnKeyPress [/b:6b5fff7f41]do formulário caso as propriedades [b:6b5fff7f41]Cancel[/b:6b5fff7f41] e/ou [b:6b5fff7f41]Default [/b:6b5fff7f41]estejam setadas para [b:6b5fff7f41]true[/b:6b5fff7f41]. E isso é perfeitamente normal. O componente [b:6b5fff7f41]TButton [/b:6b5fff7f41]da VCL tbm se comporta assim. Não há nada errado com o componente. []´s


Foi isso q eu disse no tópico anterior.

Naõ baixei o componente, mas se o colega puder enviar uma cópia para martinsbios@gmail.com posso dar uma olhada nele, mas o Michael já olhou e já postou sobre o mesmo.

Esse seu componente é derivado de qual calsse?

Espero q esse problema se resolva.

Boa Sorte!!!


GOSTEI 0
Martins

Martins

19/11/2005

Não precisa mais mandar o código pro meu e-mail, eu peguei novamente o link passado pelo massuda, estou sem delphi, mas amnhã baixo ele lá no trampo, e dou uma olhada nele para vc.

Outra coisa q vc deve levar em conta é q ele deve ter as propriedades:
OnKeyDown
OnKeyPress

Então se o foco cai sobre o botão ele vai esperar q a tecla de função pressionada dispare algum evento escrito nestas propriedades, faça um teste e coloque alguma coisa lá no evento OnKeyDown e veja se é executado, deverá ser, estou atirando no escuro pois não sei realmente como está se comportando esse componente, por isso continua valendo a dica do Michael.

Testei aqui e comigo funcionou perfeitamente. O componente só sobrepõe as teclas configuradas no evento OnKeyPress do formulário caso as propriedades Cancel e/ou Default estejam setadas para true. E isso é perfeitamente normal. O componente TButton da VCL tbm se comporta assim.


Agora se vc não quer ter q mudar isso em todos os seu botões, então deixe essas propriedades como true por default, pq elas devem está false, isso no código do componente.

Amanhã vejo esses fontes e posso me situar.

Boa sorte!!!


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Caros amigos,

Mais uma vez volto a dizer que há um erro no componente que estou usado e que, por isso, preciso de uma ajuda de vcs.

Para quem desejar me ajudar o link para baixar os componentes é http://deadlogic.co.nr/

Eu uso o delphi 7 e para comprovar vcs podem fazer o seguinte: para ver se funciona a captura dessas teclas crie um novo projeto, adicione um label, adicione um XiButton no form, adicione um Button do delphi no form tambem; mude a propriedade do keypreview do form para True e no evento OnKeyDown do form use o seguinte comando:


if key = vk_F1 Then Label1.caption:=´TeclaF1´;


Compile e execute o aplicativo. Clique no XiButton e depois pressione a tecla F1. Observe que se o foco estiver no XiButton e a tecla F1 for pressionada, o label1 não recebe o texto ´TeclaF1´.

Agora clique no Button e depois pressione a tecla F1. É a mesma operação, mas veja que se o foco estiver no Button e a tecla F1 for pressionada, o label1 recebe o texto ´TeclaF1´.

Este é o problema...

Em virtude disso amigos, eu pergunto:

Alguem sabe me informar por que isso acontece??
Que código falta neste botão?

Desde já agradeço.


GOSTEI 0
Martins

Martins

19/11/2005

{================================================================

    XiButton 1.13
    Written by Eugene Genev
    
=================================================================}

unit XiButton;

interface

uses
  Windows, Classes, Controls, Graphics, Messages, Forms, Dialogs,
  Math, SysUtils;

type
  TBtnState = (bsNormal, bsOver, bsDown);
  TButtonLayout = (blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom);
  TColorScheme = (csNeoDesert, csNeoSky, csNeoGrass, csNeoSilver,
       csNeoRose, csNeoSun,
       csDesert, csGrass, csSky, csSun, csRose, csSilver, csCustom);

  TXiButton = class(TCustomControl)
  private
    FColorFace: TColor;
    FColorGrad: TColor;
    FColorBorder: TColor;
    FColorLight: TColor;
    FColorDark: TColor;
    FColorText: TColor;
    FOverColorFace: TColor;
    FOverColorGrad: TColor;
    FOverColorBorder: TColor;
    FOverColorLight: TColor;
    FOverColorDark: TColor;
    FOverColorText: TColor;
    FDownColorFace: TColor;
    FDownColorGrad: TColor;
    FDownColorBorder: TColor;
    FDownColorLight: TColor;
    FDownColorDark: TColor;
    FDownColorText: TColor;
    FDisabledColorFace: TColor;
    FDisabledColorGrad: TColor;
    FDisabledColorBorder: TColor;
    FDisabledColorLight: TColor;
    FDisabledColorDark: TColor;
    FDisabledColorText: TColor;
    FColorFocusRect: TColor;
    FFocused: Boolean;
    FColorScheme: TColorScheme;
    FCtl3D: boolean;
    FLayout: TButtonLayout;
    FGlyph: TBitmap;
    FTransparentGlyph: Boolean;
    FGradient: Boolean;
    FSpacing: integer;
    FModalResult: TModalResult;
    FCancel: Boolean;
    FDefault: Boolean;
    FHotTrack: Boolean;
    FClicked: Boolean;
    procedure SetColors(Index: integer; Value: TColor);
    procedure SetColorScheme(Value: TColorScheme);
    procedure SetCtl3D(Value: Boolean);
    procedure SetLayout(Value: TButtonLayout);
    procedure SetGlyph(Value: TBitmap);
    procedure SetTransparentGlyph(Value: Boolean);
    procedure SetGradient(Value: Boolean);
    procedure SetSpacing(Value: Integer);
    procedure SetModalResult(Value: TModalResult);
    procedure SetCancel(Value: Boolean);
    procedure SetDefault(Value: Boolean);
    procedure SetHotTrack(Value: Boolean);
    procedure GradientFillRect(Canvas: TCanvas; Rect: TRect;
                   StartColor, EndColor: TColor);
  protected
    FBtnState: TBtnState;
    procedure Paint; override;
    procedure Click; Override;
    procedure MouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove (Shift: TShiftState; X, Y: Integer); override;
    procedure WMSetFocus(var msg: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var msg: TWMKillFocus); message WM_KILLFOCUS;
    procedure WMKeyUp(var msg: TWMKeyUp); message WM_KEYUP;
    procedure WMKeyDown(var msg: TWMKeyDown); message WM_KEYDOWN;
    procedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY;
    procedure CMDialogChar(var msg: TCMDialogChar); message CM_DIALOGCHAR;
    procedure CMTextChanged (var msg: TMessage); message CM_TEXTCHANGED;
    procedure CMFontChanged(var msg: TMessage); message CM_FONTCHANGED;
    procedure CMEnabledChanged (var msg: TMessage); message CM_ENABLEDCHANGED;
    function GetColorScheme: TStringList;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColorFace: TColor index 0 read FColorFace write SetColors;
    property ColorGrad: TColor index 1 read FColorGrad write SetColors;
    property ColorDark: TColor index 2 read FColorDark write SetColors;
    property ColorLight: TColor index 3 read FColorLight write SetColors;
    property ColorBorder: TColor index 4 read FColorBorder write SetColors;
    property ColorText: TColor index 5 read FColorText write SetColors;
    property OverColorFace: TColor index 6 read FOverColorFace write SetColors;
    property OverColorGrad: TColor index 7 read FOverColorGrad write SetColors;
    property OverColorDark: TColor index 8 read FOverColorDark write SetColors;
    property OverColorLight: TColor index 9 read FOverColorLight write SetColors;
    property OverColorBorder: TColor index 10 read FOverColorBorder write SetColors;
    property OverColorText: TColor index 11 read FOverColorText write SetColors;
    property DownColorFace: TColor index 12 read FDownColorFace write SetColors;
    property DownColorGrad: TColor index 13 read FDownColorGrad write SetColors;
    property DownColorDark: TColor index 14 read FDownColorDark write SetColors;
    property DownColorLight: TColor index 15 read FDownColorLight write SetColors;
    property DownColorBorder: TColor index 16 read FDownColorBorder write SetColors;
    property DownColorText: TColor index 17 read FDownColorText write SetColors;
    property DisabledColorFace: TColor index 18 read FDisabledColorFace write SetColors;
    property DisabledColorGrad: TColor index 19 read FDisabledColorGrad write SetColors;
    property DisabledColorDark: TColor index 20 read FDisabledColorDark write SetColors;
    property DisabledColorLight: TColor index 21 read FDisabledColorLight write SetColors;
    property DisabledColorBorder: TColor index 22 read FDisabledColorBorder write SetColors;
    property DisabledColorText: TColor index 23 read FDisabledColorText write SetColors;
    property ColorFocusRect: TColor index 24 read FColorFocusRect write SetColors;
    property ColorScheme: TColorScheme read FColorScheme write SetColorScheme;
    property Ctl3D: Boolean read FCtl3D write SetCtl3D;
    property Layout: TButtonLayout read FLayout write SetLayout;
    property Glyph: TBitmap read FGlyph write SetGlyph;
    property Spacing: integer read FSpacing write SetSpacing;
    property TransparentGlyph: Boolean read FTransparentGlyph write SetTransparentGlyph;
    property Gradient: Boolean read FGradient write SetGradient;
    property HotTrack: Boolean read FHotTrack write FHotTrack;
    property Action;
    property Align;
    property Anchors;
    property BiDiMode;
    property Cancel: Boolean read FCancel write FCancel default False;
    property Caption;
    property Constraints;
    property Default: Boolean read FDefault write SetDefault default False;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property ModalResult: TModalResult read FModalResult write SetModalResult default 0;
    property ParentBiDiMode;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop default True;
    property Visible;
    property OnClick;
   // property OnContextPopup;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;


Se alguém encontrar uma propriedade q esteja faltando ou q não deveria está nesse código, por favor, comente.


GOSTEI 0
Michael

Michael

19/11/2005

Corrija o método [b:a64646ffe0]WMKeyDown[/b:a64646ffe0], deixando-o assim:

procedure TXiButton.WMKeyDown(var msg: TWMKeyDown);
begin
  if msg.CharCode = VK_SPACE then
    FBtnState:= bsDown
  else if msg.CharCode = VK_RETURN then
    Click
  else
    inherited;
  Paint;
end;


Isto resolverá o problema.

[]´s


GOSTEI 0
Michael

Michael

19/11/2005

Na verdade, deveria ficar assim:

procedure TXiButton.WMKeyDown(var msg: TWMKeyDown);
begin
  inherited;
  if msg.CharCode = VK_SPACE then
    FBtnState:= bsDown
  else if msg.CharCode = VK_RETURN then
    Click;
  Paint;
end;


[b:0baf0111a8]inherited[/b:0baf0111a8] deve, na maioria dos casos, ser a primeira coisa executada em métodos sobrescritos. O problema do componente era justamente esse: ele não executava o código original de TCustomControl, que propagava a tecla pressionada para o Parent do componente, no caso, o Form.

[]´s


GOSTEI 0
Alex Maia

Alex Maia

19/11/2005

Caros amigos,

Muito obrigado pela ajuda que vcs me prestaram. Desde já eu lhes desejo um Feliz Natal e um Próspero Ano Novo.

Valeu!!!


GOSTEI 0
POSTAR