Ver Mensaje Individual
  #2  
Antiguo 28-07-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Reputación: 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