Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Access 2000 - программирование и готовые решения


Служба Рассылок Городского Кота

Выпуск 12. Как в форме нарисовать окружность?

Введение. В данном выпуске рассылки рассказывается о различных проблемах, с которыми встречаются пользователи базы данных Access внутри форм, меню и отчетов.

Внимание. На сайте: www.liac.nm.ru появилась новая программа Курс 2000, версия 4.2. В ней улучшена диагностика при подключению к ЦБ. Программу можете получить бесплатно. Также Вам предлагается новая программа "Склад и Реализация", в которую встроено более 100 отчетов.

1. [Формы] У меня есть такая проблема. Разрешима ли она? Не сильно вдаваясь в подробности, вопрос такой - Могу ли я что либо создавать на форме в тот момент, когда она уже запущена? К примеру, нарисовать линию (которой нет в режиме Конструктора). Мне, это надо для рисования различных типов окон, по заданным параметрам пользователя в масштабе. И более того выводить эти рисунки на печать. Вариант, с заранее приготовленными рисунками в режиме Конструктора формы не подходит. Так как их огромное количество и невозможно их видоизменять. Например нанести заданные размеры на рисунок, сделать масштаб сторон окна и т.д.?

Ответ . Да Ваша проблема разрешима. Но она достаточно сложная и без соответствующей подготовки не обойтись. Для этого Вам надо хорошо изучить API-функции (user32.dll) и GDI-интерфейс (gdi32.dll) для рисования графических элементов Windows. Форма в Access как слоеный пирог состоит из цепочки связанных между собой пластинок-окон. Классы окон бывают разные, например, "OFormSub", "OTabControl" и другие. Среди них надо найти класс "OFEDT", получить предыдущий контекст окна и использовать его для рисования. В файле la_form.mdb Вы найдете пример 5, который показывает как нарисовать в форме Access ДУГУ и ЛИНИЮ. С помощью GDI - интерфейса Вы сможете нарисовать и другие объекты Windows, сплайны, ломаные и заштрихованные области. Думаю, что если внимательно изучите пример, то У Вас все получится.
    Вывод на печать в отчете достаточно простой. Для этого в нем есть функции рисования линий Report.line и элипсов Report.circle. Использовать их надо после форматировании страницы. Внимание! Когда Вы рисуете в отчете размерность элементов может быть в мм, см, дюймах, твипах, пикселах и других, а в форме размерность дается в пикселах. Смотрите файл: la_report.mdb
    PS. Второй способ заключается в том, чтобы найти ActiveX  элемент для формы, т.е. небольшой графический редактор. Я думаю, что такие фирмы как Adobe, Corel, Кодак давно разработали их. Для этого дано посмотреть сайты, содержащие графику. Элемент ActiveX может содержаться в web-страницах.

2. [Меню]. С большим интересом изучаю Ваши "Лекции". При попытке создать по описанному в них способу пользовательскую панель меню столкнулась с тем, что на кнопках на моей панели не отображается текст, указанный в свойстве Caption, а отображается этот текст во всплывающей подсказке к кнопке. С чем это связано и как это исправить?

Ответ . Попробуйте сначала научиться создавать панель элементов с помощью мастера Access. Для этого Вы должны поместить указатель мыши на любую панель управления и нажать правую клавишу мыши и выбрать пункт "Настройка ...". Далее создайте свою панель и группу клавиш и изучите их свойства. Теперь попробуйте написать программу, которая будет использовать свойства клавиш вашей панели. Всплывающая подсказка - это свойство TooltipText, текст на клавише - Caption. Дополнительно можете посмотреть пример номер 2 в файле la_menu.mdb

3. [Формы] Подскажите, имеется ли способ отображения в форме и отчете (анкеты) фотографии, находящейся в определенном каталоге, не включая ее в базу, а лишь по ссылке, например фотографии складываются в каталог Photo, и каждой присваивается название по номеру записи, а при открытии конкретной записи в форме отображается необходимая фотография. Смысл, думаю, понятен: не было бы необходимости каждый раз вставлять фотографию в виде объекта, а достаточно отсканировать, обозвать по номеру записи и бросить в каталог, а база сама покажет ее, если на данную запись оная существует. В настоящее время у меня фотографии выделены в отдельный файл .mdb, но во-первых этот файл непомерно растет, во-вторых - не каждый пользователь может после сканирования вставить объект в базу.

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

4. [Формы] Интересно, каким образом можно получить Left, Top для формы или отчета. Да, и хотя бы улавливать, когда она (он) максимизируется (не говоря уже о знании этого свойства). А то ведь, какая ситуация получается, хотелось бы, что бы пользователь сам определял место для своей формы, и устанавливал ее размеры, а при запуске мы ее в том же месте и подсовываем (т.е. там где она была перед выгрузкой).

Ответ . Данная задача не очень сложная, если Вы хорошо изучите API-интерфейс Windows (user32.dll). Используйте для определения размеров окна функцию GetWindowRect, а для смещения и изменения ширины и высоты окна - MoveWindow. Чаще всего функцию MoveWindows размещают при обработке события Form_Open Вашей формы. Помните! Все размеры и координаты окна даются в пикселах, а не в твипах. Пример N4, в файле "la_form.mdb" можете посмотреть у меня на сайте.

5. [Формы] Мне надо создать в форме контекстный поиск (как справка по Access), т. е. в поле А(редактирование) ввожу одну букву в поле Б(список) тут же отбираются слова содержащие эту букву так вторую и т.д. Как это можно реализовать с помощью VisualBasic в Access. Ломаю голову не могу понять, помогите!

Ответ. В принципе задача очень интересная и реализаций контекстного поиска может быть много. Смотрите пример N3 в файле la_report.mdb. В них есть два примера, один с отбором записей, другой - с поиском. Там я использовал обработку события Change для полей и получения введенного значения. Далее составляется строка поиска или запрос SQL для использования в подчиненной форме.

6. [Формы] В справке Access 2000 указано, что сочетание клавиш Ctrl+; должно вставлять текущую дату. Не работает. И в таблице и в форме (и в текстовом поле типа Note и в поле типа Date) при нажатии Ctrl+; выдается ошибка "The expression you entered has a function name that Microsoft Access can't find". Не знаете в чем проблема?

Ответ. У меня данная группа клавиш работает, то я этим никогда не пользуюсь. Потому что, когда я открываю в таблице поле имеющее формат даты, то сразу изменяю у него свойства, т.е.  [Маска ввода] = "00.00.0000;0;_", [Значение по умолчанию] = "Date()". Все эти свойства автоматически передаются и полю в форме, если она будет связана с данной таблицей. После таких настроек Вам не придется вводить дату. Дополнительно к этим комментариям посмотрите таблицу в файле: la_form.mdb (раздел формы), где показана установка этих свойств и раздел сайта "инсталляция Windows и Access".

7. [Отчеты] Может ли номер страницы генерироваться (в "Report footer"), а не поступать из таблицы. Скажем такая ситуация: При печати отчета не всегда печатают все группы товаров, а только необходимые и поэтому группы товаров могут находится каждый раз на другой странице. (К теме: Печать оглавления прайс-листа)

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

Copyright © 02.10.2000 Виктор Конюков,  (Web: www.liac.nm.ru, Email: LiderAccess.bigfoot.com)


http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное