//---------------------------------------------------------------------------
void __fastcall TMainForm::MoveTimerTimer(TObject *Sender)
{
if(DoorTimer->Enabled == false) //Едем только если двери закрыты - соблюдаем технику безопасности
{
if(n == s)
{
MainForm->MoveTimer->Enabled = false;
//Приехали - отключаем таймер, обнуляем счётчик "пройденных" этажей
n = 0;
//Открываем двери
open_flag = true;
DoorTimer->Enabled = true;
//Меняем цвет нажатой кнопки и картинку этажа
ClearColor(CurrentStage, clCream);
AnsiString buf;
buf = ExtractFilePath(Application->ExeName) + "\stages\\stage";
buf += CurrentStage+1;
buf += ".jpg";
Image4->Picture->LoadFromFile(buf);
Up->Picture->LoadFromFile("pictures\\up.jpg");
Down->Picture->LoadFromFile("pictures\\down.jpg");
}
else
{
if(where)
{
CurrentStage++;
Up->Picture->LoadFromFile("pictures\\cup.jpg");
}
else
{
CurrentStage--;
Down->Picture->LoadFromFile("pictures\\cdown.jpg");
}
Label1->Caption = CurrentStage+1;
n++;
//Сообщаем о перемещении программе контроля
if(hFileMapMassiv)
pMessToContr[PROGNUM] = CurrentStage;
}
}
}
Рис.2. Главная форма программы контроля
Программа контроля отображает состояние лифтов опрашивая массив с номерами этажей по таймеру (время срабатывания таймера 100 мсек):
//---------------------------------------------------------------------------
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
//Читаем сообщения с лифтов
for(int i = 0; i != LIFT_COUNT; i++)
{
switch(i)
{
case 0: St1->Caption = pMessToContr[i]+1; break;
case 1: St2->Caption = pMessToContr[i]+1; break;
case 2: St3->Caption = pMessToContr[i]+1; break;
case 3: St4->Caption = pMessToContr[i]+1; break;
};
}
}
Листинги:
Листинг заголовочного файла программы контроля:
//---------------------------------------------------------------------------
#ifndef MainUnitH
#define MainUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TTimer *Timer1;
TPanel *Panel1;
TLabel *Label1;
TLabel *Label2;
TLabel *St1;
TLabel *St2;
TLabel *St3;
TLabel *St4;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
Листинг файла MainUnit.cpp программы контроля:
//---------------------------------------------------------------------------
#include <vcl.h>
#include "AboutUnit.h"
#pragma hdrstop
#define LIFT_COUNT 4 //Количество лифтов
HANDLE hFileMap = NULL;
HANDLE hFileMapMassiv = NULL;
int HOUSE[LIFT_COUNT]; //Массив "дом" - 4 целых числа - номера этажей где находится лифт
int* pMessToContr;
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
int len = sizeof(HOUSE);
// Выделяем регион памяти для сообщений от лифтов
hFileMapMassiv = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE,
0,
len,
"HOUSE");
if(!hFileMapMassiv)
{
ShowMessage("Не могу создать отображение для очереди сообщений");
}
else
{
//Запускаем лифты (4 штуки)
for(int i = 0; i != LIFT_COUNT; i++ )
{
ShellExecute(MainForm->Handle, "open", "Lift.exe", IntToStr(i).c_str(), NULL, SW_RESTORE);
}
}
// Отображаем в адресное пространство процесса (с явным преобразованием типа)
pMessToContr = (int*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,
0,0,len);
if(pMessToContr == NULL)
{
ShowMessage("Не могу отобразить а адресное пространство процесса");
CloseHandle(hFileMapMassiv);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
if(hFileMapMassiv) CloseHandle(hFileMapMassiv);
if(pMessToContr) UnmapViewOfFile(pMessToContr);
if(hFileMap) CloseHandle(hFileMap);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.