Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

ошибок пользователя!

Значит после ввода цифр, знак (-) тоже должен быть запрещен. Кроме того,

необходимо разрешить ввод знака числа только один раз, причем вначале чис-

ла! Для этого введем логическую переменную, назовем ее sign. Первоначаль-

но ее значение будет равно false. Как только пользователь нажал на хотя бы один допустимый символ, включая знак числа, переменной sign присваиваем значение true.

Обработчик для LabeledEdit1 переписываем в следующем виде, заод-

но разрешим пользователю заканчивать ввод нажатием клавиши Enter:

procedure TForm1.LabeledEdit1KeyPress(Sender: TObject;

var Key: char);

begin

if Key = #13 then

begin

sign:= false;

n:= StrToInt(LabeledEdit1.Text);

LabeledEdit2.Text:= IntToStr(n);

end;

{разрешаем только цифры, знак минус и кл. BackSpace } if not (Key in ['0' .. '9', '-' , #8]) then

begin Key:= #0; exit;

end;

if (Key = '-') and (sign) then Key:= #0;

sign:= true;

536

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

end;

Оператор

if (Key = '-') and (sign)

then Key:= #0;

не позволит пользователю ввести знак числа после значащих цифр и, кроме то-

го, дважды ввести знак (-).

Теперь, кажется все. Но нет, еще не все! Представьте ситуацию – пользо-

ватель хотел ввести отрицательное число, но забыл ввести знак минус, а цифры уже ввел. Попробуйте ввести несколько цифр, затем вернуть курсор на начало строки и попытайтесь ввести (-). У вас не получится! Даже если вы удалите введенные цифры клавишей Delete или BackSpace. Потому что sign имеет значение true. Ситуация не столь проста, как кажется. Чтобы ввести отрица-

тельное число нужно сначала нажать на кнопку "Ввод" или на клавишу Enter,

т.е. пользователь будет вынужден ввести число, которое не хотел вводить!

Придется контролировать положение курсора. У компонента есть свойство

SelStart, которое указывает на текущее положение курсора. Используя это свойство и функцию Pos, перепишем обработчик следующим образом:

procedure TForm1.LabeledEdit1KeyPress(Sender: TObject;

var Key: char);

begin

if Key = #13 then

begin

sign:= false;

n:= StrToInt(LabeledEdit1.Text);

LabeledEdit2.Text:= IntToStr(n);

exit;

537

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

end;

{разрешаем только цифры, знак минус и кл. BackSpace } if not (Key in ['0' .. '9', '-' , #8]) then

begin Key:= #0; exit;

end;

if (Key = '-') and (sign) then

begin

if (LabeledEdit1.SelStart <> 0) then

begin Key:= #0; exit;

end else

if (Pos('-', LabeledEdit1.Text) <> 0) then Key:= #0;

end;

sign:= true; end;

Обработчик работает следующим образом – если текущий символ знак (-)

и цифры введены, то проверяем позицию курсора. Если курсор установлен на начало и минуса нет, то разрешаем ввод знака.

Уф! Наконец-то должно все заработать как надо. Но есть нюанс!

Попробуйте ввести только один знак (-) и больше ничего. Опять получите

538

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

ошибку. Но это уже слишком, воскликнете вы! Кому придет в голову вводить один только минус. Ну, а вдруг, чисто случайно? И еще. А что если, пользова-

тель ничего не введя, опять же случайно, нажмет кнопку или Enter, т.е. будет введена пустая строка?

У вас не возникает ощущения, что мы пишем программу для американцев? (Как говорил М. Задорнов – "Ну, тупые…!).

Сделаем так, если длина строки равна единице и это знак (-), то запрещаем ввод.

procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then begin

sign:= false;

if Length(LabeledEdit1.Text) = 0 // если пустая строка then exit;

if (Length(LabeledEdit1.Text) = 1) and (LabeledEdit1.Text = '-')

then exit;

n:= StrToInt(LabeledEdit1.Text); LabeledEdit2.Text:= IntToStr(n); exit;

end;

{разрешаем только цифры, знак минус и кл. BackSpace } if not (Key in ['0' .. '9', '-' , #8]) then

begin Key:= #0;

539

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

exit;

end;

if (Key = '-') and (sign) then

begin

if (LabeledEdit1.SelStart <> 0) then

begin Key:= #0; exit;

end else

if (Pos('-', LabeledEdit1.Text) <> 0) then Key:= #0;

end;

sign:= true; end;

procedure TForm1.Button1Click(Sender: TObject); begin

LabeledEdit1.SetFocus; sign:= false;

if Length(LabeledEdit1.Text) = 0 // если пустая строка then exit;

if (Length(LabeledEdit1.Text) = 1)and (LabeledEdit1.Text = '-')

then exit else

n:= StrToInt(LabeledEdit1.Text);

540

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773