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

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

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

____________________________________________________________________

LabeledEdit2.Text:= IntToStr(n);

end;

Между прочим, компонент TMaskEdit при установленной маске на ввод только чисел тоже не "ловит" одиночный минус и "молча, проглатывает" пус-

тую строку!

Почему такие ситуации надо контролировать? Представьте себе, что поль-

зователь должен вводить большое количество числовых данных. Спустя неко-

торое время после начала ввода пользователь начинает уставать и, чисто маши-

нально, вводит пустую строку или одиночный минус. Ваша программа аварий-

но завершается из-за ошибки преобразования (EConvertError)! Вся проде-

ланная пользователем работа пошла "коту под хвост". Как же он будет вас про-

клинать! Именно вас – разработчика программы!

Этот пример еще раз демонстрирует, как надо последовательно улучшать и

"доводить" алгоритм и программу до достижения требуемой функционально-

сти. Пусть сам алгоритм, быть может, не является оптимальным. Не в этом суть! Это конкретный (хотя и простой) пример того, как надо разрабатывать ре-

альные программы. Уже неоднократно отмечал, что с первого раза невозможно написать полностью правильно работающую программу. Если можно так выра-

зиться, этот пример показывает метод "последовательных приближений" разра-

ботки программ.

А теперь попробуем реализовать контроль ввода вещественных чисел. Яс-

но, что надо добавить проверку на символы точки (.) и запятой (,). Использова-

ние точки или запятой для отделения целой части числа от дробной зависит от настроек операционной системы Windows. Хотя Lazarus спокойно преобра-

зует строку в число и с точкой, и с запятой. А вот Delphi "ругается", если раз-

делитель не совпадает с настройками Windows. Так что будем учитывать оба разделителя. Для определения какой разделитель используется системой, слу-

жит глобальная переменная DecimalSeparator, значением которой и явля-

541

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

____________________________________________________________________

ется символ разделителя. При этом поступим следующим образом, если поль-

зователь ввел "не тот" разделитель, то просто заменим его на нужный. Так что,

наша программа будет "обладать" уже кое-каким интеллектом! При реализации применим, для разнообразия, несколько другой способ, нежели в предыдущей программе. Будем использовать оператор выбора сase .. of. Основываясь на опыте разработки предыдущей программы, будем учитывать не только оди-

ночный минус, но и одиночный разделитель, и комбинацию "-" и разделитель.

Опять же для разнообразия используем компонент TEdit. Код программы:

unit Unit1;

{$mode objfpc}{$H+}

interface uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: char);

private

{ private declarations }

542

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

____________________________________________________________________

public

{ public declarations } end;

var

Form1: TForm1;

implementation { TForm1 }

procedure TForm1.Button1Click(Sender: TObject); begin

Edit1.SetFocus;

if (Edit1.Text

<> '') and // если пустая строка

(Edit1.Text

<> '-') and // если одиночный минус

(Edit1.Text

<> DecimalSeparator) and {если одиночный

разделитель}

(Edit1.Text <> '-' + DecimalSeparator) {если "-" и разде-

литель}

then Edit2.Text:= FloatToStr(StrToFloat(Edit1.Text)); Edit1.Clear;

end;

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

begin

case Key of

'0'..'9', #8:; // если цифры и кл. BackSpace, ввод разрешен

#13: // если нажата клавиша <Enter> begin

if (Edit1.Text <> '') and

543

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

____________________________________________________________________

(Edit1.Text <> '-') and

(Edit1.Text <> DecimalSeparator) and (Edit1.Text <> '-' + DecimalSeparator)

then Edit2.Text:=FloatToStr(StrToFloat(Edit1.Text));

Edit1.SetFocus;

Edit1.Clear;

end;

'.',',': // если разделители begin

if Key <> DecimalSeparator then

Key := DecimalSeparator; // замена разделителя if Pos(DecimalSeparator, Edit1.Text) <> 0 then Key:= #0;

end;

'-' : // если знак минус begin

if (Edit1.SelStart <> 0) // если одиночный минус then

begin Key:= #0; exit;

end else

if (Pos('-', Edit1.Text) <> 0) // два минуса then Key:= #0;

end;

544

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

____________________________________________________________________

else

Key := #0;

end;

end;

initialization

{$I unit1.lrs}

end.

И, наконец, самый простой способ контроля ввода числовых данных это

использование функции val(). Функция была рассмотрена нами в 3.3.1.4.

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: char);

private

545

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

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