Допустим, Вам нужен компонент поле ввода, который будет принимать только цифровые значения. Можно, конечно, запрограммировать каждый компонент в программе, но можно и просто создать новый компонент, который будет выполнять эти функции.
Вот пример, когда нужно вводить только цифры в TEdit:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in [#8,'0'..'9']) then
key:=#0;
end;
А вот довольно простой компонент, который будет выполнять это для Вас:
unit GSSimp;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TGSErrorType = (etChange, etPress);
type
TErrorEvent = procedure(Sender: TObject; ErrType: TGSErrorType)
of object;
type
TGsSimpleNumEdit = class(TEdit)
private
FOnError: TErrorEvent;
protected
procedure Change; override;
procedure KeyPress(var Key: Char); override;
published
property OnError: TErrorEvent read FOnError write FOnError;
end;
procedure Register;
implementation
procedure TGsSimpleNumEdit.Change;
var
tmpI: integer;
begin
try
tmpI := StrToInt(Text);
inherited Change;
except
if Assigned(FOnError) then
FOnError(self, etChange);
end;
end;
procedure TGsSimpleNumEdit.KeyPress(var Key: Char);
var
tText: string;
begin
if SelLength <> Length(Text) then
tText := Text
else
tText := EmptyStr;
if Key in ['0'..'9', #8, #127] then
inherited KeyPress(Key)
else
begin
Key := #0;
if Assigned(FOnError) then
FOnError(self, etPress);
end;
end;
procedure Register;
begin
RegisterComponents('Sample', [TGsSimpleNumEdit]);
end;
end.
|
Комментарии
Зачем изобретать кривой велосипед, когда есть много стандартных рабочих решений! Вот одно из них:
в событии создания формы пишем код:
var
style: cardinal;
...
begin
...
style := GetWindowLong({ нужный_TEdit}.H andle, GWL_STYLE);
SetWindowLong({ нужный_TEdit}.H andle, GWL_STYLE, style + ES_NUMBER);
...
end;
RSS лента комментариев этой записи