Опубликован: 16.11.2010 | Уровень: специалист | Доступ: платный
Лекция 9:

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

8.4. События и процедуры обработки событий

8.4.1. События

Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести значения в поля редактирования, нажать ВВОД и потом щелкнуть кнопку МОДЕЛИРОВАНИЕ. Щелчок на изображении командной кнопки - это пример того, что в Windows называется событием.

Событие - это то, что происходит во время работы приложения. В Delphi у каждого события есть имя, например, щелчок кнопкой мыши это событие OnClick, двойной щелчок - событие onDblClick.

В табл. 8.10 приведены некоторые события Windows.

Реакцией на событие должно быть какое-либо действие. Например, реакцией на событие OnClick, произошедшее на кнопке МОДЕЛИРОВАНИЕ,должен быть переход к запуску имитационной модели. В Delphi реакция на событие реализуется как процедура обработки события.Таким образом, задача программиста состоит в написании необходимых процедур обработки событий.

Поскольку в форму добавлены пятнадцать компонентов, то необходимо разработать для них процедуры обработки событий.

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

Таблица 8.10. Перечень некоторых событий Windows
Событие Содержание
OnClick Происходит при щелчке кнопкой мыши
OnDblClick Происходит при двойном щелчке кнопкой мыши
OnEnter Происходит перед тем, как элемент управления действительно получает фокус
OnError Происходит, когда элемент контроля обнаруживает ошибку и не может вернуть информацию об ошибке вызывающей программе
OnExit Происходит непосредственно перед тем, как элемент управления теряет фокус
OnKeyDown Происходит при нажатии на клавишу. События OnKeyDown и OnKeyPress - это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp )
OnKeyPress Происходит, когда пользователь нажимает клавишу, которая генерирует печатаемый символ. Может происходить также при нажатии клавиши печатаемого символа с <Ctrl>. He происходит при нажатии клавиш <Tab>, <Enter>, клавиш перемещения курсора
OnKeyUp Происходит при отпускании нажатой клавиши
OnMouseDown Происходит при нажатии кнопки мыши
OnMouseMove Происходит при перемещении мыши
OnMouseUp Происходит при отпускании кнопки мыши

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

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

Затем нужно выбрать вкладку Events (события) окна Object Inspector.В результате этих действий в окне Object Inspector появится вкладка со списком событий, которые способен воспринимать маркированный компонент, в данном случае - командная кнопка (рис. 8.13).

В левой колонке вкладки перечислены имена событий, на которые может реагировать маркированный объект. Если для события определена процедура обработки события, то в правой колонке, рядом с именем события выводится ее имя.

Чтобы создать процедуру обработки события, надо сделать двойной щелчок в поле имени процедуры обработки события. В результате открывается окно редактора кода (в Delphi кодом называется текст программы) с макетом процедуры обработки события (рис. 8.14).

Вкладка Events командной кнопки ВВОД (Button1)

Рис. 8.13. Вкладка Events командной кнопки ВВОД (Button1)
Окно редактора кода с макетом процедуры обработки события, происходящего на кнопке Button1 (ВВОД)

Рис. 8.14. Окно редактора кода с макетом процедуры обработки события, происходящего на кнопке Button1 (ВВОД)

Delphi автоматически присваивает процедуре обработки события имя. Имя процедуры обработки события состоит из двух частей. Первая часть идентифицирует форму, которой принадлежит объект, для которого создается процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем случае имя формы - Form1, Button1 - имя командной кнопки ВВОДимя события - Click.

В окне редактора кода (см. рис. 8.14) между begin и end можно печатать инструкции Object Pascal, реализующие процедуру обработки события. Введите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ProvVvod1;
  begin
    MOTip:=StrToFloat(Edit2.text);
    SOTip:=StrToFloat(Edit3.text);
    MatA:=StrToFloat(Edit4.text);
    SOtkA:=StrToFloat(Edit5.text);
  end;
  if (SOTip*5)>MOTip then begin
    MessageDlg('Стандартное отклонение SOTip'+#13
      +'должно быть более чем в 5 раз меньше'+#13
      +'математического ожидания MOTip',
      mtWarning,[mbOk],0);
    Edit3.SetFocus;
  end
  else if (SOtkA*)>MatA then begin
    MessageDlg('Стандартное отклонение SOtkA'+#13
      +'должно быть более чем в 5 раз меньше'+#13
      +'математического ожидания MatA',
      mtWarning,[mbOk],0);
    Edit5.SetFocus;
  end;
  ProvVvod2; Tabl1.SetFocus;
end;

В тексте процедуры выделено то, что сформировано Delphi. Остальное вводится разработчиком.

Обработка события при щелчке кнопки ВВОД происходит так. Вначале процедурой ProvVvod1 проверяется, все ли данные введены в поля редактирования. Если все данные введены, производится их перевод в вещественный тип.

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

Далее процедурой ProvVvod2 проверяется полнота ввода данных в первую таблицу StrinGrid. Создайте процедуры ProvVvod1, ProvVvod2 в разделе implementation программного модуля (.pas ).

procedure TForm1.ProvVvod1;
begin
  begin
    if (Edit1.text='') or (Edit2.text='')
    or (Edit3.text='') or (Edit4.text='')
    or (Edit5.text='') or (Edit6.text='')
    or (Edit7.text='') then
      MessageDlg('Необходимо задать все'+#13
        +'исходные данные'+#13
        + 'в полях редактирования',
        mtWarning,[mbOk],0);
  end;
  begin
    if Edit1.text='' then Edit1.SetFocus;
    if Edit2.text='' then Edit2.SetFocus;
    if Edit3.text='' then Edit3.SetFocus;
    if Edit4.text='' then Edit4.SetFocus;
    if Edit5.text='' then Edit5.SetFocus;
    if Edit6.text='' then Edit6.SetFocus;
    if Edit7.text='' then Edit7.SetFocus;
  end;
end;

procedure TForm1.ProvVvod2;
begin
  begin
    if (Tabl1.Cells[1,1]='') or (Tabl1.Cells[2,1]='') or (Tabl1.Cells[3,1]='')
    or (Tabl1.Cells[4,1]='') or (Tabl1.Cells[5,1]='') or (Tabl1.Cells[6,1]='')
    or (Tabl1.Cells[7,1]='') or (Tabl1.Cells[8,1]='') or (Tabl1.Cells[9,1]='')
    or (Tabl1.Cells[10,1]='')
    then
      MessageDlg('Необходимо задать все'+#13
        +'исходные данные в таблице',
        mtWarning,[mbOk],0);
  end;
  Tabl1.SetFocus;
end;

Объявите в интерфейсной части эти процедуры.

type TForm1 = class(TForm)
    Edit1: TEdit;
    …
    procedure ProvVvod1;
    procedure ProvVvod2;
  private

При нажатии кнопки СБРОС все поля редактирования и ячейки Tabl1 очищаются. Создайте обработчик этого события, программный код которого приведен ниже.

procedure TForm1.Button2Click(Sender: TObject);
var n1,n2:integer;
begin
  Edit1.text:='';
  Edit2.text:='';
  Edit3.text:='';
  Edit4.text:='';
  Edit5.text:='';
  Edit6.text:='';
  Edit7.text:='';
  for n1:=1 to 10 do
    Tabl1.Cells[n1,1]:='';
  for n2:=1 to 3 do
    for n1:=1 to 10 do
      Tabl2.Cells[n1,n2]:=''; Edit1.SetFocus;
end;

Нажатием кнопки МОДЕЛИРОВАНИЕ производится переход к процессу моделирования. Создайте обработчик этого события согласно следующему программному коду.

procedure TForm1.Button3Click(Sender: TObject); begin
VivProgr;
WinExec('d:\ModRTr\GPSSW.exe',SW_RESTORE);
Button6.SetFocus;
end;

При обработке этого события вначале выполняется процедура VivProgr, состоящая в свою очередь из четырех процедур VivProgr1, VivProgr2, VivProgr3 и VivProgr4. Они формирует следующие тестовые файлы с фрагментами программы GPSS:

  • Progr1.txt для ввода данных командой EQU и посредством функции SrVrA (процедура VivProgr1 );
  • Progr2.txt для ввода времени моделирования из поля редактирования Edit7 (процедура VivProgr2 );
  • Progr3.txt - для вывода результатов моделирования в текстовый файл DanTabl211.txt (процедура VivProgr3 );
  • Progr4.txt - для вывода результатов моделирования в текстовый файл DanTabl212.txt (процедура VivProgr4 );
  • Progr5.txt - для вывода результатов моделирования в текстовый файл DanTabl213.txt (процедура VivProgr5 );

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

procedure TForm1.VivProgr;
  begin
    VivProgr1;
    VivProgr2;
    VivProgr3;
    VivProgr4;
    VivProgr5;
  end;

procedure TForm1.VivProgr1;
var
  f:TextFile;
begin
  AssignFile(f,'d:\ModRTr\Progr1.txt');
  Rewrite(f);
  writeln(f,'IntTp EQU ',Edit1.text);
  writeln(f,'MOTip EQU ',Edit2.text);
  writeln(f,'SOTip EQU ',Edit3.text);
  writeln(f,'MatA EQU ',Edit4.text);
  writeln(f,'SOtkA EQU ',Edit5.text);
  writeln(f,'KolPun EQU ',Edit6.text);
  writeln(f,'VrMod EQU ',Edit7.text);
  writeln(f,'SrVrA FUNCTION P3,D',(Tabl1.ColCount-1));
  writeln(f,'1,',Tabl1.Cells[1,1],'/2,',Tabl1.Cells[2,1],'/3,',Tabl1.Cells[3,1],
    '/4,',Tabl1.Cells[4,1],'/5,',Tabl1.Cells[5,1],'/6,',Tabl1.Cells[6,1],
    '/7,',Tabl1.Cells[7,1],'/8,',Tabl1.Cells[8,1],'/9,',Tabl1.Cells[9,1],
    '/10,',Tabl1.Cells[10,1]);
  CloseFile(f);
end;

procedure TForm1.VivProgr2;
var
  f:TextFile;
