Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Интерфейс представлений. Часть четвёртая. Панель действий

Николай Норкин, CLP R5
Вятские Информационные Технологии

Интерфейс представлений
Часть первая >>> Часть вторая >>> Часть третья >>> Часть четвёртая Часть пятая >>> Часть шестая >>>

Плавно перейдя от размещения областей интерфейса приложения к описанию одного из его элементов - панели действий (action bar) в предыдущих частях изложения материала, автор оставляет за собой возможность вернуться к проблеме, рассмотренной ранее. Между тем поступательное изложение материала диктует необходимость уделить подробное внимание панели действий, вернее, размещению на ней элементов действий
Дизайн приложений позволяет сгруппировать действия с разделением размещения в левом углу и правом углу представления
Автору представляется более удобным собрать в правом углу набор стандартных действий, свойственных большинству элементов дизайна (представлений, форм) приложения, но выполняющих определённые сервисные функции
В последней версии дизайна, использованного автором, действия в левой части панели действий собраны в выпадающем меню (action with subactions) под кнопкой с названием представления или документа. Выглядит такое размещение достаточно симпатично, хотя требует дополнительного щелчка для доступа к действию

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

Закрытие окна. Автор в течение десятилетия пользовался приложениями, где красный крест закрытия окна размещался слева. Понимая, что на это были определённые, в том числе, и исторические причины, всё же чувство постоянного дискомфорта от подобного "нестандартного" расположения кнопки закрытия велико (возможно, опять же - субъективно). Но действие, закрывающее окно, решено разместить там, где и положено - в самом правом углу
Поскольку элемент присутствует во всех элементах дизайна, оформляется он в виде Общего действия (в разделе дизайна Shared Code - Actions) с формулой закрытия окна:
@Command([FileCloseWindow])
При использовании действий в документах (опять же, с целью борьбы за место) стоит скрывать все действия (собственно - панель действий) в режиме Preview, выставляя для каждого действия параметры скрытия


Справка. В этом выпадающем меню дублируется вызов двух документов дизайна базы данных - О базе данных и Как работать с базой данных. Наличие этого элемента меню кроме помощи пользователю ставит своей целью также требование к завершённости дизайна приложения - не секрет, что техническое описание и помощь пользователю оформляются в последний момент или вовсе не оформляются даже в "коробочных решениях"
Код этих действий также выносится в Общие действия
О базе данных - @Command([HelpAboutDatabase])
Как работать с базой - @Command([HelpUsingDatabase])
Если же у Вас дошли руки, чтобы создать ресурс документации или помощи пользователю - не поленитесь вставить в меню Справка подменю со ссылкой на эту базу

Печать. С одной стороны, функционал этого действия может просто продублировать стандартные возможности печати документов. С другой стороны, Вы всегда можете перекрыть стандартный функционал печати представления и документов
Для примера, общее действие может иметь следующий код:
@If(@IsUnavailable($refOptions); @Command([FilePrint]); REM {Поскольку cfd-поле $refOptions, позволяющее игнорировать свойство формы Type присутствует в дизайне автора во всех формах, наличие поля свидетельствует о том, что в интерфейсе открыт документ, отсутствие - открыто представление. Печать представления - используется стандартная печать};
Form="Document"; @If(@Attachments > 0; @Command([RunAgent]; "(Действие: Печать вложенного файла)"); REM {При наличии в документе присоединённых файлов печать перекрывается функционалом агента, показывающего в выпадающем меню список файлов и открывающего выбранный файл в ассоциированном в системе приложении};
@Do(@Command([SwitchForm]; "forPrint"); @Command([FilePrint]); @Command([SwitchForm]; "Document"))); REM {Переключение формы отображения документа на форму для печати и печать документа по этой форме};
@Prompt([Ok]; "Функция в разработке"; "Функция печати в настоящий момент не доступна." + @Char(13) + "Воспользуйтесь стандартной печатью Lotus Notes")); REM {Это сообщение, в принципе, может быть заменено на команду печати @Command([FilePrint])}

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

Сервис. В это выпадающее меню "можно положить... всё, что хочешь, можно положить..." (по словам Винни-Пуха). В частности, в приложении Библиотека документов автор использовал следующий набор меню:

Поиск. В представлении - открывает панель полнотекстового поиска (дублирует пункт Главного меню View - Search This View... и действие панели инструментов с изображением лупы). Код действия: @Command([ViewShowSearchBar]; "1")

Поиск. В документе - выводит окошко поиска фразы в документе (дублирует пункт меню Edit - Find/Replace... и действие панели инструментов с изображением бинокля). Код действия: @Command([EditFind])

Добавление выделенных документов в пользовательскую папку (shared, desktop private on first use). Дублирует перетаскивание документа методом drag-n-drop. Код действия: запуск агента по выделенным документам. Код агента: @AddToFolder("Мои документы"; ""); SELECT @All

Копировать выделенные документы в таблицу. Дублирует функционал соответствующего пункта главного меню Edit и действие панели инструментов с трудно описываемым изображением. Точнее - использует их функционал, так как вызывает соответствующее меню путём имитации последовательности нажатия клавиш
Обратите внимание, что приводимый ниже код агента использует обращение к функциям Windows API и, следовательно, является платформенно-зависимым

(Declarations)
' Объявление констант и функций WinAPI для работы с системным реестром
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006

Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL

Const REG_SZ = 1 ' Unicode nul terminated string
Const REG_BINARY = 3 ' Free form binary
Const REG_DWORD = 4 ' 32-bit number
Const ERROR_SUCCESS = 0&

