Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все по ФБ (VS6).doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
210 Кб
Скачать
☆

Проверка правильности в страничках свойств.

Проверка правильности должна производится в функции Apply. Если обнаружена ошибка, то нужно вывести предупреждающее сообщение и вернуть E_FAIL.

Под страничками свойств располагаются кнопки «Применить» и «Отменить». «Применить» нажимается автоматически при попытке перейти на другую страничку свойств (если не включен режим «редактирования»). По кнопке «Применить» вызывается функция Apply. Если она возвращает ошибку, то переход на другую страничку свойств запрещается. По кнопке «Отменить» настраиваемый элемент дерева (или функциональный блок) автоматически восстанавливает свое состояние на момент до активизации странички свойств (все настройки при неудачных попытках Apply отменяются!).

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

В классе CFBImp (базовый класс для всех ФБ) определена переменная m_piTimeCounter, в которую при переходе в Run time записывается указатель на таймер. Поэтому в Runtime-режиме блок может использовать таймер.

Получение событий от таймера

В классе ФБ, использующем таймер для получения событий, производятся следующие изменения:

  1. В классе, в котором будет производиться обработке событий от таймера, необходимо реализовать интерфейс _IVavTimerEvents. Для этого:

  • К списку наследования добавляется: ,public _IVavTimerEvents.

  • Между BEGIN_COM_MAP и END_COM_MAP добавляется: COM_INTERFACE_ENTRY(_IVavTimerEvents).

  • В заголовке класса определяется функция: STDMETHOD(OnTimer)(DWORD dwCookie);

  • В cpp-файле класса она реализуется:

STDMETHODIMP CMyClass::OnTimer(DWORD dwCookie){

//код обработки события

return S_OK;

}

  1. В классе определите переменную DWORD dwKey;

  2. Определите функцию BOOL ToRuntime(). В ней для старта приема событий необходимо инициализировать таймер.

BOOL ToRuntime()

{

CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);

piTimer->Add (GetUnknown(), nHour, nMinutes, nSeconds, nMilliseconds, &dwKey);

return TRUE;

}

//nHour, nMinutes, nSeconds, nMilliseconds – интервал между событиями в часах, минутах, секундах и миллисекундах; dwKey – ключ. (Можно период целиком указывать в миллисекундах).

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

  1. Если необходимо получать сообщения в определенный момент времени ( будильник ), то вместо функции Add нужно использовать функцию SetAlarm ( с такими же параметрами). После этого в указанное время каждый день будет вызвана функция OnTimer. Функцию Remove необходимо вызвать для выключения будильника.

Определите функцию void ToDesign(). В ней для отключения таймера необходимо вызвать

void ToDesign()

{

CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);

piTimer‑>Remove(dwKey) //dwKey – ключ, который вернула функция Add или SetAlarm.

}

Получение текущего времени

Использовать таймер можно в Runtime-режиме и функциях ToRuntime и ToDesign.

  1. Для получения текущего абсолютного времени достаточно воспользоваться функцией

m_piTimeCounter->Now(&pFileTime);

,где pFileTime – переменная типа FILETIME

2. Разница в миллисекундах между двумя абсолютными временами (pFileTime-ами) вычисляется функцией

m_piTimeCounter->Difference (FILETIME *pfileTime1, FILETIME *pfileTime2, DWORD *pdwDiff);

3. Функция

m_piTimeCounter->Next (FILETIME* pFileTime , DWORD *pdwDiff);

выполняет сразу оба этих действия: вычисляет разницу между текущим временем и pFileTime (передается в pdwDiff), после чего устанавливает pFileTime в текущее время.

4. Функция таймера GetTime получается текущее время (часы, минуты, секунды, миллисекунды).

CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);

piTimer-> GetTime (short *pnHour, short *pnMinutes, short *pnSeconds, short *pnMilliseconds);