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
procedure ValidaDatos(Sender: TObject; var key: char);
protected
procedure KeyPress(var Key: Char); override;
public
published
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.