Как отметить цветом записи в форме? Access2000/XP позволяет задать условное форматирование, да беда в том, что поддержано только 4 формата, да и база у меня в Access97. Ну что ж, попробуем сделать так: используем ленточную форму с Присоединенным OLE.
- свойство Присоединенного OLE "Установка размеров" (SizeMode)= Вписать в рамку
- на верх (на рамку с Присоединенным OLE ) помещаем текстовые поля
- помещаем Присоединенный OLE на задний план
- устанавливаем Свойство текстовых полей Тип фона (BackStyle)= Прозрачный). Эти поля и будут смотреться на фоне цвета OLE объекта.
- создаем таблицу с полем Ole-объекта (рисунками BMP (минимум 6x6 пикселей, меньше нельзя) и полем ключа.
- связываем через соответствующий запрос (или DLookup) Присоединенный OLE с риcунками таблицы, и все прекрасно работает.
Казалось бы и все, однако, чтобы изменить цвет фона - требуется:
- открыть таблицу с рисунками
- найти и открыть нужный рисунок для изменения
- в редакторе MsPaint открыть окно изменения палитры и выбрать цвет
- используя заливку или кисть изменить цвет
- закрыть таблицу, обновить форму и оценить новый вид
При непосредственном изменении рисунков из формы (впрочем это сути не меняет) у меня возникает ошибка "Возникла ошибка при установлении связи MSAccess с сервером OLE".
А пользователь оказался очень привередлив (это я сам), и периодически возникало чувство некой недоработанности и ущербности. И вот когда чаша терпения переполнилась, я провел небольшие исследования по содержимому Ole полей таблицы и т.п., и пришел к выводу, что вообще рисунки можно и не хранить в таблице (по крайней мере их можно создавать и изменять программно).
Как показали дальнейшие эксперименты, быстродействие VB под патронажем MSAccess никудышнее (тот же код в VB6 работает в 5 раз быстрее, в конце концов VBA предназначен для управления объектами, а не для молниеносных низкоуровневых операций), а от COM - ActiveX объектов и их инсталляций-перерегистраций у меня аллергия. Из-за этих "мелочей" пришлось продолжить изучение C++, и написать Dll библиотеку с функциями по типу WinAPI, их вызов такой же как у других API функций, и никаких инсталляций-регистраций Dll не требуется.
И что теперь...?
- вместо рисунков я храню в таблице цвета RGB (длинное целое)
- возможно быстрое изменение цветов с помощью диалогового окна ВыборЦвета
- доступны все 16777215 цветов, и работает очень красиво
Остальное смотрите в примерах баз в форматах Access97 и Access2000/XP.
Файл ACC++.dll надо поместить в каталог WINDOWS, или WINDOWS\SYSTEM, или туда, где находится файл MSACCESS.EXE. Можно и в любой другой каталог, но тогда потребуется переписать в модуле объявления-декларации функций с указанием полного пути к ACC++.dll
Что еще?
- примеры работы с API функциями CopyMemory, FillMemory, ZeroMemory
- примеры работы с дополнительными цветами окна Выбор Цвета.
Применение нижеописанных функций в Access97 немного отличается от применения в AccessXP из-за разного преобразования строк ANSI-UNICODE, поэтому пришлось написать две версии одной функции. У меня установлены Access97 и AccessXP. Как для приложения Access2000, не знаю, думаю, что так же, как и для AccessXP.
Declare Function PicOleDataA Lib "ACC++.dll" (ByVal vRGB As Long) As String
Declare Function PicOleDataW Lib "ACC++.dll" (ByVal vRGB As Long) As String
Функция PicOleDataA возвращает строку типа As String (в C++ это тип данных BSTR, т.е. указатель на массив байтов). В строке содержится одноцветный рисунок BMP 6x6 пикселей в оправке понятной для Access.
Параметр vRGB, передаваемый функции - значение RGB цвета.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.