Написание программы визуального отображения состояния кабины лифта (стоит или движется), страница 2

//---------------------------------------------------------------------------

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);