Смекни!
smekni.com

Расчет и анализ потерь активной мощности (стр. 14 из 16)


Рис. 3.10. Вид всплывающего меню оконного редактора

При щелчке левой кнопкой мыши на к.-л. пункте всплывающего меню оконной процедуре оконного редактора посылается сообщение WM_COMMAND, содержащее в младшем слове параметра wParam идентификатор выбранного пункта меню.

Обработка оконной процедурой сообщений WM_MOUSEMOVE, WM_LBUTTONDBLCLK и WM_LBUTTONUP необходима для реализации дополнительных функций, предоставляемых программой, и подробнее будет рассмотрена при описании четвертого пункта алгоритма.

Третий пункт алгоритма реализуется следующим образом.

При обработке действий пользователя вертикальная и горизонтальная полосы прокрутки посылают родительскому окну (т.е. оконному редактору) сообщения WM_VSCROLL и WM_HSCROLL соответственно. При этом переменная wParam в младшем слове содержит одну из величин, идентифицирующих действие пользователя, и определенных в файле msfwinty.f90 (приведены только те, которые обрабатываются в рассматриваемой программе):

à SB_LINEDOWN – прокрутка на строку вниз;

à SB_LINEUP – прокрутка на строку вверх;

à SB_PAGEDOWN – прокрутка на страницу вниз;

à SB_PAGEUP – прокрутка на страницу вверх;

à SB_THUMBTRACK – перетаскивание бегунка. Номер текущей позиции бегунка содержится в старшем слове wParam.

При обработке сообщения WM_VSCROLL вызывается функция WMVSCROLL:

ret = WMVSCROLL (hWch, mesg, wParam, corUnsch).

При обработке сообщения WM_HSCROLL вызывается функция WMHSCROLL:

ret = WMHSCROLL (hWch, mesg, wParam, corUnsch).

Алгоритмы работы этих функций схожи. В случае, если младшее слово wParam содержит идентификатор SB_LINEDOWN, SB_LINEUP, SB_PAGEDOWN или SB_PAGEUP, переменная cod обнуляется, а переменной sccod присваивается значение идентификатора соответствующего пункта всплывающего меню. Если младшее слово wParam содержит идентификатор SB_THUMBTRACK, переменной cod присваивается значение переменной mesg, а переменной sccod – значение переменной wParam. (Во всех остальных случаях управление возвращается оконной процедуре.) Затем вызывается подпрограмма corUnsch, в которой рассчитываются новые координаты окна строкового редактора. Обновляется его содержимое, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos, после чего управление возвращается оконной процедуре.

Если указанное сообщение поступило от горизонтальной полосы прокрутки, то соответствующие операции осуществляются влево / вправо.

Четвертый пункт алгоритма.

При получении сообщения WM_COMMAND вспомогательной переменной ret присваивается значение младшего слова wParam. Дальнейшая работа программы организуется с помощью конструкции Select Case, тест-выражением для которой является переменная ret.

Если ret = -1, т.е. сообщение пришло от оконной процедуры строкового редактора, или ret является идентификатором пункта всплывающего меню оконного редактора (кроме последних пяти), вызывается функция MYCASE:

ret = MYCASE (hWch, ret, corUnsch).

При выполнении функции сначала анализируется значение переменной ret, и если ret является идентификатором пункта всплывающего меню, переменная cod обнуляется, а sccod присваивается значение ret. Затем вызывается подпрограмма corUnsch. Обновляется содержимое строкового редактора, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos и управление возвращается оконной процедуре.

Если ret является идентификатором радиокнопки или одного из органов управления панели инструментов, т.е. была вызвана одна из функций, доступных данному дочернему окну, выполняется соответствующая переменной ret Case‑секция.

Во всех остальных случаях (по оператору Case Default) управление передается функции DefWindowProc.

Пятый пункт алгоритма.

В рассматриваемой программе реализованы следующие дополнительные функции:

1. «Выбор титров».

2. «Вызов Протокола».

3. «Ввод названий узлов».

4. «Отметить строку (строки)».

5. «Отметить блок».

6. «Снять маркировку».

7. «Поиск по шаблону вниз / вверх».

Рассмотрим работу каждой из них подробнее.

1. «Выбор титров».

Назначение – предоставление пользователю возможности задавать порядок отображения параметров в любой комбинации и в любой последовательности.

При вызове этой функции на экран выводится окно модального диалога, в котором предлагается выбрать желаемый порядок следования полей записей базы данных. Вид модального диалога представлен на рис. 3.11 (см. на следующей странице).

