ActiveX

HomeFAQActiveX
На машине клиента ActiveX требует лицензию

Проблема.

Я использовал в своей программе ActiveX-компонент, а на машине клиента он не работает. Требует какую-то лицензию.

Причина.

Причина заключается в некоторых юридических тонкостях прав, на использование ActiveX-компонент, реализованных Microsoft. Приблизительно, смысл этих юридических тонкостей можно сформулировать так: нельзя распространять чужой продукт, но можно распространять результат его работы.

Решение.

Необходимо включить используемый ActiveX-компонент в визуальную библиотеку FoxPro (файл VCX). Такое использование ActiveX-компонентов не считается "распространением чужого продукта" и не требует установку лицензии. На машину клиента необходимо перенести только собственно файл OCX, содержащий этот ActiveX-компонент.

Разумеется, после переноса этот файл OCX необходимо зарегистрировать при помощи программы RegSvr32.exe примерно так

regsvr32.exe C:\Windows\System32\Имя_файла.OCX

Здесь вместо текста "Имя_файла" надо написать реальное имя Вашего файла OCX. Файлы OCX, как правило, кладут в директорию System32. Исходя из этого, и написана команда. Но Вы вполне можете положить файл OCX в любое другое место. Соответственно, надо будет подкорректировать команду регистрации.

Любая попытка прямого программного (из файла PRG) создания данного ActiveX-компонента потребует наличия на машине клиента лицензии.

Впрочем, это правило относиться только к тем ActiveX-компонентам, которые созданы собственно Microsoft. Если Вы покупали ActiveX-компонент у стороннего разработчика как отдельный продукт, то Вам следует уточнить у продавца правила распространения программ, использующих данный ActiveX-компонент.

Как перевести координату в пикселях (Pixcels) в твипы (Twips)

Проблема

Многие ActiveX компоненты требуют для указания в качестве параметров своих методов координаты в твипах (Twips), но FoxPro дает координаты в пикселах (Pixcels). Как перевести одно в другое?

Решение

Для того, чтобы каждый раз не пересчитывать коэффициенты заново, создайте свойства nTwipX и nTwipY для хранения переводных коэффициентов по X (по вертикали) и по Y (по горизонтали) соответствеенно.

Тогда следующий код следует выполнить в событии Init того объекта, где созданы эти свойтсва.

  
 * Следующие API функции используются для расчета переводного коэффициента    
  DECLARE INTEGER GetActiveWindow IN WIN32API    
  DECLARE INTEGER GetDC IN WIN32API INTEGER iHDC    
  DECLARE INTEGER GetDeviceCaps IN WIN32API INTEGER iHDC, INTEGER iIndex    
        
  LOCAL liHDC    
  liHDC = GetDC(GetActiveWindow())    
  This.nTwipX = 1440/GetDeviceCaps(m.liHDC,88)    
  This.nTwipY = 1440/GetDeviceCaps(m.liHDC,90)    
        
 * Освобождение контекста устройства, для освобождения памяти    
  DECLARE INTEGER ReleaseDC IN WIN32API INTEGER, INTEGER     
  =ReleaseDC(GetActiveWindow(),m.liHDC)

Здесь This.nTwipX и This.nTwipY - это как раз те самые коэффициенты перевода из пикселей в твипы. В данном случае оформлены как дополнительные свойства объекта.

  
  Координата_по_Х_в_твипах = This.nTwipX * координата_по_X_в_пикселях   
  Координата_по_Y_в_твипах = This.nTwipY * координата_по_Y_в_пикселях

В большинстве случаев, эти коэффициенты равны 15

Данный код несколько избыточный в части использования функции GetActiveWindow(). Дело в том, что эта функция возвращает, так называемое HWND-окна (некий числовой идентификатор окна).

Но все дело в том, что многие ActiveX имеют свойство, возвращающее значение их HWND, а, начиная с версии Visual FoxPro 7.0, такое свойство имеют и формы собственно FoxPro. Т.е. Вы можете вместо функции GetActiveWindow() напрямую использовать свойство HWND нужного объекта. Впрочем, и в таком виде данный код вполне работоспособен.

Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
Генерация пароля