Домой Общая информация Создание интерфейса пользователя. Лучшие IT-решения для бизнеса Одинаковое расстояние между элементами управления

Создание интерфейса пользователя. Лучшие IT-решения для бизнеса Одинаковое расстояние между элементами управления

Одной и наиболее сильных сторон среды программирования Delphi является ее открытая архитектура, благодаря которой Delphi допускает своего рода метапрограммирование, позволяя “программировать среду программирования”. Такой подход переводит Delphi на качественно новый уровень систем разработки приложений и позволяет встраивать в этот продукт дополнительные инструментальные средства, поддерживающие практически все этапы создания прикладных систем. Столь широкий спектр возможностей открывается благодаря реализованной в Delphi концепции так называемых открытых интерфейсов, являющихся связующим звеном между IDE (Integrated Development Environment) и внешними инструментами.

Данная статья посвящена открытым интерфейсам Delphi и представляет собой обзор представляемых ими возможностей. В Delphi определены шесть открытых интерфейсов: Tool Interface, Design Interface, Expert Interface, File Interface, Edit Interface и Version Control Interface. Вряд ли в рамках данной статьи нам удалось бы детально осветить и проиллюстрировать возможности каждого из них. Более основательно разобраться в рассматриваемых вопросах вам помогут исходные тексты Delphi, благо разработчики снабдили их развернутыми комментариями. Объявления классов, представляющих открытые интерфейсы, содержатся в соответствующих модулях в каталоге...\Delphi\Source\ToolsAPI. Design Interface (модуль DsgnIntf.pas) предоставляет средства для создания редакторов свойств и редакторов компонентов.

Редакторы свойств и компонентов – это тема, достойная отдельного разговора, поэтому напомним лишь, что редактор свойства контролирует поведение Инспектора Объектов при попытке изменить значение соответствующего свойства, а редактор компонента активизируется при двойном нажатии левой кнопки мыши на изображении помещенного на форму компонента. Version Control Interface (модуль VCSIntf.pas) предназначен для создания систем контроля версий. Начиная с версии 2.0, Delphi поддерживает интегрированную систему контроля версий Intersolv PVCS, поэтому в большинстве случаев в разработке собственной системы нет необходимости. По этой причине рассмотрение Version Control Interface мы также опустим. File Interface (модуль FileIntf.pas) позволяет переопределить рабочую файловую систему IDE, что дает возможность выбора собственного способа хранения файлов (в Memo-полях на сервере БД, например). Edit Interface (модуль EditIntf.pas) предоставляет доступ к буферу исходных текстов, что позволяет проводить анализ кода и выполнять его генерацию, определять и изменять позицию курсора в окне редактора кода, а также управлять синтаксическим выделением исходного текста.

Специальные классы предоставляют интерфейсы к помещенным на форму компонентам (определение типа компонента, получение ссылок на родительский и дочерние компоненты, доступ к свойствам, передача фокуса, удаление и т.д.), к самой форме и к ресурсному файлу проекта. Также Edit Interface позволяет идентифицировать так называемые модульные нотификаторы, определяющие реакцию на такие события, как изменение исходного текста модуля, модификация формы, переименование компонента, сохранение, переименование или удаление модуля, изменение ресурсного файла проекта и т. д. Tool Interface (модуль ToolIntf.pas) предоставляет разработчикам средства для получения общей информации о состоянии IDE и выполнения таких действий, как открытие, сохранение и закрытие проектов и отдельных файлов, создание модуля, получение информации о текущем проекте (число модулей и форм, их имена и т. д.), регистрация файловой системы, организация интерфейсов к отдельным модулям и т.д. В дополнение к модульным нотификаторам Tool Interface определяет add-in нотификаторы, уведомляющие о таких событиях, как открытие/закрытие файлов и проектов, загрузка и сохранение desktop-файла проекта, добавление/исключение модулей проекта, инсталляция/деинсталляция пакетов, компиляция проекта, причем в отличие от модульных нотификаторов add-in нотификаторы позволяют отменить выполнение некоторых событий.

Кроме того, Tool Interface предоставляет средства доступа к главному меню IDE Delphi, позволяя встраивать в него дополнительные пункты. Expert Interface (модуль ExptIntf.pas) представляет собой основу для создания экспертов - программных модулей, встраиваемых в IDE c целью расширения ее функциональности. В качестве примера эксперта можно привести входящий в Delphi Database Form Wizard, выполняющий генерацию формы для просмотра и изменения содержимого таблицы БД. Определив класс эксперта, необходимо позаботиться о том, чтобы Delphi “узнала” о нашем эксперте. Для этого его нужно зарегистрировать посредством вызова процедуры RegisterLibraryExpert, передав ей в качестве параметра экземпляр класса эксперта. В качестве иллюстрации создадим простой эксперт в стиле esStandard, который при выборе соответствующего ему пункта меню Delphi выводит сообщение о том, что он запущен. Как видно из вышеприведенной таблицы, стиль esStandard обязывает перекрыть шесть методов:

Для того чтобы эксперт был “приведен в действие”, необходимо выбрать пункт меню Component/Install Component ... , выбрать в диалоге Browse модуль, содержащий эксперт (в нашем случае exmpl_01.pas), нажать ОК, и после компиляции пакета dclusr30.dpk в главном меню Delphi в разделе Help должен появиться пункт Simple Expert 1, при выборе которого появляется информационное сообщение “Standard Expert started!”. Почему Delphi помещает пункт меню эксперта в раздел Help, остается загадкой. Если вам не нравится то, что пункт меню появляется там, где угодно Delphi, а не там, где хотите вы, возможен следующий вариант: создать эксперт в стиле add-in, что исключает автоматическое создание пункта меню, а пункт меню добавить “вручную”, используя средства Tool Interface. Это позволит задать местоположение нового пункта в главном меню произвольным образом.

Для добавления пункта меню используется класс TIToolServices - основа Tool Interface - и классы TIMainMenuIntf, TIMenuItemIntf, реализующие интерфейсы к главному меню IDE и его пунктам. Экземпляр ToolServices класса TIToolServices создается самой IDE при ее инициализации. Обратите внимание на то, что ответственность за освобождение интерфейсов к главному меню Delphi и его пунктам целиком ложится на разработчика. Попутно немного усложним функциональную нагрузку эксперта: при активизации своего пункта меню он будет выдавать справку об имени проекта, открытого в данный момент в среде: В этом примере центральное место занимает функция AddIDEMenuItem, осуществляющая добавление пункта меню в главное меню IDE Delphi. В качестве параметров ей передаются текст нового пункта меню, его идентификатор, идентификатор пункта, перед которым вставляется новый пункт, символьное представление клавиши, которая вместе с клавишей Ctrl может использоваться для быстрого доступа к новому пункту, и обработчик события, соответствующего выбору нового пункта. Мы добавили новый пункт меню в раздел View перед пунктом Watches.

Теперь познакомимся с нотификаторами. Определим add-in нотификатор, отслеживающий моменты закрытия/открытия проектов и корректирующий соответствующим образом поле, хранящее имя активного проекта (реализацию методов, не претерпевших изменений по сравнению с тпредыдущим примером, для краткости опустим): Для реализации нотификатора мы определили класс TAddInNotifier, являющийся потомком TIAddInNotifier, и перекрыли метод FileNotification. IDE будет вызывать этот метод каждый раз, когда происходит событие, на которое способен среагировать add-in нотификатор (каждое такое событие обозначается соответствующей константой типа TFileNotification). Поле Expert в классе TAddInNotifier служит для обратной связи с экспертом (метод TAddInNotifier.FileNotification). В деструкторе эксперта регистрация нотификатора снимается, и нотификатор уничтожается. А теперь проиллюстрируем использование модульных нотификаторов. Создадим add-in эксперт, выдающий сообщения о каждом акте сохранения проектного файла (реализацию уже знакомых нам методов для краткости не приводим): В данном примере add-in эксперт отслеживает события, соответствующие открытию/закрытию проектов.

При каждом открытии проекта регистрируется модульный нотификатор, соответствующий файлу проекта. В плане реализации модульные нотификаторы схожи с add-in нотификаторами: мы определяем класс TModuleNotifier, являющийся потомком TIModuleNotifier и перекрываем его методы Notify и ComponentRenamed. IDE вызывает метод Notify при возникновении определенных событий, имеющих отношение к данному модулю; внутри этого метода и определяется реакция на то или иное событие. Метод ComponentRenamed вызывается при изменении имени компонента, лежащего на форме модуля. Обратите внимание на то, что мы не используем этот метод, но обязаны его перекрыть, иначе при изменении имени компонента будет происходить вызов абстрактного метода базового класса, что приводит к непредсказуемым последствиям.

Регистрация модульного нотификатора является несколько более сложным процессом по сравнению с регистрацией add-in нотификатора: сначала мы получаем интерфейс модуля (TIModuleInterface), а затем с помощью интерфейса модуля регистрируем нотификатор. При закрытии проекта регистрация модульного нотификатора снимается (снова с использованием TIModuleInterface), и нотификатор уничтожается. В заключение покажем, как можно определять позицию курсора в окне редактора кода. Создадим эксперт, который при выборе соответствующего пункта меню выдавал бы сообщение, содержащее имя активного файла и позицию курсора в нем (приведена реализация только существенных для данного примера методов): Для определения позиции курсора мы должны получить следующую последовательность интерфейсов: модульный интерфейс (TIModuleInterface); интерфейс редактора кода (TIEditorInterface); интерфейс представления модуля в окне редактора (TIEditView).

Если при выборе пункта меню эксперта активным является файл с исходным текстом (*.pas), то выдается сообщение, содержащее имя активного файла и текущую позицию курсора в нем. Если активным является не pas-файл, то сообщение не выдается. Для получения имени активного файла используется метод GetCurrentFile класса TIToolServices. На этом завершим рассмотрение способов использования открытых интерфейсов. CD-ROM содержит исходные тексты всех приведенных примеров. На CD-ROM также содержится более сложный и развернутый пример, содержащий add-in эксперт, позволяющий пользователю делать закладки в исходном тексте Delphi-модулей. Краткое руководство по установке и использованию Эксперта Закладок содержится в файле bkmrks97.htm. Итак, в данной статье в общих чертах рассмотрены открытые интерфейсы и приведены примеры их использования. Еще раз повторим: благодаря наличию исходных текстов открытых интерфейсов вы без труда сможете разобраться в интересующих вас деталях. Надеемся, что многообразие возможностей, предоставляемых открытыми интерфейсами, породит у вас не одну смелую и полезную идею.

Это статья по мотивам вопросов на форумах: "Как мне вернуть строку из DLL?", "Как передать и вернуть массив записей?", "Как передать в DLL форму?".

Чтобы вам не тратить половину жизни на разобраться - в этой статье я принесу всё на блюдечке.

Темы этой статьи в разной степени уже не раз затрагивались в этом блоге, но в этой статье они собраны в кучу, приведены обоснования. Короче, ссылкой на эту статью можно кидаться в тех, кто разрабатывает DLL.

Важное примечание : статью нужно читать последовательно . Примеры кода приводятся только как примеры , на каждом шаге (пункте) статьи код примеров добавляется новыми подробностями. Например, в самом начале статьи нет обработки ошибок, указываются "классические" способы (типа, использования GetLastError , соглашения sdtcall и т.д.), которые по ходу статьи заменяются на более адекватные. Сделано так по той причине, чтобы "новые" ("необычные") конструкции не вызывали вопросов. Иначе при пришлось бы к каждому примеру вставлять примечание вида: "вот это обсуждается в том пункте ниже, а вот то - в этом вот". В любом случае в конце статьи есть ссылка на уже готовый код, написанный с учётом всего сказанного в статье. Можете просто его брать и использовать. А статья объясняет зачем и почему. Если вам не интересно "зачем и почему" - листайте в конец к заключению и ссылке на скачивание примера.

только за результат

жесткое соблюдение сроков

Прозрачность

выполнения проекта

техподдержки в подарок

Программирование, доработки консультации по 1С

Как мы работаем

1. Обсуждаем проблему по телефону. При наличии удаленного доступа - показываете на экране вашего компьютера.

2. Мы оцениваем работу в рублях, если проект большой, если нет - примерное кол-во часов.

3. Мы выполняем работу.

4. Вы принимаете работу в вашей программе, если есть недочеты мы их исправляем.

5. Мы выставляем счет, вы оплачиваете.

Стоимость работ

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

3. На работы более 10 часов предварительно составляется техническое задание с описанием и стоимостью работ. Работы начинаются после согласования ТЗ с вами.

Техническая поддержка

1. Если вы обнаруживаете какие то ошибки, в ранее принятых работах, в течении 3х месяцев, мы исправляем их бесплатно.

2. Постоянным клиентам любые недочеты, допущенные в наших работах, исправляем бесплатно в течении года.

Программы для управления вашим бизнесом.

Купить 1С:Предприятие

Мы являемся официальным дилером фирмы 1С, вы можете приобрести у нас различные программные продукты и лицензии. Кроме покупки "коробки" мы поможем вам настроить программу, проконсультируем и сделаем базовые настройки.

  • Бухгалтерский учет
  • Автоматизация магазина
  • Оптовые продажи
  • Помощь в установке и первоначальной настройке включена в пакет!
  • Тонкая настройка конфигураций под нужды заказчика, разработка новых модулей при отсутствии необходимых функций в стандартной конфигурации.
1С:Бухгалтерия 1С:Управление торговлей 1С:Розница 1С:Зарплата и Управление Персоналом
От 3300 руб. От 6700 руб. От 3300 руб. От 7400 руб.

Предоставление сервера.

Моментальная настройка сервер + 1С.

Нет сервера? Не беда, подберем и быстро настроим сервер в "облаке". За небольшую плату вы получаете очень надежное решение.

  • Доступность 24\7
  • Нет необходимости держать собственного системного администратора (экономия покроет расходы на ваш сервер).
  • Быстрая настройка и установка 1С на сервер, через 3 дня у вас уже будет полностью рабочая система.
  • В любой момент можно переехать на локальный сервер, если решение не устроит.

SMS из вашей 1С

Хотите чтобы клиенты во время узнавали об акциях, скидках? Клиенты не возвращаются? Настройте отправку SMS прямо из 1С!

Наша компания сможет в короткие сроки настроить отправку SMS Вашим клиентам напрямую из 1С. Примеры событий которые можно автоматизировать:

  • Благодарность за покупку и начисление бонусов сразу после очередной покупки.
  • Начисление бонусов на карту в подарок на день рождения\к другому знаменательному или праздничному дню.
  • Извещение о поступлении товара на склад.
  • Истечение срока подарочных бонусов.
  • Извещение о поступлении предоплаты и резервирования товара.
  • Адрес с уточнениями проезда к магазину\офису, номера телефонов.
  • И т.п.

Настройку в 1С можно произвести силами наших специалистов или своих сотрудников. Ознакомится с тарифами можно на странице SMS-тарифов.

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

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

Правильно расставляем последовательность переключения компонентов

Многие пользователи, особенно те, кто ранее работал в ДОС, имеют привычку переключаться между полями ввода не мышкой, а с помощью клавиатуры клавишей Tab. К тому же, это гораздо быстрее, чем выделять каждое поле мышью. Поэтому порядок переключения компонентов должен быть выставлен правильно. Это касается как компонентов внутри всех компонентов-контейнеров (панелей, GroupBox-ов и им подобных), так и самих компонентов-контейнеров, если их на форме несколько.

Порядок переключения компонентов внутри контейнера задается свойством TabOrder. Первым становится активным компонент, у которого TabOrder равен 0, вторым с 1 и т.д., пока не будут перебраны все компоненты. Кроме этого, у компонента есть свойство TabStop, которое показывает, будет ли компонент получать фокус при переключении клавишей Tab. Если нужно запретить переключение на какой-либо компонент, поставьте у него TabStop = false. В этом случае переключиться на данный компонент можно будет только с помощью мыши.

Бывают случаи, когда пользователи, привыкшие переключаться определенной клавишей в одной программе, по привычке продолжают пользоваться ей и в остальных. Часто это происходит с пользователями 1С, где для перехода по полям ввода может использоваться клавиша Enter. Что ж, дадим им такую возможность в наших программах, если они об этом просят. Устанавливаем у формы свойство KeyPreview в true и пишем обработчик события OnKeyPress:

Procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if ord(key)=vk_Return then
Form1.SelectNext(PriemForm.ActiveControl, true, true);
end;

Такой обработчик обеспечивает переход по элементам формы при нажатии клавиши Enter. Следует заметить, что подобный метод не будет работать с кнопками, т.к. нажатие Enter на кнопке приводит к ее нажатию, тогда как нажатие Tab передает фокус ввода следующему в последовательности переключения компоненту.

Кнопки по умолчанию

Все те же пользователи довольно быстро привыкают, что в диалоговых окнах приложений, как правило, клавишей Enter можно подтвердить свой выбор, а клавишей Esc - отменить. Давайте не будем их разочаровывать в наших программах, тем более что сделать это очень просто. Для кнопки, реагирующей на Enter, устанавливаем свойство Default в true. Для кнопки, реагирующей на Esc, устанавливаем свойство Cancel в true. И все.

Да или нет

Все диалоговые окна, запрашивающие действия пользователя, должны иметь, по крайней мере, две кнопки: подтверждения действия и отказа от действия (Да/Нет, Сохранить/Отменить и т.п.). Отказ от действия может осуществляться закрытием окна кнопкой [X] в заголовке окна. Недопустимо, если имеется только одна кнопка для подтверждения действия, а для отказа предполагается закрывать окно кнопкой [X] в заголовке, либо возможность отказа вообще отсутствует. Это путает пользователя, вызывая логичный вопрос: а как отказаться?

Также не забываем о том, что было сказано выше в пункте "Кнопки по умолчанию".

Все диалоговые окна должны открываться по центру экрана

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

Исключение делается в том случае, если диалоговое окно не модально, и по результатам работы пользователя в этом окне сразу происходят изменения в основном окне (например, фильтрация набора данных, перерисовка графиков и т.п.).

Размеры окон не должны превышать размеров экрана

Ни в коем случае. Это безобразие, когда часть окна вылезает за экран. Данное требование не зависит от разрешения экрана у пользователя, т.е. отговорки типа "Пусть поставят большее разрешение" не проходят.

Корректное изменение размеров оконных элементов

Оконные элементы должны корректно изменять свои размеры или перемещаться при изменении размеров окна, при максимизации окна и при восстановлении окна после максимизации.

Все всегда видно

Уменьшение размеров окна не должно приводить к исчезновению оконных элементов и желательно не должно приводить к появлению полос прокрутки (scroller-ов) самого окна. Можно ограничивать минимальные размеры окна таким образом, чтобы все элементы были видны и доступны. Если нет возможности разместить компоненты таким образом, чтобы все были видны в окне, можно использовать закладки (типа PageControl) для разбиения компонентов на группы. Отговорки по поводу разрешения экрана тоже не пропускаем.

Хинты везде, хинты всегда

Для кнопок, особенно на панелях инструментов (типа ToolBar) должны быть заданы подсказки (hint), чтобы всегда было понятно, зачем нужна та или иная кнопка.

Цветовая гамма

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

Заключение

Есть очень хороший метод, который позволяет найти недостатки программы вообще и интерфейса в частности. Он прост: представьте себя на месте пользователя и в течение получаса попытайтесь работать так, как работает он. Еще лучше, если ваш пользователь в пределах досягаемости (например, работает в той же организации). В таком случае сядьте рядом с ним, а лучше вместо него, и попробуйте сделать его работу. Вносить данные, изменять их, выводить отчеты и т.д. Если вы не знаете, как сделать правильно, спросите у своего пользователя. Сделайте не одну-две однотипные операции, как в отладочном режиме, а 20-30, а то и более различных операций, в разном порядке. Забудьте что-нибудь ввести или введите неправильно и посмотрите, как программа на это отреагирует. Вы достаточно быстро увидите слабые места вашей программы.

Автор статьи автоматизировал работу приемной комиссии в ВУЗе, и в первый год внедрения программы по 3-4 часа в день проводил в приемной комиссии, регистрируя абитуриентов, заполняя их персональные данные и выдавая им отчеты о сдаче экзаменов. А в оставшееся рабочее время исправлял ошибки и недочеты. Поверьте, на следующий год проблем практически не осталось. Аналогично было и при внедрении кадрового модуля.

Таким образом, помните об удобстве работы для пользователей. Пусть им будет легко и приятно работать с вашими программами.

Новое на сайте

>

Самое популярное