Реализация периодического вывода баннер-сообщения на экран основной формы, страница 2

        void __fastcall Button3Click(TObject *Sender);

        void __fastcall SaveParam(); //Сохранение параметров в ini файл

        void __fastcall LoadParam();

        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

        void __fastcall ChangeTimerTimer(TObject *Sender); //Чтение параметров из ini файла

private:              // User declarations

public:                // User declarations

        __fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

Листинг файла Unit1.cpp дочерней программы:

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

//дочерний процесс - считываем сообщения из текстового файла

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

struct sMESS     //структура сообщения

{

   char str[256]; //текст сообщения

} ;

#define MESS_COUNT 4 //Количество сообщений

HANDLE hFileMap = NULL;     //дескрипторы

HANDLE hFileMapMassiv = NULL;

sMESS MASS[MESS_COUNT]; //Массив из 4-х строк AnsiString

sMESS* pMessToContr;   //Сообщение (массив) для главной программы

HANDLE hMutex = NULL;

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

        LoadParam(); //считываем тексты из файла при старте программы

}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

      Close(); 

}

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

  int len =  sizeof(MASS);

  // Открываем регион памяти для очереди сообщений основной программе

  hFileMapMassiv = OpenFileMapping(FILE_MAP_ALL_ACCESS,

                                             false,

                                             "MASS");

  if(!hFileMapMassiv)

  {

         ShowMessage("Не могу открыть отображение для очереди сообщений");

         return;

  }

  // Отображаем в адресное пространство процесса (с явным преобразованием типа)

   pMessToContr = (sMESS*)MapViewOfFile(hFileMapMassiv,FILE_MAP_ALL_ACCESS,

                                0,0,len);

  if(pMessToContr == NULL)

  {

         ShowMessage("Не могу отобразить а адресное пространство процесса");

         CloseHandle(hFileMapMassiv);

         return;

  }

}

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

   hMutex=OpenMutex(MUTEX_ALL_ACCESS, true, "MyMutex");  //открываем мьютекс

   if(WaitForSingleObject(hMutex, 500) == WAIT_OBJECT_0)

   {

    //по таймеру передача сообщений

    //Сообщаем о перемещении программе контроля

                if(hFileMapMassiv)

                {

                        strcpy(pMessToContr[0].str, Edit1->Text.c_str());

                        strcpy(pMessToContr[1].str, Edit2->Text.c_str());

                        strcpy(pMessToContr[2].str, Edit3->Text.c_str());

                        strcpy(pMessToContr[3].str, Edit4->Text.c_str());

                }

          ReleaseMutex(hMutex);

    }

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

    //загружаем тексты из файла

    LoadParam();

}

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

void __fastcall TForm1::Button3Click(TObject *Sender)

{

     //меняем тексты в файле не те что в Edit

     SaveParam();

}

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

void __fastcall TForm1::SaveParam()  //Функция сохранения параметров в ini файл

{

  AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл

  TIniFile *mfile = new TIniFile(ini_name);

                                        //записываем тексты сообщений

   mfile->WriteString("Message1","TEXT", Edit1->Text);

   mfile->WriteString("Message2","TEXT", Edit2->Text);

   mfile->WriteString("Message3","TEXT", Edit3->Text);

   mfile->WriteString("Message4","TEXT", Edit4->Text);

    delete mfile;

}

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

void __fastcall TForm1::LoadParam()  //Функция загрузки параметров из ini файла

{

  AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл

  TIniFile *mfile = new TIniFile(ini_name);

  Edit1->Text = mfile->ReadString("Message1","TEXT", "Привет!");

  Edit2->Text = mfile->ReadString("Message2","TEXT", "Hello!");

  Edit3->Text = mfile->ReadString("Message3","TEXT", "Guten Tag!");

  Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровенки будете!");

  delete mfile;

}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

      if(hFileMapMassiv)  CloseHandle(hFileMapMassiv);   //удаляем область отображаемой памяти

      if(pMessToContr)    UnmapViewOfFile(pMessToContr);  

}

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

void __fastcall TForm1::ChangeTimerTimer(TObject *Sender)

{

    //меняем тексты сообщений местами

    AnsiString ini_name = ChangeFileExt(Application->ExeName, ".ini"); //Открываем ini-файл

  TIniFile *mfile = new TIniFile(ini_name);

    int a = random(4); //генерируем случайное число

    switch(a)

    {

        case 0:

        {

                Edit1->Text = mfile->ReadString("Message4","TEXT", "Привет!");

                Edit2->Text = mfile->ReadString("Message3","TEXT", "Hello!");

                Edit3->Text = mfile->ReadString("Message2","TEXT", "Guten Tag!");

                Edit4->Text = mfile->ReadString("Message1","TEXT", "Здоровеньки будете!");

        } break;

        case 1:

        {

                Edit1->Text = mfile->ReadString("Message2","TEXT", "Привет!");

                Edit2->Text = mfile->ReadString("Message1","TEXT", "Hello!");

                Edit3->Text = mfile->ReadString("Message3","TEXT", "Guten Tag!");

                Edit4->Text = mfile->ReadString("Message4","TEXT", "Здоровеньки будете!");

        } break;

        case 2:

        {

                Edit1->Text = mfile->ReadString("Message2","TEXT", "Привет!");

                Edit2->Text = mfile->ReadString("Message1","TEXT", "Hello!");

                Edit3->Text = mfile->ReadString("Message4","TEXT", "Guten Tag!");

                Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровеньки будете!");

        } break;

        case 3:

        {

                Edit1->Text = mfile->ReadString("Message1","TEXT", "Привет!");

                Edit2->Text = mfile->ReadString("Message4","TEXT", "Hello!");

                Edit3->Text = mfile->ReadString("Message2","TEXT", "Guten Tag!");

                Edit4->Text = mfile->ReadString("Message3","TEXT", "Здоровеньки будете!");

        } break;

    };

     delete mfile;  //закрываем ini файл

}

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

Список литературы:

1.  Программирование в C++ Builder. А.Я. Архангельский, Бином, Москва, 2003.- 1151 с.

2.  Конспект лекций по курсу Операционные системы лектор Родников В.В. 2010г.