[7.3] разъясните "на пальцах" как подключать COM/OCX

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Bum
Новичок
Сообщения: 12
Зарегистрирован: 11 Август 2011, 16:22
Контактная информация:

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Bum »

Уважаемые гуру! Наконец-то появился повод в очередной раз взяться за изучение любимого когда-то Клариона, но есть одна проблема: программа должна использовать внешний компонент (фирменную библиотечку для работы с одной железякой). Однако всё использование -- просто получение данных "запрос-ответ", без особых выкрутасов, а всё остальное в проге -- классическое ДБ-приложение.

Мануал по компоненту скромно говорит (на "китайском английском"): run regsvr32 Zkemkeeper.dll, the prompt will appear to indicate that register is successful, import this control to development tool. (Please refer to actual tools application) ability to use it through simply drag and drop.

Вот я сгенерил "заготовку" App, оно накидало деревце из Майн и процедур для примари файлов... А дальше?

Буду очень благодарен за объяснение "на пальцах" -- как в 7.3 сделать это "import this control to development tool" как можно "стандартнее" и ближе к Кларионовской идеологии, чтобы потом уже спокойно заниматься БД и интерфейсом и не терять возможность юзать Апп-ген и пр. вкусности.

Описания функций и примеры на VB выглядят примерно так:
[Function]
GetStrCardNumber(BSTR* ACardNumber)
[Purpose]
Return the card number with the string style.
[Parameter]
ACardNumber: Card number.
[Return value]
Return True for success, otherwise return False.

[Example]
Dim MachineNumber As Long
Dim UserNo As Long
Dim Privilege As Long
Dim UserName As String
Dim Password As String
Dim CardNo As String
Dim Enabled As Boolean
MachineNumber = 1;
While CZKEM1. GetAllUserInfo(MachineNumber, UserNo, UserName, Password, Privilege, Enabled)
...
CZKEM1.GetStrCardNumber(CardNo)
...
Wend


Ну и код в демо-примерах не сложнее:
Public Class Device
Public axCZKEM1 As New zkemkeeper.CZKEM
Private iMachineNumber As Integer
...
AxCZKEM1.RegEvent(iMachineNumber, 65535)
...
AxCZKEM1.GetLastError(idwErrorCode)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8028
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Игорь Столяров »

Привет !

Что-то тема за здравие, а текст за упокой ...
Вот реальный пример использования сторонней OCX для записи / чтения файла в / из КПК, причем без регистрации компоненты в реестре.

Код: Выделить всё

           If Exists(Clip(Left(Loc:SoftPath)) & 'APPlusX.ocx')

              UnlockThread
              Call(Clip(Left(Loc:SoftPath)) & 'APPlusX.ocx','DllUnRegisterServer') ! перестраховка
              Call(Clip(Left(Loc:SoftPath)) & 'APPlusX.ocx','DllRegisterServer')
              LockThread

              Clear(Loc:RetValue)

              Execute Loc:VKPK
                Loc:RetValue = SendFileKPK(Clip(Left(Loc:FKPK)),'\My Documents\Personal\from4x4.zip')
                Loc:RetValue = ReadFileKPK('\My Documents\Personal\to1c.zip',Clip(Left(Loc:FKPK)))
                Loc:RetValue = SendFileKPK(Clip(Left(Loc:FKPK)),'\My Documents\Personal\tovar.txt')
              end

              UnlockThread
              Call(Clip(Left(Loc:SoftPath)) & 'APPlusX.ocx','DllUnRegisterServer')
              LockThread
           else
              Message(' В папке программы нет OCX компоненты !' ,'У нас проблема ...',Icon:Exclamation,Button:Cancel,Button:Cancel)
              Display
           end
Make Clarion Great Again ! 😎
Bum
Новичок
Сообщения: 12
Зарегистрирован: 11 Август 2011, 16:22
Контактная информация:

Re: [7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Bum »

Спасибо, Игорь,

В примере я не понял во что:
Почему именно Execute Loc:VKPK, вроде как "Loc:VKPK" это просто "A numeric expression or a variable that contains a numeric integer"... А что тогда есть VKPK? Имя созданного объекта с новым инстансом контрола? Но как и где он создан?

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

Последнее плотная работа с К у меня было ещё с ДОСовскими 2 и 3. Однако ещё тогда мне понравилась одна из главных изюминок: возможность сгенерить всю апп с помощью шаблонов, потом перегенерить какую-то изменённую часть, а потом всего лишь вставить в правильных местах по нескольку строчек кода -- и получить готовую и уже полностью "заточенную" под задачу прогу.

Так вот, как мне "идеологически верно" делать это на 7.3? А то, честно говоря, тут в 7 после "старичков" аж глаза разбегаются :)

Вот у меня есть в системе контрол PID:zkemkeeper.ZKEM.1
Теперь вроде как я должен создать в проге его объект... А как именно? В том же VB всё до жути примитивно: бросил на окно контрол, задал вызываемый PID и всё. А в К? Просто в дизайнере окна Main вставить контрол? Или где-то в эмбедах вписать "OLE,AT..." и потом "?OcxObject{PROP:Create} = 'zkemkeeper.ZKEM.1'"? (последнее тоже -- где?)
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

Re: [7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение morkovin »

Просто в дизайнере окна Main вставить контрол?
Зачем в Main?
1. Создай отдельное окно (простое Windows).
2. Помести на него контрол OLE/OCX и выбери в свойствах Object из списка нужный тебе OCX.
В сгенерированном коде у тебя будет что-то подобное

Код: Выделить всё

window               WINDOW('Тестирование OCX'),AT(,,380,210),FONT('MS Sans Serif',8,,),IMM,ICON('Graphup.ico'),STATUS(100,100,100,-1),TIMER(100),SYSTEM,GRAY,MAX,AUTO
                       OLE,AT(5,2,370,181),USE(?OLE),CREATE('iPlotLibrary.iPlotX'),COMPATIBILITY(020H)
                       END
                       BUTTON('About'),AT(6,191,45,14),USE(?Button3),HIDE
                       BUTTON('&OK'),AT(265,190,45,14),USE(?OkButton),STD(STD:Close),DEFAULT
                       BUTTON('Cancel'),AT(317,190,45,14),USE(?CancelButton)
                       BUTTON('Clear'),AT(115,191,45,14),USE(?ClearBtn)
                       BUTTON('Save prop'),AT(166,191,45,14),USE(?SaveBtn)
                       BUTTON('Show'),AT(63,191,45,14),USE(?ShowBtn),HIDE
                     END
Вместо iPlotLibrary.iPlotX' у тебя д.б. твой OCX. Ну и кнопки тоже свои.
3. На кнопку инициализации (напр, Clear) вешаешь соотв. код. Например:

Код: Выделить всё

InitPlot        ROUTINE
  !Glo:IdDataView=?Ole{'AddDataView()'}

  ?Ole{'TitleText'} =          Clip(Glo:Title)
  ?Ole{'Channel(0).TitleText'}=Clip(Glo:ChannelTitle1)
  ?Ole{'Channel(0).RingBufferSize'}=Glo:RingBufferSize
  ?Ole{'Channel(0).XAxisTrackingEnabled'} = True
  ?Ole{'Channel(0).TraceLineWidth'} = 2


  Glo:IdChannel=?Ole{'AddChannel'}
  ?Ole{'Channel(1).TitleText'}=CLIP(Glo:ChannelTitle2)
  ?Ole{'Channel(1).RingBufferSize'}=Glo:RingBufferSize
!------------
  ?Ole{'XAxis(0).Name'}= 't'
  ?Ole{'YAxis(0).Name'}= 'T'
  ?Ole{'XAxis(0).Title'} ='t(sec)'
  ?Ole{'YAxis(0).Title'} ='T(C)'
  ?Ole{'YAxis(0).Enabled'} =True
  ?Ole{'Legend(0).Enabled'}=True

  Glo:IdLimit1=?Ole{'AddLimit'}
  ?Ole{'Limit(' & Glo:IdLimit1 & ').Style'}=iplsBandY
  ?Ole{'Limit(' & Glo:IdLimit1 & ').Color'}=Color:Yellow
  ?Ole{'Limit(' & Glo:IdLimit1 & ').LineStyle'}=psSolid
  ?Ole{'Limit(' & Glo:IdLimit1 & ').FillStyle'}=bsClear
  ?Ole{'Limit(' & Glo:IdLimit1 & ').Line1Position'}=75
  ?Ole{'Limit(' & Glo:IdLimit1 & ').Line2Position'}=95
  ?Ole{'Limit(' & Glo:IdLimit2 & ').YAxisName'}='T'

  Glo:IdAxis=?Ole{'AddYAxis'}
  !Message(Glo:IdAxis,'ID Axis')

 ! ?Ole{'XAxis(1).Name'}= 't'
  ?Ole{'YAxis(1).Name'}= 'P'
  ?Ole{'XAxis(1).Title'} ='t(sec)'
  ?Ole{'YAxis(1).Title'} ='P(Mpa)'
  ?Ole{'YAxis(1).Enabled'} =True
  ?Ole{'YAxis(1).Visible'} =True

  !Glo:IdAxis=?Ole{'AddYAxis'}
  !?Ole{'YAxis(2).Name'}= 'Grid'
  !?Ole{'YAxis(2).Visible'} =True

  Glo:IdLimit2=?Ole{'AddLimit'}
  ?Ole{'Limit(' & Glo:IdLimit2 & ').Style'}=iplsBandY
  ?Ole{'Limit(' & Glo:IdLimit2 & ').Color'}=Color:White
  ?Ole{'Limit(' & Glo:IdLimit2 & ').LineStyle'}=psSolid
  ?Ole{'Limit(' & Glo:IdLimit2 & ').FillStyle'}=bsClear
  ?Ole{'Limit(' & Glo:IdLimit2 & ').Line1Position'}=45
  ?Ole{'Limit(' & Glo:IdLimit2 & ').Line2Position'}=85
  ?Ole{'Limit(' & Glo:IdLimit2 & ').YAxisName'}='P'
!-------------
 ! ?Ole{'Legend(0).ColumnTitlesVisible'}=True
  ?OLE{'DisableLayoutManager'}
!------------
  !?Ole{'DataViewZVert'}=2
  ?Ole{'YAxis(0).ZOrder'}=0
  ?Ole{'YAxis(1).ZOrder'}=0
  !?Ole{'YAxis(2).ZOrder'}=1
  

  ?Ole{'YAxis(0).StartPercent'}=0
  ?Ole{'YAxis(0).StopPercent'}=50
  ?Ole{'YAxis(0).StackingEndsMargin'}=0.25


  ?Ole{'YAxis(1).StartPercent'}=50
  ?Ole{'YAxis(1).StopPercent'}=100
  ?Ole{'YAxis(1).StackingEndsMargin'}=0.25

  !---- Link axis and channels
  ?OLE{'Channel(1).YAxisName'}='P'
  ?OLE{'DataView(0).GridYAxisName'}='T'

  ?OLE{'EnableLayoutManager'}
Ес-сно, у тебя будут другие команды для твоего OCX. Просто обрати внимание на синтаксис присвоения значений.

4. На кнопку (например,Show) повесь нужный тебе код. Например, для вышеуказанного OCX это будет

Код: Выделить всё

ShowPlotTimer ROUTINE
 IF Glo:i < 100 THEN
   glo:i=glo:i+1
   Glo:X[Glo:i]=Glo:i
   Glo:Y[Glo:i]=RANDOM(Glo:Low,Glo:High)
   ?Ole{'Channel(0).AddXY('& Glo:X[Glo:i] &',' & Glo:Y[Glo:i] & ')<39>'}
   ?Ole{'Channel(1).AddXY('& Glo:X[Glo:i] &',' & Glo:Y[Glo:i]-Random(1,10) & ')<39>'}
  ELSE
   ?Ole{'Channel(0).Clear'}
   ?Ole{'Channel(1).Clear'}
   Glo:i=0
  END
Ес-сно, у тебя будут другие команды для твоего OCX. Просто обрати внимание на синтаксис использования методов объекта OCX.

З.Ы. Заголовок темы правильнее было бы назвать " ... как подключать OLE/OCX". Подключение COM - отдельная "песня".
WBR, morkovin
Аватара пользователя
morkovin
Ветеран
Сообщения: 935
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 4 раза
Контактная информация:

Re: [7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение morkovin »

Помести на него контрол OLE/OCX и выбери в свойствах Object из списка нужный тебе OCX.
В С8 немного подругому: Properties ->ControlType ->ServerName
WBR, morkovin
Аватара пользователя
AlexSmile
Посетитель
Сообщения: 46
Зарегистрирован: 14 Ноябрь 2005, 20:38
Откуда: Молдавия

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение AlexSmile »

Добрый день всем.
Поднимаю тему.
Есть сторонняя ocx ( CasScale.ocx) в ней есть ряд процедур.
Например
Long ConnectionEx3 (string Scale IP, long Scale Port, integer ScaleID, long Scale Model,
string ScaleVersion, long DataType)
Я посмотрел ответ ув. Игорь Столяров где он указал способ подключения.
!***************Цитата 2ой пост в данной теме******************
Call(Clip(Left(Loc:SoftPath)) & CasScale.ocx','DllRegisterServer')
Execute Loc:VKPK
Loc:RetValue = ConnectionEx3(......)
!***********************************************************************
Не подскажите что такое Execute Loc:VKPK?
Как подключить данную ocx компоненту?
Спасибо.
Прошу прощения за предыдущий пост. Не получается его удалить.
Александр
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8028
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Игорь Столяров »

AlexSmile писал(а): Не подскажите что такое Execute Loc:VKPK
Просто выбросьте это из примера (это переменная "вид КПК (ископаемый смартфон)" которая определяла запуск передачи данных с использованием OCX компоненты). :) Т.е. просто регистрируете компоненту и можете вызывать ее методы.
Make Clarion Great Again ! 😎
Аватара пользователя
AlexSmile
Посетитель
Сообщения: 46
Зарегистрирован: 14 Ноябрь 2005, 20:38
Откуда: Молдавия

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение AlexSmile »

Спасибо за быстрый ответ.
Что я сделал. В папке на диске d:\1 есть эта компонента.
Вот код
Call('d:\1\CasScale.ocx','DllRegisterServer')
loc:rez = ConnectionEx3('10.0.0.65','20304',-1,5200,'2.94.4,1.5,0',217)
При компиляции Clarion 8 ругается на Unknowun Function label.
Пробывал и regsvr32 d:\1\CasScale.ocx. Тоже не работает.
Может ее еще надо гденибудь добавить в коде?
Уважаемый Игорь помогите еще раз.
Спасибо.
Александр
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8028
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Игорь Столяров »

AlexSmile писал(а): ConnectionEx3('10.0.0.65','20304',-1,5200,'2.94.4,1.5,0',217)
Не ну естественно ! ConnectionEx3 - не описана в MAP и не известна компилятору.
Нужно инициализировать ОСХ и вызывать метод, через обращение к нему.
Что-то вроде ?MyOCX(ConnectionEx3(...)). Точно также как работаем с методами при передачи данных, через OLE в MS Excel.
Но для каждого OCX - там свои фишки. В примерах Clarion (по крайне мере 6.3) был Source c примерами работы и просмотром
доступных для вызова методов OCX. А вообще - это путь муторный. Если есть возможность не работать с OCX из Clarion - не работай ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
AlexSmile
Посетитель
Сообщения: 46
Зарегистрирован: 14 Ноябрь 2005, 20:38
Откуда: Молдавия

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение AlexSmile »

Добрый день всем.
В общем я с компонентой ocx поковырялся и она у меня заработала.
Что я сделал. Зарегистрировал ее.

Код: Выделить всё

DATE
loc:ole long
loc:rez long
CODE

loc:ole=create(0,CREATE:Ole) 
loc:ole{Prop:Create}='CAS.LABELSCALE'
loc:ole{Prop:ReportException}=TRUE 
loc:rez = loc:ole{'ConnectionEx3("10.0.0.66",20304,-1,5200,"2.94.4,1.5,0",218)'}
sleep(50)
MESSAGE(loc:rez,'connect') 
loc:rez = loc:ole{'SendDataString("10.0.0.66", -1, 5200, "2.94.4,1.5,0",5,218,"")'}
sleep(50)
MESSAGE(loc:rez,'send')
Мне всегда в loc:rez приходит значение 1, Не важно есть ли устройство в вести или нет.
Получается что загрузить данные в устройство я могу, но если устройство не доступно, то мне об этом ничего не известно, что не позволяется мне запустить это в работу.
Производитель мне прислал пример на VisalBasic 6 и на C#.
Также указал как нужно работать с компонентой
(1) Try connection using axCasScale1.ConnectionEx3
(2) Receive the state of connection through axCasScale1_StateEvent
(3) Send PLU Data using axCasScale1.SendDataString
(4) Receive the result of sending through axCasScale1_RecvEventString
В мануале есть описанные процедуры StateEvent и RecvEventString
void RecvEventString (string ScaleIP, integer ScaleID, long Result, long TransType,long DataType, long ScaleModel, string Data)
void StateEvent(string ScaleIP, integer ScaleID, long State, string Data)

Я смотрю пример на VB6 так там код такой
1. Подключение

Код: Выделить всё

Private Function ConnectScale(ByVal sIP As String, ByVal shScaleID As Integer, ByVal nModel As Integer, ByVal sVersion As String)
    Dim nRtn As Long
    DisconnectScale sIP, shScaleID
    nRtn = CasScale.ConnectionEx3(sIP, 20304, shScaleID, nModel, sVersion, DF_DATA_PLU_V04)
    ConnectScale = nRtn
End Function
!Мой код
    loc:rez = loc:ole{'ConnectionEx3("10.0.0.66",20304,-1,5200,"2.94.4,1.5,0",218)'}
2. Получение статуса соединения. В этом и загвоздка.
Пробовал

Код: Выделить всё

DATE
loc:str string
CODE
loc:str = loc:ole{'StateEvent("10.0.0.66",-1,"","")'}
В примере на VB6 есть
//********************************************************
        nRtn = ConnectScale(sIP, shScaleID, nModel, sVersion)
       
        If nRtn > 0 Then
            sSendData = MakeIngredientDataForSend(m_sendInfo(shScaleID - 1).wdSendCount + 1)
            nRtn = CasScale.SendDataString(sIP, shScaleID, nModel, sVersion, DF_ACTION_DOWNLOAD, DF_DATA_INGREDIENT, sSendData)
        Else
            sState = "Fail connection IP: " & sIP
            WriteCommState (sState)
        End If
//********************************************
Т.е. Visual Basic 6 значением nRtn обрабатывает ошибку соединения 0 - есть 1 нет .
В момент случае всегда возвращает 1
loc:rez = loc:ole{'ConnectionEx3("10.0.0.66",20304,-1,5200,"2.94.4,1.5,0",218)'}
Значение 0 возвращает только в том случае если компонента не зарегистрирована.
Я так понял что мой loc:rez возвращает ошибку контейнера OLE/OCX а глубже я не вижу.
Подскажите пожалуйста как ответ от самой компоненты OCX?
В приложенных есть пример на VB6.
Спасибо за внимание.
Извините за много букв.
Вложения
OCX_VB6.rar
Пример работы на Visual Basic 6
(227.43 КБ) 194 скачивания
OCX_Csharp.rar
Пример работы на C#
(383.78 КБ) 185 скачиваний
Александр
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

[7.3] разъясните "на пальцах" как подключать COM/OCX

Сообщение Admin »

Правила форума
...
А так же пользуйтесь спец. тегами при вставке исходников!!!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить