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

Функция PicOleDataW возвращает тоже самое, что и PicOleDataA но в кодировке Юникод.

-----------------------------------------Declare Function ColorsFromRGB Lib "ACC++.dll" (ByVal clr As Long, _

red As Byte, green As Byte, blue As Byte) As Long

Значение RGB цвета находится в пределах от 0 до 16777215(&H00FFFFFF). Старший байт при этом равняется 0, а три младших, определяют, соответственно, синюю, зеленую и красную составляющие цвета. Значения составляющих лежат в пределах от 0 до 255(&HFF).

Функция ColorsFromRGB производит операцию обратную встроенной VB-функции RGB, разбивая значение RGB на три составляющие.

Функция возвращает значение Long, которое содержит значение старшего 4го байта переданного функции аргумента clr, например, если передать аргумент clr как      &H00AABBCC& функция возвратит       &H00000000&,  т.е. 0

если передать     &H80BBCCDD&

Функция возвратит &HAA000000&

Таким образом, если функция возвращает 0, значит 4й байт аргумента clr содержит &H00, т.е. 0. Если функция возвращает &H80000000, значит, вероятно, ей был передан цвет системной палитры и тогда аргумент red получит значение системной константы (см. в MSDN WinAPI функцию GetSysColor).

Но, в любом случае:

-  2й аргумент red получает значение 1го байта переданного clr

-  3й аргумент green получает значение 2го байта

-  4й аргумент blue получает значение 3го байта.

Подобную функцию несложно реализовать и средствами VBA, причем несколькими способами, но их эффективность далека до операции сдвиг языка C++:

green=(BYTE)(clr >> 8); //ЗЕЛЕНЫЙ  

Declare Function GetVarPtr Lib "ACC++.dll" (v As Any) As Long

Функция GetVarPtr - это Эквивалент  недокументированной VBA функции VarPtr. Сама VarPtr это Компонент VBA из скрытого  _HiddenModule. Чтобы увидеть описание VarPtr запустите Просмотрщик Объектов(Object Browser), в контекстном меню выберите опцию Отобразить скрытые компоненты(Show Hidden Members), и найдите VarPtr с помощью поиска, указав искать в <VBA> или во <Всех Библиотеках>.

А ниже, полная и исчерпывающая ДОКУМЕНТАЦИЯ на GetVarPtr из ACC++.dll …

GetVarPtr возвращает лишь то, что ей передано по ссылке(ByRef), а это адрес переменной, и все.

/// Весь исходный код функции GetVarPtr на С++:

int WINAPI GetVarPtr(void* v)

{

return (int)v; // тело функции

}

///// ... и вся документация :-)   ///////////////////////////

а я ругал MicroSoft, в самом-то деле, ну что здесь документировать?

все и так понятно(тем, кто знал C/C++ еще до рождения :-(  :-|  :-)))

Замечания.

Имеется одно ограничение, ограничение самого Access97 для запросов на объединение. Цитирую документацию:

’’’’’’’’’’’’’’’

Ошибка 3364.

В предложении SELECT запроса на объединение не допускается использование поля Memo или поля объекта ActiveX. Эти типы данных являются недопустимыми для данной операции.

’’’’’’’’’’’’’’’’’’’’’’’’’

Итак, применение любых функций в Access97, которые возвращают в поле запроса на объединение строку длиннее чем 255 символов, закончится ошибкой защиты памяти  (это также (а как же иначе?) касается функций PicOleDataA и PicOleDataW из библиотеки ACC++.dll).

Это ограничение легко обойти, создав новый запрос, уже на основании запроса на объединение, и в нем уже можно творить что угодно.

Мораль: Да, быстродействие VBA в MSAccess невелико. Он, будучи языком высокого уровня, предназначен для управления объектами, и в этом его сила. Из VBA доступна вся мощь функций API и COM объектов, и он, как посредник, легко позволяет использовать компоненты, написанные на других языках, для расширения возможностей и эффективности Ваших приложений.

Если есть вопросы или замечания, пишите jackbo@tut.by

Яков г.Минск