cPos=Edit1.SelStart;
for i=1 to Edit1->Text.Length do
if (Edit1.Text<'0' || Edit1.Text>'9') then
Edit1->Text=Edit1.Text.Delete(i,1);
Edit1.SelStart=cPos;
Форматный ввод в TEdit
Нужно чтобы вводились числа только до 30, а остальные игнорировались.
Заранее спасибо!
Нужно чтобы вводились числа только до 30, а остальные игнорировались.
Заранее спасибо![/quote]
советую сформулировать проблему понятнее, иначе тема так и будет без ответов.... или будет удалена...
Или обрабатывай TEdit событие OnChange
Или обрабатывай TEdit событие OnChange[/QUOTE]
В OnChange следует проверять число ("если больше 30, то message backspace"), т.к. это событие происходит после всего перед прорисовкой. А нажатие букв нужно ловить в OnPressKey или OnKeyDown.
В OnChange следует проверять число ("если больше 30, то message backspace")
[/QUOTE]
Необязательно. Что-нть типа:
Код:
повесить на OnChange - и все Ок.
P.S. писал на билдере и переводил - верно с точностью до алгоритма.
Код:
cPos=Edit1.SelStart;
for i=1 to Edit1->Text.Length do
if (Edit1.Text<'0' || Edit1.Text>'9') then
Edit1->Text=Edit1.Text.Delete(i,1);
Edit1.SelStart=cPos;
for i=1 to Edit1->Text.Length do
if (Edit1.Text<'0' || Edit1.Text>'9') then
Edit1->Text=Edit1.Text.Delete(i,1);
Edit1.SelStart=cPos;
повесить на OnChange - и все Ок.
P.S. писал на билдере и переводил - верно с точностью до алгоритма.[/quote]
Тогда уж надо if (Edit1.Text<'0' || Edit1.Text>'30') then...
И потом, подумай, что будет со всем этим, если юзерь кликнет по "нецифре"? Это-то тут не отслеживается...
Код:
//проверка нажатия цифр
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8]) then Key := #0;
end;
//проверка числа 0-30
procedure TForm1.Edit1Change(Sender: TObject);
var
Edit: TEdit;
I: Integer;
ss: Integer;
begin
Edit := TEdit(Sender);
ss := Edit.SelStart;
if not TryStrToInt(Edit.Hint, I) then Edit.Hint := '0';
if not TryStrToInt(Edit.Text, I) then I := 0;
if (I < 0) or (I > 30) then begin
Edit.Text := Edit.Hint;
Edit.SelStart := ss;
end else Edit.Hint := Edit.Text;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8]) then Key := #0;
end;
//проверка числа 0-30
procedure TForm1.Edit1Change(Sender: TObject);
var
Edit: TEdit;
I: Integer;
ss: Integer;
begin
Edit := TEdit(Sender);
ss := Edit.SelStart;
if not TryStrToInt(Edit.Hint, I) then Edit.Hint := '0';
if not TryStrToInt(Edit.Text, I) then I := 0;
if (I < 0) or (I > 30) then begin
Edit.Text := Edit.Hint;
Edit.SelStart := ss;
end else Edit.Hint := Edit.Text;
end;
Код:
procedure Form1.Edit1KeyPress(Sender: TObject; var Key: Char);
var AcceptKey: boolean;
CurrentText: string;
CurrentTextLength: Integer;
begin
if Key = #8 then Exit; // BackSpace
AcceptKey:=false;
CurrentText:=Edit1.Text;
CurrentTextLength:=Length(CurrentText);
if (Key in ['0'..'9']) and (CurrentTextLength < 2) then
begin
if (CurrentTextLength = 0) then
begin
if (Key <= '3') then AcceptKey:=true
end else if CurrentText[1] = '3' then
begin
if Key = '0' then AcceptKey:=true;
end else AcceptKey:=true;
end;
if not AcceptKey then Key:=#0;
end;
var AcceptKey: boolean;
CurrentText: string;
CurrentTextLength: Integer;
begin
if Key = #8 then Exit; // BackSpace
AcceptKey:=false;
CurrentText:=Edit1.Text;
CurrentTextLength:=Length(CurrentText);
if (Key in ['0'..'9']) and (CurrentTextLength < 2) then
begin
if (CurrentTextLength = 0) then
begin
if (Key <= '3') then AcceptKey:=true
end else if CurrentText[1] = '3' then
begin
if Key = '0' then AcceptKey:=true;
end else AcceptKey:=true;
end;
if not AcceptKey then Key:=#0;
end;
Сдается мне, что это неправильное сравнение. :)
Text - это один символ, а '30' - это уже строка.
Соответственно, в свойствах компонента, указать Min = 0, Max = 30 и Increment = 1. И ВСЁ :)
Естественно, данный способ будет реализовывать ввод только целых чисел.
А вот для дробных, придётся постараться. Вот только одно свойство OnChange тут не поможет - нужно перехватывать ещё "нажатие клавиши" OnKeyPress. Если вводимый символ оказвается недопустимым с точки зрения дробных чисел (нецифровой либо вторая запятая), то символ обнуляется.
А вот в OnChange будет производиться непосредственно проверка значения числа