Рис. 3.11. Вид модального диалога «Выбор титров»

Оконная процедура диалога и подпрограммы, необходимые для реализации данной функции, объединены в модуле Titr.

При инициализации диалога оконная процедура вызывает подпрограмму TitreInit, в которой инициализируются необходимые переменные и на экран выводится список титров, доступных для выбора.

В процессе работы с данным диалогом пользователь может выполнять следующие действия.

à Нажать кнопку переноса титра вправо. Оконная процедура диалога получает соответствующее сообщение, по которому вызывает подпрограмму Move, где выполняются операции переноса выделенного титра из одного окна списка в другой. Если ни один титр в левом окне списка не выбран или список пуст, кнопка недоступна.

à Нажать кнопку переноса титра влево. Вызывается подпрограмма Move, где выполняются операции переноса выделенного титра из одного окна списка в другой. Если ни один титр в правом окне списка не выбран или список пуст, кнопка недоступна.

à Нажать кнопку «Выбрать все». Все содержимое левого окна списка добавляется в правый, после чего левый список очищается. Если левый список пуст, кнопка недоступна.

à Нажать кнопку «Очистить все». Содержимое обоих окон списков уничтожается, а затем вызывается подпрограмма TitreInit. Данная кнопка недоступна, если левый список пуст.

à Нажать кнопку «Отмена». Восстанавливается прежний порядок следования титров, окно диалога завершает свою работу и управление передается оконной процедуре оконного редактора.

à Нажать кнопку «Ок». В переменную jsMax записывается количество выбранных титров. После этого последовательно вызываются подпрограмма Change_By_Places_Titr, в которой производится коррекция символьного массива TitrUnsch, содержащего титры, и подпрограмма Change_By_Places_Text, в которой производится коррекция символьного массива Bufv и целочисленного массива табуляции Par в соответствии с выбранным порядком отображения параметров. Окно модального диалога уничтожается и управление передается оконной процедуре оконного редактора. Данная кнопка недоступна, пока не будет выбран по крайней мере один титр.

Модуль Titr также содержит подпрограмму Vosvrat_Titr, в которой производится восстановление первоначального порядка следования титров, и подпрограмму Vosvrat_Text, в которой производится восстановление первоначального порядка следования элементов массивов Bufv и Par.

Глобальная логическая переменная TitrFlag по умолчанию устанавливается в FALSE и принимает значение TRUE только в том случае, если порядок отображения параметров был изменен. В процессе работы оконного редактора перед началом обмена данными между массивами Bufv и Text анализируется состояние переменной TitrFlag и, если она установлена в TRUE, вызывается подпрограмма Vosvrat_Text, а при завершении обмена вызывается подпрограмма Change_By_Places_Text.

2. «Вызов Протокола».

Эта функция становится доступной либо после трансляции любого файла основной базы данных, либо после компоновки расчетной схемы. При ее вызове пользователю предоставляется список обнаруженных при трансляции ошибок. Предусмотрена возможность автоматического поиска источника ошибки, принадлежащего к редактируемому типу исходных данных.

При вызове протокола на экран выводится модальное окно диалога. Вид модального диалога представлен на рис. 3.12.

Рис. 3.12. Вид модального диалога «Вызов Протокола»


Оконная процедура диалога и подпрограмма ProtocolInit, которая вызывается при инициализации диалога, объединены в модуле ProtMod.

Каждому сообщению об ошибке соответствует одна строка. Общее количество строк (сообщений) и номер текущей строки указываются в соответствующих полях («Всего записей» и «Запись №»).

Предусмотрены три группы сообщений: «!» – использование данных, как правило, при решении технологических задач приводит к их аварийному завершению; «?» – возможны ошибки при решении ряда технологических задач; «» – предупреждения, не обязательно связанные с ошибками.

Для удаления какого либо сообщения необходимо отметить его с помощью клавиатуры или щелчком левой кнопки мыши, а затем нажать кнопку «Удалить». Удаление является мнимым: все удаленные сообщения легко восстанавливаются – следует закрыть, а затем повторно вызвать протокол.

Автоматический поиск источника ошибки осуществляется следующим образом: сначала необходимо отметить нужное сообщение, а затем нажать кнопку «Перейти». Окно протокола закрывается, в оконный редактор выводится нужная страница данных, а окно строкового редактора устанавливается на записи, содержащей ошибку. Переход к месту ошибки возможен также по двойному щелчку левой кнопкой мыши на сообщении об ошибке.