Подсветка в ленточной форме без сохраненных рисунков. Быстрое изменение цветов с помощью диалогового окна "Выбор Цвета"

Страницы работы

Содержание работы

Подсветка в ленточной форме без сохраненных рисунков

Как отметить цветом записи в форме? 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

-  примеры работы с дополнительными цветами окна Выбор Цвета.

  Описание функций библиотеки ACC++.dll

Применение нижеописанных функций в 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 цвета.

Похожие материалы

Информация о работе