Блокировка вставки нецифровых данных через буфер обмена
Code: |
uses Clipbrd;
function NewEditProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall; var s:string; i:integer; begin if (uMsg=WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then begin s := Clipboard.AsText; for i:=1 to Length(s) do if (not (s[i] in ['0'..'9'])) then begin uMsg:=0; break end end; result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam) end;
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER); SetWindowLong(Edit1.Handle,GWL_USERDATA,SetWindowLong(Edit1.Handle, GWL_WNDPROC, LPARAM(@NewEditProc))) end; |
Автор: Krid
Взято из https://forum.sources.ru
Следующий код создаёт TEdit который блокирует ввод любых нецифровых данных при вводе любым способом.
Code: |
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
{ Пример TEdit с выравниванием по центру © Song в модификации Vit} {©Drkb v.3(2007): www.drkb.ru}
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
{ Обявляем класс нашего едита как потомок от стандартного} type TMySuperEdit=class(TCustomEdit) public { Внутри класса переопредялем процедуру CreateParams, т.к. нужный нам стиль можно изменить только на создании или пересоздании окна } Procedure CreateParams(Var Params: TCreateParams); override; end;
var Form1: TForm1;
implementation
{$R *.dfm}
Procedure TMySuperEdit.CreateParams(Var Params: TCreateParams); Begin { Вызываем родительский обработчик, чтобы он сделал все процедуры по созданию объекта класса } inherited CreateParams(Params); { Изменяем стиль } With Params Do Style:=Style or ES_NUMBER; End;
procedure TForm1.FormCreate(Sender: TObject); begin { Создаём едит на основе нашего класса и кладём его на форму } With TMySuperEdit.Create(Self) Do Parent:=Self; end; End. |
Как сделать, чтобы TEdit воспринимал одни цифры и DecimalSeparator?
Автор: Full ( https://full.hotmail.ru/ )
Code: |
type TNumEdit = class(TEdit) procedure CreateParams(var Params: TCreateParams); override; procedure KeyPress(var Key: Char); override; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Standard', [TNumEdit]); end;
procedure TNumEdit.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style or ES_MULTILINE or ES_RIGHT; end;
procedure TNumEdit.KeyPress(var Key: Char); begin case key of '0'..'9': ; // цифры #8: ; // забой '.', ',': if Pos(DecimalSeparator, Text)=0 then Key:=DecimalSeparator else Key:=#0; // десятичный разделитель else key:=#0; end; // case end;
end. |
Посылаю Вам несколько расширенный вариант числовой маски компонента TЕdit c помощью OnKeyPress. В отличие от имеющегося в "Советах", приведенный код не "запирает" поле ввода при заполнении десятичной части, преобразует точку в запятую (для удобства пользователя), не позволяет поставить десятичную запятую перед числом и позволяет стирать знаки в поле ввода клавишей 'Back Space'. Код проверен в Delphi 5.
Code: |
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var //цифровая маска vrPos, vrLength, vrSelStart: byte; const I: byte = 1; //I+1 = количество знаков после запятой (в данном случае - 2 знака) begin
with Sender as TEdit do begin vrLength := Length(Text); //определяем длину текста vrPos := Pos(',', Text); //проверяем наличие запятой vrSelStart := SelStart; //определяем положение курсора end;
case Key of
'0'..'9': begin //проверяем положение курсора и количество знаков после запятой if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then Key := #0; //"погасить" клавишу end; ',', '.': begin //если запятая уже есть или запятую пытаются поставить перед //числом или никаких цифр в поле ввода еще нет if (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then Key := #0 //"погасить" клавишу else Key := #44; //всегда заменять точку на запятую end; #8: ; //позволить удаление знаков клавишей 'Back Space' else Key := #0; //"погасить" все остальные клавиши end; end; |
Все приведенные выше примеры грешат несколькими проблемами: одни из них не учитывают ВСЕ способы которыми может вводится информация в TEdit - одни не учитывают clipboard, другие ввод из кода программы, и наконец все они не учитывают, что число может иметь например такую запись "2E4" или даже "2E-4".
Попытка разрешить ситуацию привела к следующему простому коду:
Code: |
unit Unit1; {©Drkb v.3: www.drkb.ru, ®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.}
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; procedure Edit1Change(Sender: TObject); procedure FormCreate(Sender: TObject); private EditValue:string; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject); var selstart, sellength:integer; begin if Edit1.Text='' then begin Edit1.Text:='0'; Edit1.SelStart:=1; Edit1.SelLength:=0; Exit; end; try strtofloat(Edit1.Text); EditValue:=Edit1.Text; except selstart:=Edit1.SelStart; sellength:=Edit1.SelLength; Edit1.Text:=EditValue; Edit1.SelStart:=selstart; Edit1.SelLength:=sellength; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin EditValue:='0'; Edit1.Text:=EditValue; end;
end. |
В данном коде в TEdit не получится вставить не цифровые данные. Можно заменить строку
strtofloat(Edit1.Text);
на
strtoint(Edit1.Text);
для того чтобы ограничить возможность ввода только целыми числами.
Новые статьи
Ранние статьи
Случайные статьи
- Массив Edit-компонентов
- Элемент управления Edit, реагирующий на событие OnTimer
- Как сделать так, чтобы в компонент TEdit можно было вводить текст только на английской раскладке?
- Преобразовать первую букву каждого слова к верхнему регистру в TEdit
- Как заставить TEdit не пикать при нажатии недопустимых клавиш?
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!