Опубликован: 16.11.2010 | Доступ: свободный | Студентов: 3503 / 1693 | Оценка: 4.43 / 4.14 | Длительность: 27:21:00
Лекция 9:

Разработка имитационных моделей в виде приложений с интерфейсом

8.4.3. Разработка процедур обработки событий для полей редактирования

В соответствии с видом формы имитационной модели сформулируем следующие требования к программе:

  • в поля исходных данных модели допускается вводить только положительные числа, а ввод других символов программа должна блокировать;
  • числа, вводимые в поля Edit3 и Edit5, не должны быть равны или больше чисел, вводимых в поля соответственно Edit2 и Edit4 (стандартное отклонение должно быть в пять раз и более меньше математического ожидания);
  • во время ввода данных модели при нажатии на клавишу Enter курсор автоматически должен перемещаться в поле ввода следующего числа. Если клавиша Enter нажата во время ввода в поле Edit7, программа должна перейти к вводу в первую таблицу;
  • при обнаружении ошибок при вводе в поля Edit3 или Edit5 курсор должен быть соответственно в одном из них;
  • если в какое - то поле не введена хотя бы одна цифра (поле пустое) и нажата клавиша Enter, то возникает ошибка, о чем выдается сообщение, и ввод нужно повторить.

Чтобы программа удовлетворяла вышеприведенным требованиям, надо для каждого поля редактирования написать процедуру обработки события OnKeyPress, которая в зависимости от того, какую клавишу нажал пользователь, будет выполнять нужное действие.

Заготовка процедуры OnKeyPress для Edit1, генерируемая Delphi, выглядит следующим образом:

Procedure Tform1.Edit1KeyPress(Sender:Tobject; var Key:Char);
  begin
  end;

Заголовок процедуры Edit1KeyPress показывает, что процедура в качестве параметра получает символьную переменную Key. Эта переменная содержит символ, соответствующий нажатой клавише. Следует обратить внимание на то, что параметр принимается по ссылке (перед именем переменной стоит слово var ), поэтому процедура может изменить значение переменной. Символ, соответствующий нажатой клавише, появляется в поле редактирования после выполнения процедуры обработки события OnKeyPress, поэтому процедура обработки может заменить введенный символ или присвоением переменной Key значения Chr(0) запретить его появление в поле редактирования.

Ниже приведен программный код процедуры обработки события OnKeyPress в поле редактирования.

рrocedure TForm1.Edit1KeyPress(Sender:Tobject; var Key:Char);
  begin
    case Key of
      '0'..'9',Chr(8):;
      '-':Key:=Chr(0);
      ',':if pos(',',Edit1.text)<> then Key:=Chr(0);
      Chr(13):Edit2.SetFocus
      '.': begin
          MessageDlg('Для отделения дробной части' +'числа'+#13
            +'от целой используйте запятую', mtInformation, [mbOk],0);
          Key:=Chr(0);
        end;
      else Key:=Chr(0);
    end;
  end;

Процедура TForm1.Edit1KeyPress проверяет, какая клавиша нажата при вводе исходных данных в поле редактирования Edit1. Если нажата клавиша BackSprace, то процедура завершает свою работу и символ появляется в поле редактирования или стирается последний введённый символ. Если нажата запятая, то процедура проверяет, есть ли уже запятая в поле редактирования. Если есть, то ввод второй запятой блокируется. Если нажата клавиша "-", то ввод её тоже блокируется. Если нажата клавиша Enter, то применением метода SetFocus к полю редактирования Edit2 курсор перемещается в это поле.

Процедуры обработки события OnKeyPress полей редактирования отличаются только способом обработки нажатия клавиши Enter (в поле Edit1 Edit2.SetFocus, в поле Edit2 Edit3.SetFocus и т.д., а в поле Edit7

then
  begin
    FormActivate1(Sender);
    Tabl1.SetFocus;
  end;

В остальном эти процедуры идентичны. Поэтому вместо написания процедур обработки события OnKeyPress для каждого поля редактирования можно написать одну общую процедуру, которая при нажатии Enter будет выбирать нужное действие в зависимости от того, в каком поле произошло событие. Получить информацию об источнике события можно проверкой значения параметра Sender.

Создайте в разделе implementation программный код процедур EditKeyPress и FormActivate1 (см. п. 8.3.3).

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
var
  nak:string[20];
  begin
  if Sender=Edit1 then
    nak:=Edit1.text
  else if Sender=Edit2 then
    nak:=Edit2.text
  else if Sender=Edit3 then
    nak:=Edit3.text
  else if Sender=Edit4 then
    nak:=Edit4.text
  else if Sender=Edit5 then
    nak:=Edit5.text
  else if Sender=Edit6 then
    nak:=Edit6.text
  else nak:=Edit7.text;
  case Key of
    '0'..'9',Chr(8):;
    '-':Key:=Chr(0);
    ',':if pos(',',nak) <>0 then Key:=Chr(0);
    Chr(13):if Sender=Edit1
        then Edit2.SetFocus
        else if Sender=Edit2
        then Edit3.SetFocus
        else if Sender=Edit3
        then Edit4.SetFocus
        else if Sender=Edit4
        then Edit5.SetFocus
        else if Sender=Edit5
        then Edit6.SetFocus
        else if Sender=Edit6
        then Edit7.SetFocus
        else if Sender=Edit7
        then
          begin
            FormActivate1(Sender);
            Tabl1.SetFocus;
          end;
    '.':begin
        MessageDlg('Для отделения дробной'
          +'части от целой'+#13
          +'используйте запятую',
          mtInformation,[mbOk],0);
        Key:=Chr(0);
      end;
    else Key:=Chr(0)
  end;
end;

Объявите в интерфейсной части:

type TForm1 = class(TForm)
  Edit1: TEdit;
  …
  procedure FormActivate1(Sender: TObject);
private

Теперь выделите компонент Edit2 и на вкладке Events раскройте список. Из списка для onKeyPress щелчком установите EditKeyPress. Проделайте тоже для компонентов Edit3 … Edit7.

8.4.4. Модификация программы имитационной модели

Интерфейс приложения разработан. Согласно интерфейсу внесем изменения в исходную GPSS-модель (см. п. 8.2.2). Заменим строки программы с командой EQU и строки

SrVrA	FUNCTION	P3,D10	; Среднее время выгрузки
1,26/2,20/3,30/4,25/5,15/6,18/7,28/8,32/9,23/10,30

командой

INCLUDE          "Progr1.txt"        ; Подключение файла

Модифицируем также сегмент задания времени моделирования.

;Сегмент задания времени моделирования
	INCLUDE		"Progr2.txt" ; Подключение файла
	TEST E		TG1,1,Met3 ; При TG1=1 - расчет результатов моделирования
;	TEST NE		N$VigTr,0,Met3
	SAVEVALUE	VrVig,((X$VrVigS/N$VigTr)/60) ; Среднее время выгрузки, час
	INCLUDE		"Progr3.txt" ; Подключение файла
	INCLUDE		"Progr4.txt" ; Подключение файла
	INCLUDE		"Progr5.txt" ; Подключение файла
Met3	TERMINATE     1

Разработка имитационной модели в виде приложения с интерфейсом завершена.

Отладьте приложение и перейдите к работе с ним.

8.5. Работа с приложением

Поместите в папку D:\ModRTr файл GPSS.exe и GPSS-модель ModRasgTr.gps. Нахождение файла Rasg_transporta.exe в этой же папке необязательно. Запустите Rasg_transporta.exe.

Нажмите кнопку ПРИМЕР. Автоматически будут введены данные, показанные на рис. 8.15.

Убедитесь, правильно ли выявляются ошибки, нахождение которых предусмотрено программным путем.

Проверьте, выполняется ли условие ввода характеристик нормального закона распределения случайных чисел. Измените в сторону увеличения любое из стандартных отклонений: введите в соответствующее поле редактирования, например, 4.2. Появится сообщение об ошибке (рис. 8.16): для отделения целой части от дробной нужно использовать запятую.

Нажмите OK. Повторите ввод числа с отделением его целой части от дробной части запятой в это же поле редактирования. Нажмите кнопку ВВОД. Появится предупреждение о другой ошибке (рис. 8.17). Нажмите OK и исправьте ошибку.

Форма приложения с данными примера

увеличить изображение
Рис. 8.15. Форма приложения с данными примера
Сообщение об ошибке при вводе числа

Рис. 8.16. Сообщение об ошибке при вводе числа
Сообщение об ошибке при вводе стандартного отклонения

Рис. 8.17. Сообщение об ошибке при вводе стандартного отклонения

Далее удалите, например, количество пунктов разгрузки из поля редактирования и щелкните ВВОД. Появится предупреждение о том, что необходимо задать все исходные данные в полях редактирования (рис. 8.18). Щелкните OK и исправьте ошибку.

Теперь удалите, например, среднее время разгрузки автомобиля второго типа из первой таблицы и щелкните ВВОД. Появится предупреждение о том, что необходимо задать все исходные данные в полях редактирования (рис. 8.19). Щелкните OK, исправьте ошибку и нажмите ВВОД.

Предупреждение о необходимости ввода всех данных в поля редактирования

Рис. 8.18. Предупреждение о необходимости ввода всех данных в поля редактирования
Предупреждение о необходимости ввода всех данных в первую таблицу

Рис. 8.19. Предупреждение о необходимости ввода всех данных в первую таблицу

Теперь ошибок ввода исходных данных нет. Щелкните кнопку МОДЕЛИРОВАНИЕ.

Выполните необходимые действия с GPSS-моделью. Закройте GPSS-exe и нажмите активную кнопку ВЫВОД. Во второй таблице появятся результаты моделирования (рис. 8.20):

  • среднее время разгрузки автомобилей различных типов;
  • коэффициенты использования пунктов разгрузки;
  • максимальные очереди на пункты разгрузки;
  • среднее время разгрузки одного транспорта.
Форма приложения с данными и результатами моделирования

увеличить изображение
Рис. 8.20. Форма приложения с данными и результатами моделирования

Вопросы для самоконтроля

  1. Какова цель предназначения текстовых объектов и потоков данных?
  2. Какой командой подключаются текстовые объекты к объе-ту GPSS World "Модель"? Формат этой команды.
  3. Назначение и формат блока OPEN.
  4. Назначение и формат блока CLOSE.
  5. Назначение и формат блока READ.
  6. Назначение и формат блока WRITE.
  7. Назовите режимы работы блока WRITE и дайте им характеристику.
  8. Назначение и формат блока SEEK.
  9. Назначение и формат блока SELECT.
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Петр Гончар-Зайкин
Петр Гончар-Зайкин
Россия
Елена Городниченко
Елена Городниченко
Украина, Киев