procedure TForm1.Button1Click(Sender: TObject);
VAR Xmin, Xmax, h : REAL;
begin
TRY
Xmin:=StrToFLoat(LabeledEdit1.Text);
Xmax:=StrToFLoat(LabeledEdit2.Text);
h:=StrToFLoat(LabeledEdit3.Text)
EXCEPT
MessageDlg('Неверные данные', mtError, [mbOK],0);
Exit
END;
IF Xmax<=Xmin THEN
BEGIN
MessageDlg('Xmin>Xmax!', mtError, [mbOK],0);
Exit
END
end;
Здесь применен новый способ отображения сообщений об ошибках – функция MessageDlg. Она отображает на экране стандартное окно сообщения об ошибке, как показано на Рис. 4.
Рис. 4 – Результат работы функции MessageDlg.
Параметр mtError отвечает за картинку, отображаемую. в левом верхнем углу сообщения (в данном случае это белый крест в красном круге; возможны также варианты mtInformation, mtConfirmation, mtWarning). Параметр [mbOK] указывает, что на окне будет одна-единственная кнопка OK. Квадратные скобки указывают на то, что это массив. апример, можно отобразить кнопки ОК и Отмена при помощи параметра [mbOK, mbCancel]. Наконец, последний ноль представляет собой номер темы в файле помощи, если бы таковой у нашей программы имелся.
Оператор Exit завершает выполнение процедуры в случае ошибки в исходных данных.
Собственно расчет весьма прост:
Memo1.Lines.Clear;
WHILE Xmin<=Xmax DO
BEGIN
Memo1.Lines.Add('sin('+FloatToStrF(Xmin,ffFixed,10,4)+')='+
FloatToStrF(sin(Xmin),ffFixed,10,4));
Xmin:=Xmin+h
END
Здесь прежде всего очищается список текстовых строк в компоненте Memo, иначе при неоднократных расчетах он будет расти и расти. В качестве переменной, меняющейся от Xmin до Xmax с шагом h, используется сама переменная Xmin. Строка Memo1.Lines.Add добавляет рассчитанный результат в компонент Memo. Для "красивого" преобразования типа данных Real в текстовую строку применена новая функция FloatToStrF(число, режим, всего, после_запятой). Режим ffFixed означает, что в числе будет именно столько знаков после запятой, сколько указано. В нашем случае мы отводим под все число 10 позиций, из них 4 – под дробную часть.
Результат работы программы показан на Рис. 5.
Рис. 5 – Результат работы программы.
Все приказы отдавайте устно. Не оставляйте записей и
документов, которые могут обернуться против вас.
Из законов Мэрфи
Сохранение результатов работы программы в текстовый файл делается в Delphi гораздо проще, чем в обычном Pascal. Можно обойтись без использования процедур Assign, ReWrite, Writeln, Close, хотя они по-прежнему существуют. Чтобы наша программа выглядела прилично, надо применить стандартный диалог сохранения файла – такой же, как в самом Delphi, в Word'е и пр. На закладке Dialogs найдите компонент SaveDialog (
) и поместите в любое место его на форму. Этот компонент – невизуальный: при запуске программы на форме его не будет. Он появится только при явном вызове диалога сохранения файла из программы. Соответственно на форме должна появиться кнопка "Сохранить".Зададим свойства нашего диалога. Во-первых, в свойстве Title надо написать заголовок окна диалога, например, "Введите имя файла для сохранения результатов". Во-вторых, в свойство DefaultExt записывается расширение, автоматически присоединяемое к введенному пользователем имени файла. Очевидно, оно должно быть txt, ведь мы сохраняем текстовый файл. Свойство Filter позволяет выбирать отображаемые в диалоге файлы по маске. Например, можно задать маски "Текстовые файлы (*.txt)" и "Все файлы (*.*)". Для этого окно редактирования фильтра нужно заполнить так, как показано на Рис. 6. Текст в левой колонке – подсказка для пользователя, в правой – собственно маска файла.
Диалог имеет свойство Options, "раскрывающееся" в длинный список параметров. Из них нам нужны следующие (их надо установить в True):
foPathMustExist – введенный путь к файлу доложен существовать;
Рис. 6 – Окно редактирования фильтров файлового диалога.
foNoChangeDir – смена директории в файловом диалоге не будет приводить к смене текущей директории всей программы.
Остается написать очень простую процедуру сохранения результатов, вызывающуюся при щелчке по кнопке "Сохранить":
procedure TForm1.Button2Click(Sender: TObject);
begin
WITH SaveDialog1 DO
IF Execute THEN
Memo1.Lines.SaveToFile(filename)
end;
Оператор WITH "выносит за скобки" название компонента SaveDialog1, чтобы не писать одно и то же несколько раз. Без оператора WITH тот же фрагмент программы выглядел бы так:
begin
IF SaveDialog1.Execute THEN
Memo1.Lines.SaveToFile(SaveDialog1.filename)
end;
Здесь Execute – метод объекта SaveDialog, вызывающий отображение диалога на экране. Этот метод возвращает логическое значение в зависимости от того, ввел пользователь правильное имя файла или закрыл диалог, нажав Esc. Если имя было введено, то выполняется метод сохранения в файл SaveToFile, предусмотренный у свойства Lines компонента Memo. На вход метода подается имя файла, а оно хранится в свойстве FileName диалога SaveDialog.
9. Деактивация элементов интерфейса
То, что вы храните достаточно долго, можно выбросить.
Как только вы что-то выбросите, оно вам понадобится.
Из законов Мэрфи.
В нашей программе присутствует существенный промах. Пользователь может попытаться сохранить в файл результаты расчета до того, как этот расчет произведен. Ничего хорошего из этого не выйдет – будет создан файл нулевой длины. Было бы неплохо не давать возможности нажать на кнопку "Сохранить" до тех пор, пока расчет не выполнен. Такая возможность предусмотрена – любой элемент интерфейса можно временно сделать выключенным (он будет виден на форме, но не будет реагировать на действия пользователя). За включенность-выключенность отвечает свойство Disabled. В начальный момент расчет еще не выполнен, поэтому у кнопки "Сохранить" установите это свойство в True. А после выполнения расчета кнопку "Сохранить" надо оживить. Для этого в конец процедуры расчета надо добавить строку
Button2.Enabled:=True
Если вы одновременно нажали две клавиши пишущей машинки,
то отпечатается та, которую вы нажали нечаянно.
Из законов Мэрфи
.
Клавиша Tab в программах для Windows используется для переключения между элементами интерфейса, что позволяет вводить данные только с клавиатуры, не пользуясь мышью. Порядок "обхода" элементов интерфейса на форме важен: будет очень неудобно, если после ввода Xmin и нажатия Tab активным окажется не поле ввода Xmax, а, скажем, кнопка "Расчет".
Для задания порядка обхода нажмите правую кнопку мыши в любом месте над формой и выберите из контекстного меню пункт Tab Order. В появившемся окне (Рис. 7) перечислены все имеющиеся на форме визуальные компоненты в порядке их обхода. Две клавиши со стрелками позволяют перемещать компоненты внутри списка, добиваясь нужного порядка следования.
Рис. 7 – Окно задания порядка табуляции.
Для нашей формы порядок обхода таков: Xmin-Xmax-h-Расчет-Сохранить. Чтобы в компонент Memo вообще нельзя было зайти, установите его свойство TabStop в False.
Когда мы пытаемся вытащить что-нибудь одно,
оказывается, что оно связано со всем остальным.
Из законов Мэрфи.
Вам уже не раз встречались всплывающие подсказки (hints) – прямоугольнички с текстом, появляющиеся, если задержать курсор мыши над каким-либо элементом интерфейса в Delphi, Word и других программах. То же самое можно сделать и в нашей программе. Все визуальные компоненты имеют свойство Hint, в которое записывается текст сообщения. Для того, чтобы подсказка появлялась на экране, надо еще установить свойство ShowHint в True.
Самостоятельно сделайте всплывающие подсказки для всех элементов интерфейса нашей программы.