Книга: Программирование мобильных устройств на платформе .NET Compact Framework

Листинг 11.4. Использование модели состояний для обновления интерфейса и контроль запуска событий с целью более глубокого изучения процесса обработки событий и управления им

Листинг 11.4. Использование модели состояний для обновления интерфейса и контроль запуска событий с целью более глубокого изучения процесса обработки событий и управления им

//-------------------------------------------------------
//Поместить данную директиву #define в начале определения
//класса, если требуется регистрация событий
//#define EVENTINSTRUMENTATION
//-------------------------------------------------------
//-----------------------------------------------------------------------
//Флаг, указывающий обработчикам событий, должен ли из них осуществляться
//выход без выполнения каких-либо действий
//-----------------------------------------------------------------------
bool m_userInterfaceUpdateOccuring;
//Счетчики событий
private int m_radioButton1ChangeEventCount;
private int m_textBox1ChangeEventCount;
//-------------------------------------------------------------------------
//Код, который следует включать лишь в том случае, если приложение
//выполняется в режиме контроля запуска событий. Этот код характеризуется
//относительно высокими накладными расходами, и его следует компилировать и
//выполнять только тогда, когда выполняется диагностика.
//-------------------------------------------------------------------------
#if EVENTINSTRUMENTATION
private System.Collections.ArrayList m_instrumentedEventLog;
//------------------------------------------------------------------------
//Заносит записи о возникновении событий в массив, который мы
//можем просмотреть
//Примечание: Не делается никаких попыток ограничить размерность массива
// регистрационных записей, поэтому, чем дольше выполняется
// приложение, тем больше становится размер массива
//------------------------------------------------------------------------
private void instrumented_logEventOccurrence(string eventData) {
 //Создать журнал событий, если он еще не был создан
 if (m_instrumentedEventLog == null) {
  m_instrumentedEventLog = new System.Collections.ArrayList();
 }
 //Зарегистрировать событие
 m_instrumentedEventLog.Add(eventData);
}
//------------------------------------------------------------------------
//Отобразить список возникших событий
//Примечание: Этот вариант реализации довольно груб.
// Целесообразнее отображать список событий
// в отдельном диалоговом окне, которое специально выводится
// для этого на экран.
//------------------------------------------------------------------------
private void instrumentation_ShowEventLog() {
 System.Windows.Forms.ListBox.ObjectCollection listItems;
 listItems = listBoxEventLog.Items;
 //Очистить список элементов
 listItems.Clear();
 //При отсутствии событий - выход
 if (m_instrumentedEventLog == null) {
  listItems.Add("0 Events");
  return;
 }
 //Отобразить поверх списка общее количество
 //подсчитанных нами событий
 listItems.Add(m_instrumentedEventLog.Count.ToString() + " Events");
 //Перечислить элементы списка в обратном порядке, чтобы первыми
 //отображались самые последние из них
 string logItem;
 for(int listIdx = m_instrumentedEventLog.Count - 1; listIdx >= 0; listIdx--) {
  logItem=(string) m_instrumentedEventLog[listIdx];
  listItems.Add(logItem);
 }
}
#endif
//------------------------------------------------------
//Событие изменения состояния переключателя RadioButton1
//------------------------------------------------------
private void radioButton1_CheckedChanged(object sender, System.EventArgs e) {
 //Если обновление данных в пользовательском интерфейсе осуществляется
 //приложением, то мы не хотим обрабатывать его так же, как если бы
 //это событие было запущено пользователем. Если это именно так,
 //то выйти из функции без выполнения каких-либо действий.
 if (m_userInterfaceUpdateOccuring == true) {
  return;
 }
 //Подсчитать, сколько раз выполнена обработка данного события
 m_radioButtonlChangeEventCount++;
#if EVENTINSTRUMENTATION
 //Зарегистрировать наступление события
 instrumented_logEventOccurrence("radioButton1.Change:" + //Событие
  m_radioButton1ChangeEventCount.ToString() + ":" +       //Количество раз
  radioButton1.Checked.ToString());                       //Значение
#endif
//-------------------------------------------------------------
//Событие щелчка на кнопке Button1
//Имитирует обновление пользовательского интерфейса программным
//кодом, что может приводить к запуску обработчика события
//-------------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
 //Указать на то, что мы не хотим, чтобы обработчики сразу же
 //обрабатывали события, поскольку мы обновляем
 //пользовательский интерфейс.
 //m_userInterfaceUpdateOccuring = true;
 radioButton1.Checked = true;
 textBox1.Text = "Hello World";
 //Обновление пользовательского интерфейса завершено
 m_userInterfaceUpdateOccuring = false;
}
//------------------------------------------------------------------
//Обработчик события изменения состояния элемента управления TextBox
//------------------------------------------------------------------
private void textBox1_TextChanged(object sender, System.EventArgs e) {
 //Если обновление данных в пользовательском интерфейсе осуществляется
 //приложением, то мы не хотим обрабатывать его так же, как если бы
 //это событие было запущено пользователем. Если это именно так,
 //то выйти из функции без выполнения каких-либо действий.
 if (m_userInterfaceUpdateOccuring == true) {
  return;
 }
 //Подсчитать, сколько раз выполнена обработка данного события
 m_textBox1ChangeEventCount++;
#if EVENTINSTRUMENTATION
 //Занести событие в журнал
 instrumented_logEventOccurrence("textBox1.Change:" + //Событие
  m_textBox1ChangeEventCount.ToString() + ":" +       //Количество раз
  textBox1.Text.ToString());                          //Значение
#endif
}
private void buttonShowEventLog_Click(object sender, System.EventArgs e) {
#if EVENTINSTRUMENTATION
 instrumentation_ShowEventLog();
#endif
}

Оглавление книги


Генерация: 0.051. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз