Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Creacion de un objeto con el evento keypress (https://www.clubdelphi.com/foros/showthread.php?t=34139)

Ana Tudela 28-07-2006 09:30:07

Creacion de un objeto con el evento keypress
 
Hola,

he creado un objeto especial que es de la clase TEdit. Dentro de este objeto me gustaría controlar a traves del evento keypress las teclas que se pulsan.
El código que muestro a continuación es el que he hecho pero no sé si esta mal o bien. Me gustaría que alguien me orientase.

Muchas gracias.

Código Delphi [-]
 //CODIGO

unit EditAna;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, IdGlobal;

type
  TEditAna = class(TEdit)
  private
    { Private declarations }
    procedure ValidaDatos (Sender: TObject; var key: char);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure TEditAna.ValidaDatos (Sender: TObject;var key: char);
begin
        if not(((key>='a') and (key<='z')) or
               ((key>='A') and (key<='Z')) or
               IsNumeric(key) or
               (key='-') or
               (key='_')) then
        begin
             exit;
        end;
end;

procedure Register;
begin
  RegisterComponents('Standard', [TEditAna]);
end;

constructor TEditAna.Create(AOwner: TComponent);
begin
   inherited;
   OnKeyPress:=ValidaDatos(key);
end;

end.

Neftali [Germán.Estévez] 28-07-2006 09:56:31

Hola. Antes de nada, comentarte que utilices TAG's cuando escribas código Delphi.

En cuanto a lo que comentas, el único inconveniente que le veo es que utilizas el evento para programar la rutina ValidarDatos; Si luego alguien cuando el EditAna está en el formulario programa algo en el Evento OnKeyPress perderás la ejecución de tu procedimiento.

No se si me explico; OnKeyPress no es más que un puntero a un procedimento; Tú has hecho "apuntar" (valga la redundancia) ese puntero al procedimiento ValidarDatos, pero si en diseño ese evento se programa, el puntero pasa a "apuntar" al procedimiento EditAna1KeyPress (por ejemplo) y el acceso al tuyo se pierde; Puedes hacer la prueba.

Hay dos alternativas:
(1) Utilizar alguno de los mensajes de Windows que hay en los "ascendientes" de este control; Algunos de estos definidos en TWinControl debería servir:
Código Delphi [-]
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    procedure WMSysKeyDown(var Message: TWMKeyDown); message WM_SYSKEYDOWN;
    procedure WMKeyUp(var Message: TWMKeyUp); message WM_KEYUP;
    procedure WMSysKeyUp(var Message: TWMKeyUp); message WM_SYSKEYUP;

(2) Una más sencilla es usar algun procedimiento de alguno de los ascendientes que se pueda sobreescribir; en este caso en TWinControl existe:
Código Delphi [-]
  procedure KeyPress(var Key: Char); dynamic;

Si utilizas la segunda quedaría así:

Código Delphi [-]
unit UnitAna;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, IdGlobal;

type
  TEditAna = class(TEdit)
  private
    { Private declarations }
    procedure ValidaDatos(Sender: TObject; var key: char);
  protected
    { Protected declarations }
    procedure KeyPress(var Key: Char); override;
  public
  published
    { Published declarations }
  end;

procedure Register;

implementation

uses
  Dialogs;

procedure TEditAna.ValidaDatos(Sender: TObject; var key: char);
begin
  if not (((key >= 'a') and (key <= 'z')) or
    ((key >= 'A') and (key <= 'Z')) or
    IsNumeric(key) or
    (key = '-') or
    (key = '_')) then begin
    exit;
  end;
end;

procedure Register;
begin
  RegisterComponents('Standard', [TEditAna]);
end;


procedure TEditAna.KeyPress(var Key: Char);
begin
  inherited;

  ValidaDatos(Self, Key);
end;

end.

En este caso, como el evento OnKeyPress no se utiliza, puedes programarlo en el formulario sin ningun problema.

Un saludo.


La franja horaria es GMT +2. Ahora son las 06:24:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi