3.7 Оконный редактор

Оконный редактор предназначен для отображения и редактирования базы данных.

Оконный редактор является дочерним окном главного окна и выводится на его рабочую поверхность. Размер и местоположение оконного редактора устанавливаются с помощью функции SetWindowPos. Ширина окна определяется длиной строки базы данных, а высота – условием неперекрытия диалоговых окон (панели инструментов, панели состояния и, если активен режим ввода названий узлов, окна ввода названий узлов).

Создание оконного редактора.

Для создания окна оконного редактора вызывается функция CreateWch, которая определяется следующим образом:

hWch = CreateWch (hWnd, szClassName, UnschWProc, LengStr),

где: hWnd – дескриптор родительского окна (т.е. главного окна); szClassName – имя класса окна (оно же является и заголовком окна); UnschWProc – имя процедуры обработки сообщений оконного редактора; LengStr – длина строки базы данных.

В процессе выполнения этой функции вычисляется максимальная ширина окна в пикселях, регистрируется класс окна (причем устанавливается предопределенный в Windows стиль курсора «IDC_CROSS», т.е. «перекрестие»). Затем при помощи функции CreateWindowEx создается окно оконного редактора. Стиль окна – дочернее, видимое, имеет строку заголовка с кнопкой закрытия окна, вертикальную и горизонтальную полосы прокрутки.

Функция CreateWch возвращает дескриптор оконного редактора, который хранится в глобальной переменной hWch.

Оконная процедура оконного редактора определяется следующим образом:

integer function UnschWProc (hWch, mesg, wParam, lParam)

Ее параметры аналогичны параметрам оконной процедуры главного окна: hWch – дескриптор оконного редактора; mesg – переменная, идентифицирующая сообщение; параметры wParam и lParam содержат дополнительную информацию о сообщении.

Вид оконного редактора представлен на рис. 3.8 (см. на следующей странице).

Рис. 3.8. Вид оконного редактора

Входные параметры оконного редактора.

Входными параметрами для оконного редактора являются сообщения о нажатии кнопок мыши, перемещении мыши (сообщение WM_MOUSEMOVE), сообщения от полос прокруток (WM_VSCROLL и WM_HSCROLL). Как говорилось ранее, оконный редактор может получать сообщение WM_COMMAND от панели инструментов и строкового редактора, а также сообщение WM_LBUTTONDBLCLK.

Выходные параметры оконного редактора.

Выходными параметрами оконного редактора являются:

à отображение редактируемой базы данных и строкового редактора;

à реализация дополнительных функций, предоставляемых рассматриваемой программой.

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

Алгоритм работы оконного редактора.

1. Отображение редактируемой базы данных и строкового редактора.

2. Обработка сообщений мыши.

3. Обработка сообщений полос прокрутки.

4. Обработка сообщения WM_COMMAND.

5. Реализация дополнительных функций, предоставляемых программой.

Смысл некоторых переменных, использующихся при работе по приведенному алгоритму, поясняется на рис. 3.9.


Рис. 3.9

 

js, jsMax – номер текущей записи и максимальное число полей в записи базы данных соответственно;

jsLeft, jsRight – границы отображаемого текста базы данных (содержимого оконного редактора) по горизонтали (номера столбцов);

MaxRow, MaxCol – максимальное число символов, отображаемых в оконном редакторе, по вертикали и горизонтали соответственно;

in, iv – границы отображаемого текста базы данных (содержимого оконного редактора) по вертикали (номера записей);

Row – номер записи, на которой находится строковый редактор (принимает значения от 1 до MaxRow);

Kol – количество записей (строк) в базе данных.

Используются также следующие переменные и массивы:

Text – исходный массив (база данных);

Bufv – символьный массив, отображаемый на экране (содержимое оконного редактора);

Par – целочисленный массив, содержащий границы полей базы данных (табуляция);

Ndn, Nup – минимальный и максимальный номера строк массива Bufv, в пределах которых его необходимо заполнить новыми данными из Text;

BVpol, Bhpol – логические переменные, указывающие на наличие полос прокрутки.

Все упомянутые переменные, кроме BVpol и Bhpol – целочисленные. Назначение некоторых других переменных, используемых в программе, будет пояснено далее.

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

После создания оконного редактора, но перед его отображением, оконная процедура получает сообщение WM_CREATE. При его обработке путем вызова функции SetStatePnUpr на панели инструментов активизируются доступные оконному редактору функции. Затем вызывается функция WMCREATE:

Ret = WMCREATE (hWch, NumbRowTitr, Par),

где NumbRowTitr – число строк титров (в рассматриваемой программе равно 1).

В процессе выполнения этой функции задаются шрифт и цвет выводимого в окно текста, рассчитываются значения переменных js, jsMax, jsLeft, jsRight, MaxRow, MaxCol. После этого вызывается подпрограмма коррекции данных corUnsch с параметром hWch, в которой данные подготавливаются для вывода на экран (более подробно работа подпрограммы corUnsch будет рассмотрена далее). Затем путем вызова функции CreateEdit с параметром hWch создается строковый редактор.