Declare Function RegCloseKey Lib "advapi32.dll" (Byval hKey As Long) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (Byval hKey As Long, Byval lpSubKey As String, phkResult As Long) As Long

Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (Byval hKey As Long, Byval lpSubKey As String, Byval ulOptions As Long, Byval samDesired As Long,  phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (Byval hKey As Long, Byval lpValueName As String, Byval lpReserved As Long,  lpType As Long, Byval lpData As String,  lpcbData As Long) As Long
' Объявление функций WinAPI, имитирующих ввод с клавиатуры
Declare Function activateKeyboardLayout Lib "user32" Alias "ActivateKeyboardLayout" (Byval HKL As Long, Byval flags As Long) As Long
Declare Function getKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (Byval pwszKLID As String) As Long
Declare Function getKeyboardLayout Lib "user32" Alias "GetKeyboardLayout" (Byval dwLayout As Long) As Long
Declare Function loadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (Byval pwszKLID As String, Byval flags As Long) As Long
Declare Sub keybd_event Lib "user32" (Byval bVk As Integer, Byval bScan As Integer, Byval dwflags As Long, Byval dwextrainfo As Long)

Function RegQueryValue(keyName As Long, subKeyName As String, valueName As String) As Variant
' Функция, возвращающая значение из реестра Windows
Dim hCurKey As Long
Dim lResult As Long
Dim lValueType As Long
Dim strBuffer As String
Dim lDataBufferSize As Long
Dim intZeroPos As Integer
Dim lRegResult As Long
Dim ss As String

lDataBufferSize = 1024
strBuffer = String(lDataBufferSize, Chr(0))
ss=""
lRegResult = RegOpenKeyEx(keyName, subKeyName, 0, KEY_READ, hCurKey)
lRegResult = RegQueryValueEx(hCurKey , valueName, 0&, lValueType, strBuffer, lDataBufferSize)
If lRegResult = ERROR_SUCCESS Then
If lValueType <= 2 Then
intZeroPos = Instr(strBuffer, Chr$(0))
If intZeroPos > 0 Then
GetRegValue = Left$(strBuffer, intZeroPos - 1)
Else
GetRegValue = strBuffer
End If
End If
Else
End If
lRegResult = RegCloseKey(hCurKey)
RegQueryValue = GetRegValue
End Function
Sub switch_layout(keybHotKeys As Integer)
' Процедура переключения раскладки клавиатуры. keybHotKeys = 1 для комбинации Alt-Shift, 2 для комбинации Ctrl-Shift
If keybHotKeys=2 Then
keybd_event 17,0,0,0 ' Ctrl key down
keybd_event 16,0,0,0 ' Shift key down
keybd_event 17,0,2,0
keybd_event 16,0,2,0
Else
keybd_event 18,0,0,0 ' Alt key down
keybd_event 16,0,0,0 ' Shift key down
keybd_event 18,0,2,0
keybd_event 16,0,2,0
End If
End Sub
Sub Initialize
' Текущая раскладка
Dim keybLocal As Long
keybLocal = getKeyboardLayout(keybLocal)

Dim keybHotKeys As Integer
' Получение из реестра Windows информации о комбинации клавиш для переключения раскладки
keybHotKeys = RegQueryValue(HKEY_CURRENT_USER, "Keyboard Layout\Toggle", "Language Hotkey")

' Получение информации о локализации интерфейса клиента Notes
Select Case Lsi_info(9)
Case "ru":
' Русскоязычный интерфейс - нужно на русской раскладке воспроизвести имитацию доступа к пунктам меню Alt-А (Правка), Alt-П (Копировать как таблицу), а затем Alt-А (Правка), Alt-Ы (Снять отметку о выделении)
If Not (keybLocal = 68748313) Then ' если текущая расскладка - не русская - имитируем переключение
Call switch_layout(keybHotKeys)
End If
keybd_event 18,0,0,0 ' Alt key down
keybd_event Asc("а"),0,0,0 ' а key down -- invokes file menu
keybd_event Asc("а"),0,2,0 ' а key up
keybd_event Asc("п"),0,0,0 ' п key down - Копировать выделенные документы как таблицу
keybd_event Asc("п"),0,2,0 ' п key up
keybd_event Asc("а"),0,0,0 ' а key down -- invokes file menu
keybd_event Asc("а"),0,2,0 ' а key up
keybd_event Asc("ы"),0,0,0 ' ы key down - Снять отметку о выделении
keybd_event Asc("ы"),0,2,0 ' ы key up 
keybd_event 18,0,2,0 ' Alt key up
If Not (keybLocal = 68748313) Then ' переключение раскладки "как было"
Call switch_layout(keybHotKeys)
End If

Case "en":
' Англоязычный интерфейс - на английской раскладке воспроизвести имитацию доступа к пунктам меню Alt-E (Edit), Alt-Y (Copy selected as table), а затем Alt-E (Edit), Alt-D (Deselect All)
If Not  (keybLocal = 67699721) Then
Call switch_layout(keybHotKeys)
End If
keybd_event 18,0,0,0 ' Alt key down
keybd_event Asc("E"),0,0,0 ' E key down -- invokes file menu
keybd_event Asc("E"),0,2,0  'E key up
keybd_event Asc("Y"),0,0,0 ' Y key down - Copy selected as table
keybd_event Asc("Y"),0,2,0 ' Y key up
keybd_event Asc("E"),0,0,0 ' E key down -- invokes file menu
keybd_event Asc("E"),0,2,0  'E key up
keybd_event Asc("D"),0,0,0 ' D key down - Deselect All
keybd_event Asc("D"),0,2,0 ' D key up
keybd_event 18,0,2,0 ' Alt key up
If Not  (keybLocal = 67699721) Then
Call switch_layout(keybHotKeys)
End If
End Select
End Sub


Часть первая >>> Часть вторая >>> Часть третья >>> Часть четвёртая Часть пятая >>> Часть шестая >>>
 
  Опубликовано — 07/20/2007 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU