CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
То, что энтузиасты ждали так долго, наконец-то случилось, и компания NVIDIA анонсировала свой новый ...
Официальный анонс графического ускорителя GeForce GTX 1080 Ti состоялся 1 марта, и партнеры NVIDIA ...
Компания ASRock представила мировой общественности материнскую плату H110-STX MXM, которая рассчитана ...
Компания MSI в рамках серии Arsenal Gaming представляет пользователям материнские платы линейки ...
По данным наших коллег, в этом месяце компания Huawei официально представит свой новый смартфон. ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Выпадение… списка

Александр ЧАБАН

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

Немного теории. Интерфейс любой программы предназначен для взаимодействия с пользователем; задача программистов — сделать это взаимодействие максимально комфортным. Это облегчит работу с программой и сократит время на обучение персонала. На создание продуманного и гибкого интерфейса может уйти больше времени, чем на разработку структуры данных и отчетов. Интерфейс Access строится на формах. Только внутри формы возможно использование VBA. Поле для ввода, набор переключателей или кнопка традиционно используются только по назначению. Поле со списком может быть и просто списком, и полем для ввода данных, также может выполнять функции кнопки. Заинтересовались? Тогда — детально о списках и особенностях работы с ними.

Начнем, пожалуй, с того, что откроем базу данных Борей (сразу после установки MS Access она предлагается в качестве примера для изучения, к тому же многие учебники ссылаются именно на нее) и попробуем переделать одну из форм таким образом, чтобы она больше отвечала своему назначению. На собственном опыте знаю, как опасно для быстродействия проекта отображение в форме всего массива данных, доступных для обработки. Для СУБД Access существует ряд ограничений на размер данных. По достижению этих максимумов работа базы существенно замедляется. К сожалению, методика принудительного уменьшения информационного потока нигде детально не описана. Один из приемов — искусственно разделить данные на те, что могут быть отображены, и те, что затребованы для отображения. Это позволит перейти к идеологии «тонкого» клиента, что полезно при сетевом доступе к источнику данных и к SQL-серверу. Как же ограничить пользовательский поток данных и организовать средства для быстрого поиска необходимой информации?

Покажем это на примере. Подопытным кроликом у нас будет форма Заказы клиентов. Откроем ее в режиме конструктора и внимательно посмотрим на список доступных свойств формы (Рис. 1).

Из предложенных опций нас более всего интересует Разрешить изменение. По умолчанию здесь выставлено Нет. Как видим, форма создана для отображения данных, сохраненных другим способом; редактировать или удалять их нельзя. Тестируя форму после изменения, мы должны убедиться, что это условие соблюдается. Однако сейчас этот пункт меняем на Да (Рис. 2).

Рис. 1.   Рис. 2.

Огласите весь список

Следующие наши действия радикально меняют идеологию формы. В своем первичном состоянии последняя отображает две таблицы —Заказы и Сведения о заказах в соответствующих связанных формах. Поле Название и поле Страна отображают данные из таблицы Клиенты. Очевидно, разработчики намеревались сделать удобный инструмент для просмотра всех заказов и сведений о них. Надо сказать, это им отчасти удалось.

Итак, преобразуем поле Страна и поле Название в выпадающий список (Формат > Преобразовать элемент в > Поле со списком) (Рис. 3). Все свойства списков можно просмотреть и изменить известным нам способом (Рис. 4):

Рис. 3.   Рис. 4.

1, ControlSource — указывает, какие данные отображать. Ожидается имя поля из источника данных, результат выражения (="Сегодня " & Date()) или пустое значение. Только в первом случае допускается и отображение, и редактирование данных. Выражение может содержать ссылки на системные функции и переменные, пользовательские модули, математические операции со значениями других полей. Удобно пользоваться построителем функций ("..." для вызова мастера).;

2, InputMask — маска ввода; детально обсуждалась в статье «Доступные таблицы» (МК №13 (236)). Применение этого свойства в форме практически ничем не отличается от табличного.

3, RowSourceType — используем первое значение —таблица/запрос. Так мы получим элемент, связанный с реальными значениями в базе данных. Все изменения в связанной таблице будут влиять на значения нашего списка. У меня уже были случаи, когда фиксированные значения, заявленные заказчиком как окончательные, приходилось менять и в таблице, и в форме. Используя даже фиксированные значения, вы можете значительно повысить быстродействие базы, ссылаясь не на значение в таблице, а на ключевое поле. Как применять Список значений и в каких случаях это будет уместно — в следующей статье;

4, RowSource — ожидается имя таблицы или запроса, либо же строка SQL, если в предыдущем поле выставлено значение таблица/запрос;

5, BoundColumn — указывает номер столбца, начиная с первого, данные которого будут использоваться в качестве значения этого элемента, а значит, сохранятся в поле источника данных с именем, указанным в первом пункте. Если выставить 0, то поле будет возвращать значение ListIndex —номер строки, выбранной в списке начиная с нуля;

6, LimitToList, и 7, AutoExpand — сервис. Первая опция обязательно должна быть выставлена в Да, если необходимо обработать программно событие отсутствие в списке. Я предпочитаю Да для обеих. Зачем нужен список, если пользователь все равно вводит свое значение с клавиатуры? Впрочем, один из списков мы сделаем без ограничений — на это у нас будут веские основания. Как правило, таких свобод следует избегать, иначе проверка введенных значений отнимет у вас слишком много времени.

8, 9 и 10 — см. статью «Доступные таблицы»;

11, Enabled, и 12, Locked — используются для запрета (разрешения) доступа или редактирования элемента соответственно. Программно изменить эти значения можно так: ИмяЭлемента.Enabled=True. Блокировка — более мягкое ограничение, в этом случае остается возможность перевести в поле курсор и выделить (скопировать) данные. Как дополнение к этим двум я часто применяю свойство вывод на экран (Visible). Оно тоже может изменяется программно и имеет два доступных значения — True (–1) и False (0).

Укажем в качестве источника данных (Рис. 4.4) следующий SQL-запрос:

Запрос на группировку можно создать с помощью конструктора, а текст запроса скопировать через буфер обмена в режиме SQL.

Запрос на группировку вернет два столбца —Страна и Кол-во. Чтобы список показал все столбцы, необходимо изменить значение некоторых их свойств (Рис. 5):

вкладка «Макет»: поле Число столбцов —2, ширина столбцов —3см;1см, Ширина —4см;

Рис. 5.

вкладка «Данные»: поле Ограничиться списком должно иметь значение Да (Рис. 4.6). Это позволит вести поиск только среди реально существующих записей. Поле Данные (Рис. 4.1) должно иметь пустое значение (необходимо удалить оттуда Страна), иначе выбор из списка приведет к изменению значения данных в таблице. С полем Название поступим так же и изменим все свойства аналогичным образом. Вот только источник данных будет другой, каждый раз новый.

А теперь пришло время разобраться с VBA.

События, которые мы выбираем

Что может VBA? Практически все — это полноценный язык программирования. Применение б.д. Access без VBA резко сужает ваши горизонты. Попробуем на простом примере разобраться, как его можно использовать в форме. Для этого откроем доступные свойства поля со списком Страна на вкладке События (Рис. 6).

Как обычно, из всего этого великолепия нам понадобится только небольшая часть. События, как видите, расположены попарно, но порядок расположения событий в списке не совпадает с порядком их следования. Я выбираю подходящее для конкретного случая событие методом исключения. В любом случае можно в процессе отладки перенести часть программного кода в другое событие (копировать, вырезать, вставить). Если вы сомневаетесь, происходит ли это событие вообще, вставьте строку MSGBOX "TEST". Обычно я оставляю эти строки до полной готовности проекта, комментируя их апострофом или классическим REM.

Рис. 6.   Рис. 7.

Для поля со списком Страна в нашем случае подходят события Изменение и После обновления. Выбираем последнее. Дело в том, что изменения в списке можно производить двумя способами — щелчком мыши и с клавиатуры. Только в первом случае оба метода идентичны («Изменение» наступает раньше, чем «После обновления»). В случае ввода с клавиатуры «Изменение» наступает каждый раз после нажатия любой клавиши, а «После обновления» — только в случае удачного ввода (выполнения условий формата поля, в нашем случае — выбора одного из реальных значений списка). Создадим для события «После обновления» программу (Рис. 7):

Эта программа будет обновлять источник данных поля со списком Название. Как видите, программа совсем невелика. Мы могли оставить только строку Me![Название].RowSource =, но для корректной обработки любой критической ситуации в программе есть несколько строк, позволяющих ей реагировать на ошибку. Строка Me![Название].SetFocus передает фокус (управление) полю со списком «Название». Строка SendKeys "{F4}", True разворачивает список, имитируя нажатие клавиши F4.

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

Вот листинг программы:

Список будет содержать три столбца —Название, Страна и Кол-во; но второй пункт дублирует одноименный список, поэтому ширина нашего списка должна быть "6см;0см;1см". Таким образом мы скроем второй столбец.

По порядку номеров — рассчитайсь

Инструкция Me!Страна = Me!Название.Column(1) передает в поле Страна значение второго столбца списка Название. Свойство Column используется для ссылок на конкретный столбец или на комбинацию столбца и строки поля со списком с несколькими столбцами в формате имяЭлементаУправления.Column(столбец, строка) начиная с нулевого. В нашем случае список вернет значение второго столбца выбранной строки.

Проанализируем, что получилось в результате наших манипуляций. Вместо двух полей для отображения названия клиента и страны мы создали два списка. Выбирая значение поля «Страна», пользователь видит общее количество фирм из этой страны, изменяет значение подчиненного списка «Название» и автоматически переходит в него, чтобы выбрать конкретную фирму. Меняя значение этого списка, пользователь сразу получает перечень всех заказов, связанных с этой фирмой (количество заказов видно заранее в последнем столбце списка). Достоинства — невозможно отобразить список всех фирм, форма отображает перечень заказов только одной. Но вот поиск по полю «Название» более невозможен. Исправим ситуацию с помощью VBA. Для этого изменим некоторые свойства поля «Название» — так же, как мы проделали это с полем «Страна». Свойство Данные > Ограничиться списком меняем на Да. Это позволит нам отслеживать событие Отсутствие в списке. Для последнего напишем программу поиска по образцу. Вот ее листинг:

Теперь ввод любой последовательности символов приводит к изменению списка. Указав несколько символов из реально существующей фирмы, пользователь сразу получит возможность просмотреть все ее заказы.

Вот и все. У обоих списков значение свойства Данные > Данные мы оставили пустыми, поэтому изменения в этих списках не будут сохраняться. Насколько удобней стал интерфейс, смогут оценить пользователи, работающие с подобными программами регулярно. Функция передачи фокуса, которую мы применили в программе, создает условия для быстрого ввода данных — пользователю нет необходимости нажимать дополнительные кнопки или, что еще хуже, попадать в нужное поле курсором мышки.

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

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы: *
captcha
Обновить






Рейтинг@Mail.ru
Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov