#include #include //для функции PlaySound #include "Unit1.h" #include "Unit2.h" #include "winuser.h" #pragma package(smart_init) #pragma link "Word_2K_SRVR" #pragma resource "*.dfm" TPlanZadach *PlanZadach; extern double Temp[31];//массив переменных для хранения знечений меток времени extern int TimeIsUp[31];//массив показателей сработавшего счетчика- глобальный 1- отсчет окончен extern int T;//переменная для определения принадлежности метки времени строке void GetFormSetTimeUp();//прототип ф. управленияв формой ввода времени //!!! //ОСНОВНЫЕ ПОДГОТОВИТЕЛЬНЫЕ МЕРОПРИЯТИЯ //!!! __fastcall TPlanZadach::TPlanZadach(TComponent* Owner) : TForm(Owner) {//заполнение таблицы символами "по умолчанию" и сохр. инф. из файла "Service.rtf" for(int i=0;i<30;i++){Temp[i]=0;} for(int i=0;i<30;i++){TimeIsUp[i]=1;} StringGrid->Cells[0][0]="№";//Установка в ячейке 0:0 символа № StringGrid->Cells[1][0]="Наименование";//надпись колонки "Наименование" StringGrid->Cells[2][0]="Состояние";//надпись колонки "Состояние" StringGrid->Cells[3][0]="Метка времени";//надпись колонки "Метка времени" for(int i=1;i<31;i++)//цикл заполняет нумерацию строк {StringGrid->Cells[0][i]=IntToStr(i)+".";} //блок проверки существования файла "Service.rtf", создания в случае отсутствия и загрузки из него информации. if(!FileExists("Service.rtf"))//проверка существования файла в каталоге запуска исполняющего модуля {//файла не оказалось, создаем его заполняя значениями по умолчанию ShowMessage("Файл для хранения информации отсутствует, будет создан.");//заявление о намерениях :) for (int i=0;i<92;i++){Service->Lines->Append("");}//создаем 91 пустых строки for (int i=1;i<92;i=i+3){Service->Lines->Strings[i]=("Задача не определена.");}//каждая 3-я строка, начиная с первой заполняется "этим" текстом for (int i=2;i<92;i=i+3){Service->Lines->Strings[i]=("1");}//--"-- начиная с 2-й --"-- "Отсчет для задачи завершен." for (int i=3;i<92;i=i+3){Service->Lines->Strings[i]=("0");}//--"-- начиная с 3-й --"-- метка время Service->Lines->SaveToFile("Service.rtf");}//сохранение созданого файла в каталоге запуска исполняющего модуля {//файл существует... Service->Lines->LoadFromFile("Service.rtf");//загрузка информации из файла Service.rtf int StrokaVService=1;//инициализация переменной для определения номера строки в файле Service.rtf for(int Str=1;Str<31;Str++)//цикл заполнения ячеек таблицы и инициализации переменных Temp и TaimIsUp {for(int Col=1;Col<4;Col++)//цикл заполнения поочередно каждой ячейки в одной строке Str {switch (Col){ case 1:{StringGrid->Cells[Col][Str]=(Service->Lines->Strings[StrokaVService]); //первая ячейка строки Str break;} //просто заполняет значениями из Service.rtf case 2:{if (Service->Lines->Strings[StrokaVService+1]==1) //вторая ячейка строки Str {StringGrid->Cells[Col][Str]="Отсчет для задачи завершен:";TimeIsUp[Str]=1;} //заполнение и инициализация переменной TimeIsUp else {StringGrid->Cells[Col][Str]="Отсчет будет окончен:";TimeIsUp[Str]=0;} break;} case 3:{Temp[Str]=StrToFloat(Service->Lines->Strings[StrokaVService+2]);//третья ячейка строки Str StringGrid->Cells[Col][Str]=FormatDateTime("dd.mm.yy hh:mm:ss ",Temp[Str]);//заполнение и инициализация переменной Temp break;} default:{break;}}} StrokaVService=StrokaVService+3;}}//конец цикла заполнения ячеек таблицы MainPanel->Caption = FormatDateTime("Сегодня dddd, mmmm месяц, d число, yyyy год. Текущее время - hh:mm:ss", Now());//вывод показания текущего времени на главную панель Timer1->Enabled=true;}//предварительные действия закончены, запускается таймер "полсекунды" на исполнение. //!!! //ТАЙМЕР "ПОЛСЕКУНДЫ" ВЫПОЛНЕН, ПРОВЕРКА МЕТОК ВРЕМЕНИ НА ЗАВЕРШЕНИЕ ЗАДАЧИ ДЛЯ ВСЕХ СТРОК //!!! void __fastcall TPlanZadach::Timer1Timer(TObject *Sender) {for (int StrokaVTabl=1;StrokaVTabl<31;StrokaVTabl++)//FOR1 {//начало FOR1 StringGrid->Cells[3][StrokaVTabl]=FormatDateTime("dd.mm.yy hh:mm:ss ",Temp[StrokaVTabl]);//вывод значения метки времени в 3-й колонке строки MainPanel->Caption=FormatDateTime("Сегодня dddd, mmmm месяц, d число, yyyy год. Текущее время - hh:mm:ss", Now());//вывод показания текущего времени на главную панель if ((Temp[StrokaVTabl]-Now()<0/*время вышло*/)&&(TimeIsUp[StrokaVTabl]==0))//время вышло и отсчет разрешен //да... {Timer1->Enabled=false;//таймер "полсекунды" останавливаем. TimeIsUp[StrokaVTabl]=1;MainPanel->Caption = "Отсчет времени для задачи №"+IntToStr(StrokaVTabl)+" завершен!"; StringGrid->Cells[2][StrokaVTabl]="Отсчет для задачи завершен:"; PlaySound("c:\ding.wav",0,SND_ASYNC|SND_LOOP);//запускаем звуковое оповещение {//запуск функции мигания в таскбаре FLASHWINFO pf;//создаем информационную структуру для ф. мигания pf.cbSize=sizeof(FLASHWINFO); //pf.hwnd=hHandle; //так мигает только капшн, но не значек приложения в таскбаре pf.hwnd = Application->Handle;//так мигает только значек приложения в таскбаре, но не капшн pf.dwFlags=FLASHW_TIMER|FLASHW_TRAY; //FLASHW_ALL - обязано мигать и капшн и трей, мигает только капшн pf.uCount=100; //сколько раз мигаем pf.dwTimeout=250;//период продолжительности свечения, гашения FlashWindowEx(&pf);} if (MessageDlg("Отсчет времени для задачи №"+IntToStr(StrokaVTabl)+" завершен!",mtInformation,TMsgDlgButtons()<Handle;//так мигает только значек приложения в таскбаре, но не капшн pf.dwFlags=FLASHW_STOP;// FlashWindowEx(&pf);}}//остановка звука и процесса мигания значка в таскбаре else //время не вышло или отсчет не разрешен (TimeIsUp[StrokaVTabl]==1) {if (TimeIsUp[StrokaVTabl]==1) {StringGrid->Cells[2][StrokaVTabl]="Отсчет для задачи завершен:";} else {StringGrid->Cells[2][StrokaVTabl]="Отсчет будет окончен:";}} //Service->Lines->Strings[2]=IntToStr(TimeIsUp1);Service->Lines->SaveToFile("Service.rtf");//запись и сохранение в "Service" показателя окончания отсчета для задачи Timer1->Enabled=true;}} //опять запускаем таймер, конец FOR1 //!!! //ЩЕЛЧЕК ПРИ ВЫБОРЕ ЯЧЕЕК ДЛЯ ЗАДАНИЯ МЕТКИ ВРЕМЕНИ //!!! void __fastcall TPlanZadach::StringGridSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) {T=0; switch (ACol){ case 2: {ShowMessage("Это поле не редактируется.");CanSelect=false;break;}//если выбрана ячейка колонки 2 - вывод сообщения "Это поле не редактируется." case 3: {//если выбрана ячейка колонки 3 - задание метки времени окончания отсчета if (TimeIsUp[ARow]==0)//если отсчет уже идет, то {if (Application->MessageBox("В данный момент идет отсчет\nвремени для этого задания.\n\nХотите изменить время\nсрабатывания счетчика?", "Предупреждение!",MB_YESNO+MB_ICONEXCLAMATION+MB_DEFBUTTON1)==IDYES) {T=ARow;GetFormSetTimeUp();}//вызываем форму для задания времени срабатывания else{break;}}//иначе до свидания else{T=ARow;GetFormSetTimeUp();break;}} default:;}} //!!! //РЕАЛИЗАЦИЯ Ф. УПРАВЛЕНИЯ ФОРМОЙ ВВОДА ВРЕМЕНИ СРАБАТЫВАНИЯ СЧЕТЧИКА //!!! void GetFormSetTimeUp() {Application->CreateForm(__classid(TSetTimeUp1), &SetTimeUp1); SetTimeUp1->Visible=true;}//форма 2 становится видимой //!!! //СОХРАНЕНИЕ ИНФОРМАЦИИ В ФАЙЛЕ SERVICE ПРИ ЛЮБОМ ИЗМЕНЕНИИ В ТАБЛИЦЕ. //!!! void __fastcall TPlanZadach::StringGridSetEditText(TObject *Sender, int ACol, int ARow, const AnsiString Value) {int StrokaVService=1; for(int Str=1;Str<31;Str++) //заполнение файла информацией из таблицы {for(int Col=1;Col<4;Col++){ switch (Col){ case 1:{Service->Lines->Strings[StrokaVService]=(StringGrid->Cells[Col][Str]);break;} case 2:{if (TimeIsUp[Str]==1){Service->Lines->Strings[StrokaVService+1]="1";} else {Service->Lines->Strings[StrokaVService+1]="0";}break;} case 3:{Service->Lines->Strings[StrokaVService+2]=FloatToStr(Temp[Str]);break;} default:{break;}}} StrokaVService=StrokaVService+3;} //заполнение окончено Service->Lines->SaveToFile("Service.rtf");}