Нещо като Editbox, но да приема integer

7 отговора 349 прегледа
#1

Нещо като Editbox, но да приема integer

Имам нужда от компонент подобен на EditBox но да приема само числа.
Мерси предварително!!!!

Отговор
в отговор на pepi #2

Re: Нещо като Editbox, но да приема integer

Има доста библиотеки, които имат такива компоненти. Сещам се например за EhLib, RxLib, DCS... Сигурно има още доста. Има и отделни компоненети (ако не искаш да инсталираш целите библиотеки). Потърси по някой от сайтовете за Делфи (Torry например) или в Google.
Също така можеш и да използваш обикновения TEdit. Тази процедура може би ще ти свърши работа.

procedure SetNumEdit(ce: TWinControl);
var
A: Integer;
begin
A := GetWindowLong(ce.handle, gwl_Style);
A := A or ES_NUMBER;
SetWindowLong(ce.Handle, gwl_Style, A);
end;

Недостатък е, че може да се paste-не текст от клипборда. За да го избегнеш трябва да си поиграеш да прихванеш събитията и да следиш дали това, което се въвежда е валидно число. Малко е играчка, ама става.

Редактирано от andrew_nikoloff на

Отговор
в отговор на pepi #3

Re: Нещо като Editbox, но да приема integer

Когато е необходимо да се въвеждат само цели числа, аз ползвам събитието OnKeyPress на Edit контролата по следния начин:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9',#8]) then Key:=#0;
end;

Редактирано от TRN на

Отговор
в отговор на pepi #4

Re: Нещо като Editbox, но да приема integer

Има два варинта - да се ползва MaskEdit от страница Additional, или още по-мързеливо - SpinEdit от страница Samples.

чети и дишай по-леко
Отговор
в отговор на TRN #5

Само да отбележа...

... че това не решава проблема с paste-ването на "нечислов" текст. Освен това има един гаден страничен ефект - блокира клавишните комбинации за клипборда (ctrl+x/c/v). За да се избегне това трябва да разрешиш целия интервал #0..#31 освен цифрите.

Между другото, пепи, не е много ясно... За цели числа ли става въпрос или за дробни?

Отговор
в отговор на andrew_nikoloff #6

Re: Само да отбележа...

Става дума за цели числа.

Отговор
в отговор на pepi #7

Re: Само да отбележа...

Не почнаха ли вече ваканциите

Направи един

TMyEdit = class(TCustomEdit)
...........
protected
function IsValidChar(Key: Char): Boolean; virtual;
procedure KeyPress(var Key: Char); override; //идва от TWinControl
.................
implementation
...........
function TMyEdit.IsValidChar(Key: Char): Boolean;
begin
Result := Key in [#0..#31, '0'..'9'];
end;

procedure TMyEdit.KeyPress(var Key: Char);
begin
........
if not IsValidChar(Key) then
begin
Key := #0;
MessageBeep(MB_ICONEXCLAMATION)
end;
if Key <> #0 then inherited KeyPress(Key);
end;



Нататък, надявам се ти е ясно. Ако не е, попрочети пак за наследяване в ООП.

Успех

Отговор
в отговор на pepi #8

Re: Нещо като Editbox, но да приема integer

Дай e-mail за да ти пратя един компонент.

Отговор