Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-07-2006
Ana Tudela Ana Tudela is offline
Miembro
 
Registrado: jul 2004
Posts: 29
Poder: 0
Ana Tudela Va por buen camino
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.

Última edición por dec fecha: 28-07-2006 a las 14:57:28.
Responder Con Cita
  #2  
Antiguo 28-07-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
evento keypress ronson Varios 40 04-01-2011 04:18:23
Llamar a evento Keypress edgusano .NET 1 30-11-2005 22:02:29
relacionar un procedimiento con un evento de un objeto aranel OOP 3 20-10-2005 21:50:36
evento on keypress y componente dinamico Rabata OOP 4 26-07-2005 21:54:38
Evento nuevo en objeto LucianoRey OOP 13 04-09-2004 01:45:22


La franja horaria es GMT +2. Ahora son las 00:19:24.


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