При получении сообщения WM_PAINT оконная процедура вызывает функцию WMPAINT:

ret = WMPAINT (hWch, TitrUnsch, NumbRowTitr, Par, Bufv),

где TitrUnsch – символьный массив, содержащий титры.

В процессе выполнения этой функции производится вывод на экран строки (строк) титров и содержимого массива Bufv. Если имеются отмеченные строки или блоки текста, они выводятся инвертированными.

При получении сообщения WM_SIZE оконная процедура вызывает функцию WMSIZE:

ret = WMSIZE (hWch, Kol, NumbRowTitr, LengStr),

в которой, исходя из нового размера рабочей области оконного редактора, пересчитываются переменные MaxRow, MaxCol, и анализируется, нужно ли отображать полосы прокрутки. Далее в оконной процедуре рассчитывается новое значение переменной jsRight, а затем, в случае необходимости, корректируется положение окна строкового редактора (при уменьшении размеров рабочей области оконного редактора) или содержимое массива Bufv (при увеличении размеров рабочей области оконного редактора).

При получении сообщения WM_DESTROY обнуляется переменная hWch, уничтожается окно строкового редактора и закрывается окно оконного редактора.

Рассмотрим более подробно подпрограмму corUnsch.

В случае, если код возврата отличен от нуля, сначала в символьный массив Bufv, а затем и в Text, заносятся изменения, произведенные в строковом редакторе. Затем вызывается функция MoveEditWithMouse:

ret = MoveEditWithMouse (Par, Kol),

Если в результате щелчка левой кнопкой мыши или действия полос прокрутки окно строкового редактора необходимо переместить, функция возвращает положительное значение, в зависимости от которого вызывается функция Metka4 или Metka5, а затем Metka6. Если в результате действия полосы прокрутки требуется изменить содержимое оконного редактора, то пересчитываются границы отображаемого текста базы данных in, iv, в соответствии с ними заполняется массив Bufv, а затем вызываются функции Metka4, Metka5, Metka6. Если функция MoveEditWithMouse возвращает 0, т.е. перемещение окна не производилось ни мышью, ни полосами прокрутки, то вызывается подпрограмма управления окном contw, и в случае перемещения строкового редактора с помощью клавиатуры или всплывающего меню (влево / вправо, вверх / вниз, в начало / конец строки, в начало / конец базы данных, листание вверх / вниз) пересчитывается положение строкового и оконного редакторов. В том случае, если перемещение строкового редактора не производилось, проверяется, был ли запрос на поиск по шаблону.

Функция Metka4 выполняет пересчет переменных jsLeft, jsRight в зависимости от того, в каком столбце (js) находится строковый редактор. Пересчитывается также его горизонтальная координата XEdit.

Функция Metka5 выполняет пересчет вертикальной координаты строкового редактора YEdit, а в символьную строку Bufed помещается редактируемый текст.

В процессе выполнения функции Metka6 в соответствующие поля панели состояния выводится количество записей в базе данных и номер текущей записи.

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

Оконная процедура оконного редактора обрабатывает пять сообщений мыши: WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONDBLCLK и WM_LBUTTONUP.

При получении сообщения WM_LBUTTONDOWN вызывается функция WMLBUTTONDOWN:

ret = WMLBUTTONDOWN (hWch, mesg, lParam, corUnsch).

В процессе выполнении этой функции переменной cod присваивается значение переменной mesg, т.е. идентификатор сообщения WM_LBUTTONDOWN, а переменной sccod – значение переменной lParam, содержащей горизонтальную позицию курсора мыши в младшем слове и вертикальную позицию курсора мыши в старшем слове. Затем вызывается подпрограмма corUnsch, в которой рассчитываются новые координаты окна строкового редактора. Обновляется его содержимое, каретка устанавливается на первую позицию. Для перемещения окна строкового редактора вызывается функция SetWindowPos, после чего управление возвращается в оконную процедуру, где выполняются еще несколько операторов, связанных с реализацией дополнительных функций, и о которых более подробно будет рассказано при описании четвертого пункта алгоритма.

При получении оконной процедурой оконного редактора сообщения WM_RBUTTONDOWN на экран выводится всплывающее меню. Перед его созданием для каждого пункта меню задается идентификатор и отображаемый текст. Затем вызывается подпрограмма popupm с параметром hWch, в которой происходит создание и отображение меню. Вид всплывающего меню оконного редактора представлен на рис. 3.10.


Рис. 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.

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

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

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

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

Выход из окна протокола осуществляется автоматически, если удалены все сообщения об ошибках, или по нажатию кнопки «Выход из Протокола».

При изменении редактируемых данных вызов функции «Протокол» становится недоступен до тех пор, пока измененные данные не будут вновь оттранслированы.

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

Данная функция доступна только при редактировании параметров узлов и дает возможность пользователю редактировать названия узлов.

Ее вызов осуществляется щелчком левой кнопкой мыши на соответствующей радиокнопке панели инструментов. В нижней части экрана непосредственно над панелью состояния выводится немодальное окно диалога, вид которого представлен на рис. 3.13.

Рис. 3.13. Вид немодального диалога «Ввод названий узлов».

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

Оконная процедура диалога содержится в модуле NameUzlMod.

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

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

Все время, пока активен режим ввода названий узлов, соответствующая радиокнопка на панели инструментов остается отмеченной. При повторном ее нажатии осуществляется выход из этого режима: считывается и запоминается содержимое окна редактирования, окно немодального диалога уничтожается, корректируются размеры оконного редактора, а радиокнопка разотмечается.

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

Для удобства работы пользователя реализована возможность отметки строки (строк). Маркировать можно отдельную строку или несколько строк. В последнем случае при использовании «горячей клавиши» (ALT+L) или всплывающего меню оконного редактора отмечаются верхняя и нижняя строки в произвольной последовательности, допускается расширение отмеченного блока вверх и вниз.

Реализована возможность маркировки строки (строк) с помощью мыши путем ее перемещения с нажатой левой кнопкой. В момент отпускания кнопки операция выделения прекращается.

Отмеченная строка (строки) выводится на экран инвертированной.

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

Для удобства работы пользователя реализована возможность отметки блока с помощью клавиатуры (используется «горячая клавиша» ALT+B) и с помощью мыши (используется двойной щелчок левой кнопкой или всплывающее меню оконного редактора). Маркировать можно отдельное поле или группу (блок) полей; в последнем случае отмечается левый верхний и правый нижний угол в произвольной последовательности. Допускается расширение отмеченного блока вверх и влево, вниз и вправо.

При отметке начала блока (к.-л. поля) оно инвертируется, а на панель состояния выводится надпись «Отметьте конец блока». При отметке конца блока отмеченная группа полей выводится на экран инвертированной, а надпись в панели состояния стирается.

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

Снять маркировку уже отмеченного блока или строки (строк) можно с помощью клавиатуры («горячая клавиша» ALT+U) и с помощью мыши (используется щелчок левой кнопкой мыши над рабочей областью оконного редактора или всплывающее меню оконного редактора).

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

Данная функция облегчает и ускоряет поиск нужного параметра.

Шаблон поиска вводится в окно редактирования на панели инструментов (см. п. 3.4). Затем с помощью соответствующих органов панели инструментов («поиск по шаблону вниз», «поиск по шаблону вверх»), которые продублированы «горячими клавишами» (ALT+P и CTRL+P соответственно) и всплывающим меню оконного редактора, производится поиск.

Поиск ведется по столбцам, начиная с поля, на котором находится окно строкового редактора. «Листание» вверх / вниз производится автоматически, если это необходимо. Если поиск успешный, то окно строкового редактора устанавливается на поле, найденное первым; в противном случае пользователь информируется о том, что поиск неуспешен, а местоположение окна не изменяется.

Введенный последним шаблон сохраняется неизменным до тех пор, пока не будет введен новый.

 



Информация о работе «Расчет и анализ потерь активной мощности»
Раздел: Информатика, программирование
Количество знаков с пробелами: 139305
Количество таблиц: 0
Количество изображений: 14

Похожие работы

Скачать
179075
32
127

... (от передвижения источников загрязнения) 1180,48 Всего за год: 211845,25 10. Совершенствование системы электроснабжения подземных потребителей шахты Расчет схемы электроснабжения ЦПП до участка и выбор фазокомпенсирующих устройств Основными задачами эксплуатации современных систем электроснабжения горных предприятий являются правильное определение электриче­ ...

Скачать
118979
22
26

... luc – программа используется для разложения матрицы на треугольные сомножители; rluc – программа, которая отвечает за решение системы уравнений. 4. Разработка адаптивной системы управления режимами электропотребления 4.1 Функции автоматизированной системы Сбор, накопление и передача информации, характеризующей режим электропотребления комбината (информация о нагрузках). Сбор, накопление ...

Скачать
138956
15
3

... Еловка ТМН-2500/35 ±6×1,5% Ужурсовхоз ТМН-4000/35 ±6×1,5% 2. Характеристика задачи расчета, анализа и оптимизации режимов РЭС 110-35 кВ по напряжению, реактивной мощности и коэффициентам трансформации Питающие электрические сети напряжением 110 кВ, ...

Скачать
67860
2
2

... линиям относят линии, для которых верхняя граница интервала неопределенности потерь превышает установленную норму (например, 5%). 3. Программы расчета потерь электроэнергии в распределительных электрических сетях 3.1 Необходимость расчета технических потерь электроэнергии В настоящее время во многих энергосистемах России потери в сетях растут даже при уменьшении энергопотребления. При ...

0 комментариев


Наверх