![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, подскажите, пожалуйста, код для ограничения ввода (с клавиатуры) в Edit (пары UpDown + Edit) так, чтобы, если вводится значение больше Max, в Edit записывалось Max, если меньше Min то значение Min, и чтобы не вводились символы и знаки.
|
|
#2
|
||||
|
||||
|
Писал для себя, но думаю поможет и тебе...
Код:
//функция фильтрации ввода
function TProgramm.FilterImput (Edit : TEdit ; Key : Char) : Char ;
var
vr_Pos , vrPos, vrLength, vrSelStart: byte;
const
i: byte = 1;
begin
with Edit do begin
vrLength := Length(Text); //определяем длину текста
vrPos := Pos(',', Text); //проверяем наличие запятой
vr_Pos := Pos('.', Text); //проверяем наличие запятой
vrSelStart := SelStart; //определяем положение курсора
end;
Result := key;
Case Key of
'0'..'9': //если нажата цифра
begin
if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then
result := #0; //"погасить" клавишу
end;
',','.': //если нажата точка или запятая
begin
if (vr_Pos>0) or (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then
result := #0 //"погасить" клавишу
else
result := '.'; //всегда заменять точку на запятую
end;
#8: ; //позволить удаление знаков клавишей 'Back Space'
else
result {Key} := #0; //"погасить" все остальные клавиши
end;
end;Код:
procedure TForm_ustan_alarm.UpDown_hourClick(Sender: TObject;
Button: TUDBtnType);
begin
Label_hour.Caption := IntToStr(UpDown_hour.Position);
end;
procedure TForm_ustan_alarm.UpDown_minClick(Sender: TObject;
Button: TUDBtnType);
begin
if UpDown_min.Position < 10
then Label_min.Caption := '0' + IntToStr(UpDown_min.Position)
else Label_min.Caption := IntToStr(UpDown_min.Position);
end;
procedure TForm_ustan_alarm.UpDown_secClick(Sender: TObject;
Button: TUDBtnType);
begin
if UpDown_sec.Position < 10
then Label_sec.Caption := '0' + IntToStr(UpDown_sec.Position)
else Label_sec.Caption := IntToStr(UpDown_sec.Position);
end; |
|
#3
|
|||
|
|||
|
дело в том, что я обрабатываю событие KeyPress для Edit, т.к. пользователь вводит значение с клавиатуры (правильно ли я делаю Oo), а не событие нажатия кнопок UpDown.
|
|
#4
|
||||
|
||||
|
Ты хочешь например так...
Максимальное число 100, пользователь вводит 101, Edit пишет Max??? Обработай это после потери компонентом фокуса...т.е. как только курсор уйдет с поля ввода, цифры заменятся Max/Min... Или по событию KeyPress... Код:
if StrToInt(Edit.Text)> 100 then Edit.Text := 'Max'; |
|
#5
|
|||
|
|||
|
А числа можно вводить любые или только целые? Нельзя использовать SpinEdit?
|
|
#6
|
|||
|
|||
|
2 Nich:
хорошая идея про потерю фокуса, спасибо 2 Kapitoshka: да, числа только целые, SpinEdit нельзя, потому что потом мне нужно обрабатывать события нажатия кнопок вверх-вниз, у SpinEdit я таких не нашла. |
|
#7
|
|||
|
|||
|
Чтобы можно было нажимать только цифры:
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9', '-', #8]) then Key := #0; // '-' можно убрать, если не нужно end; Код:
procedure TForm1.Edit1Exit(Sender: TObject);
var
Value: Integer;
begin
TryStrToInt(Edit1.Text, Value);
if Value < UpDown1.Min then
Edit1.Text := IntToStr(UpDown1.Min)
else if Value > UpDown1.Max then
Edit1.Text := IntToStr(UpDown1.Max);
end; |
|
#8
|
|||
|
|||
|
в зависимости от числа в UpDown будет заполняться таблица, и, если число выбрано, а таблица не заполнена, то менять число нельзя.
и насчет контроля попадания в интервал: хотелось бы контролировать ввод в момент ввода, а не в момент Exit.. пожалуй я откажусь от этой пары, будем действовать по-другому. Спасибо. Последний раз редактировалось Bespontovyi pirogok, 26.11.2009 в 11:33. |