begin
  AssignFile(f,'d:\ModRTr\Progr2.txt');
  Rewrite(f);
  writeln(f,'GENERATE ', StrToFloat(Edit7.text);
  CloseFile(f);
end;

procedure TForm1.VivProgr3;
var
  f:TextFile;
  n1:integer;
begin
  AssignFile(f,'d:\ModRTr\Progr3.txt');
  Rewrite(f);
  writeln(f,'OPEN ("DanTabl21.txt"),1,Kon1');
  for n1:=1 to StrToInt(Edit6.text) do
    writeln(f,'WRITE FR',n1,',,,OFF');
  writeln(f,'Kon1 CLOSE Err1,1');
  CloseFile(f);
end;

procedure TForm1.VivProgr4;
var
  f:TextFile;
  n1:integer;
begin
  AssignFile(f,'d:\ModRTr\Progr4.txt');
  Rewrite(f);
  writeln(f,'OPEN ("DanTabl22.txt"),1,Kon2');
  for n1:=1 to StrToInt(Edit6.text) do
    writeln(f,'WRITE FT',n1,',,,OFF');
  writeln(f,'Kon2 CLOSE Err1,1');
  CloseFile(f);
end;

procedure TForm1.VivProgr5;
var
  f:TextFile;
  n1:integer;
begin
  AssignFile(f,'d:\ModRTr\Progr5.txt');
  Rewrite(f);
  writeln(f,'OPEN ("DanTabl23.txt"),1,Kon3');
  for n1:=1 to StrToInt(Edit6.text) do
    writeln(f,'WRITE QM',n1,',,,OFF');
  writeln(f,'WRITE X$VrVig',',,,OFF')
  writeln(f,'Kon3 CLOSE Err1,1');
  CloseFile(f);
end;

Объявите в интерфейсной части программного модуля эти шесть процедур.

type TForm1 = class(TForm)
    Edit1: TEdit;
    …
    procedure VivProgr;
    procedure VivProgr1;
    procedure VivProgr2;
    procedure VivProgr3;
    procedure VivProgr4;
    procedure VivProgr5;
private

После выполнения процедуры VivProgr командой

WinExec('d:\ModRTr\GPSSW.exe',SW_RESTORE);

запускается GPSS.exe. И далее пользователем - приложение Модель разгрузки транспортов. Курсор устанавливается на кнопке ВЫВОД.

Для обработки события - щелчка кнопки ВЫВОД - используйте следующий программный код:

procedure TForm1.Button6Click(Sender: TObject);
  begin
    FormActivate2(Sender);
    VivRes1;
    VivRes2;
    VivRes3;
  end;

Обработка события начинается с выполнения процедуры FormActivate2(Sender). В результате этого вводятся заголовки в первую строку и в первый столбец второй таблицы. Затем последовательно выполняются процедуры VivRes1, VivRes2 и VivRes3, которые считывают результаты моделирования из файлов DanTabl211.txt, DanTabl212.txt и DanTabl213.txt соответственно и выводят их построчно во вторую таблицу.

Создайте обработчик события - щелчка кнопки ВЫВОД и в разделе implementation программного модуля ( .pas ) создайте процедуры FormActivate2(Sender) (см. п. 8.3.3), VivRes1, VivRes2 и VivRes3.

procedure TForm1.VivRes1;
var
  f:TextFile;
  n1:integer;
  a:real;
  begin
    AssignFile(f, 'd:\ModRTr\DanTabl21.txt');
    Reset(f);
    for n1:=1 to (Tabl2.ColCount-1) do begin
      read(f,a);
      a:=Trunc(a);
      a:=a/1000;
      Tabl2.Cells[n1,1]:=FloatToStr(a);
    end;
  end;

procedure TForm1.VivRes2;
var
  f:TextFile;
  n1:integer;
  a:real;
  begin
    AssignFile(f, 'd:\ModRTr\DanTabl22.txt');
    Reset(f);
    for n1:=1 to (Tabl2.ColCount-1) do begin
      read(f,a);
      a:=a*1000;
      a:=Trunc(a);
      a:=a/1000;
      Tabl2.Cells[n1,2]:=FloatToStr(a);
    end;
  end;

procedure TForm1.VivRes3;
var
  f:TextFile;
  n1:integer;
  a:real;
  begin
    AssignFile(f, 'd:\ModRTr\DanTabl23.txt');
    Reset(f);
    for n1:=1 to (Tabl2.ColCount-1) do
    begin
      read(f,a);
      Tabl2.Cells[n1,3]:=FloatToStr(a);
    end;
  end;

Объявите в интерфейсной части только что созданные четыре процедуры.

type TForm1 = class(TForm)
    Edit1: TEdit;
    …
    procedure FormActivate2(Sender: TObject);
    procedure VivRes1;
    procedure VivRes2;
    procedure VivRes3;
  private

Завершение работы с программой модели происходит при нажатии кнопки ВЫХОД ИЗ МОДЕЛИ. Результатом является закрытие формы приложения. Создайте обработчик этого события.

procedure TForm1.Button4Click(Sender: TObject);
  begin
    Form1.close;
  end;
Владислав Нагорный
Владислав Нагорный

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

Спасибо!

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

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

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

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

 

алексей оглы
алексей оглы
Россия
рафич Салахиев
рафич Салахиев
Россия