Delphi XE5 / Windows7で開発しています。
OPOS(Open Point of Service)技術協議会準拠の「つり銭機」を制御するOCX(POSCashChanger.OCX)があります。
VC++6、VB6、VS2005には対応しているそうです。
このOCXを「コンポーネントのインポート」−「ActiveXコントロールの取込」からDelphiに登録しました。
取り込んだ「ActiveX」のパレットページに「TOPOSCashChanger」が生成されて、そのコンポーネントをフォームに貼り付けました。
ここまでは問題ないようにみえます。
ただ、そのコンポーネントを使用して以下のようにOPOSに準拠した開局処理のコードを書いたのですが、「Claimed」「DeviceEnabled」「DataEventEnabled」「FreezeEvents」がエラーになります。
「'TOPOSCashChanger'は'DeviceEnabled'という名前のメンバーを含んでいません」と表示されます。
procedure TFMain.CashChangerStart; //開局処理
var
lngRet,pRc: Integer;
begin
pRc := 0;
OPOSCashChanger1.Open('CashChanger',pRc); //Openメソッドの実行
OPOSCashChanger1.ClaimDevice(10000,pRc); //ClaimDeviceメソッド 排他アクセス権獲得
If OPOSCashChanger1.Claimed = False Then
begin
//プロパティの設定
OPOSCashChanger1.DeviceEnabled := True; //Deviceの有効化
OPOSCashChanger1.DataEventEnabled := True;
OPOSCashChanger1.FreezeEvents := False;
end;
end;
OCXを取り込んだときに生成されたと思われる「OposCashChanger_COO_TLB」というファイルをみると以下のような行があるのでメンバーになっていると思うのですが....
このあたりの知識がありません。
property Claimed[out pClaimed: WordBool]: WordBool readonly dispid 14;
function DeviceEnabled(out pDeviceEnabled: WordBool): WordBool; dispid 17;
function DataEventEnabled(out pDataEventEnabled: WordBool): WordBool; dispid 16;
function FreezeEvents(out pFreezeEvents: WordBool): WordBool; dispid 18;
これは何か回避方法があるのでしょうか?
それとも単にこのOCXがDelphiに対応していないため使用できないとうことなのでしょうか?
全く詳しく無いのですが、OposCashChanger_COO_TLBを見る限り、
DeviceEnabled,DataEventEnabled,FreezeEventsはfunctionとなっているので、
OPOSCashChanger1.DeviceEnabled(True); //Deviceの有効化
のようにするのではないでしょうか?
上記のようにプロパティではなく、メソッドかと思いきや、
仕様書
https://www.microsoft.com/ja-jp/business/industry/retailjapan.aspx#OPOS
に、DeviceEnabledプロパティと書かれていますね。
なんでだろ?
そのocxを販売している会社に問合せしたほうが良いのではないでしょうか?
レスありがとうございます。
「DeviceEnabled」自体が「未定義の識別子」となってますのでDeviceEnabled(True)としてもだめなようです。
そもそもマニュアルを見るとDeviceEnabledは単にTrue、FalseをセットするプロパティのはずなんですがOCXを登録した際にできるOposCashChanger_COO_TLBではfunctionになってしまっているんです。
openメソッドもパラメータはマニュアルでは機種名とひとつだけなのですがOposCashChanger_COO_TLBでは
function Open(const DeviceName: WideString; out pRC: Integer): HResult;
みたいにパラメータが2つになっています。
「Claimed」「DeviceEnabled」「DataEventEnabled」「FreezeEvents」がメンバーでないと表示される件はOposCashChanger_COO_TLBの内容をみると
IOPOSCashChangerDisp = dispinterface
の下には確かに以下のような定義がみられるのですが
property Claimed[out pClaimed: WordBool]: WordBool readonly dispid 14;
function DeviceEnabled(out pDeviceEnabled: WordBool): WordBool; dispid 17;
function DataEventEnabled(out pDataEventEnabled: WordBool): WordBool; dispid 16;
function FreezeEvents(out pFreezeEvents: WordBool): WordBool; dispid 18;
TOPOSCashChanger = class(TOleControl)
以下をみますと確かにそこには「Claimed」「DeviceEnabled」「DataEventEnabled」「FreezeEvents」が定義されていませんでした。
色々と??な状態です。
*.idlファイルがもしあるなら、
http://mrxray.on.coocan.jp/Delphi/CompoInstall/TypeLibraryDD.htm#02
を参考に、*.idlから*.tlbを生成できるようです。
# ocxを販売している会社に聞くのが一番良いのですが...
# delphiで作らなくてよいのなら、VCでもVBでも
> *.idlファイルがもしあるなら、
> http://mrxray.on.coocan.jp/Delphi/CompoInstall/TypeLibraryDD.htm#02
> を参考に、*.idlから*.tlbを生成できるようです。
ありがとうございます。調べてみます。
> # ocxを販売している会社に聞くのが一番良いのですが...
提供元に聞いてみたのですがDelphiでの使用を確認していないのでわからないということでした....
> # delphiで作らなくてよいのなら、VCでもVBでも
Delphiで開発済みのソフトへの機能追加なのでそのようにもできず...
c++のヘッダファイルと生成された*.pasを比較してみるしかないかな...
プリフィックスに T が付くのは Delphi用のクラスの定義です.
それがない場合は,プリフィックスが I のインターフェイスの定義が使用できる可能性があります.
以下はその例ですが,これはタイプライブラリの取り込みで作成した pas ファイルのコードによります.
つまり,ケースバイケースです.
IShellDispatch インターフェイスの例
[コンポーネントラッパーを生成しない場合]
http://mrxray.on.coocan.jp/Delphi/CompoInstall/TypeLibraryD2009.htm#04
IActiveDesktop インターフェイスの例
[07_IActiveDesktop を使用したデスクトップの壁紙の変更]
http://mrxray.on.coocan.jp/Delphi/plSamples/S02_SystemParametersInfo_Destop.htm#07
IShellItemArray インターフェイスの例
[09_Windows 8 以降の壁紙スライドショー - IDesktopWallpaper]
http://mrxray.on.coocan.jp/Delphi/plSamples/S02_SystemParametersInfo_Destop.htm#09
> IOPOSCashChangerDisp = dispinterface
インターフェイスのオブジェクトとして,変数の型に使用できるのは
xxxDisp ( = dispinterface ) ではない,IUnkonwn 型か IDispatch 型です.
一応,念のため,
皆様、いろいろとご助言ありがとうございます。
メーカーから提供されているOCXはあきらめて、OPOS技術協議会のサイトからダウンロードしたOCXをインポートしたところ問題なく登録できました。
このOCXで基本的な機器制御はできることを確認しました。
今後メーカー提供のOCXとの違いを確認しながら作業を進めようと思います。
これでいったん解決とさせていただきます。
重ねてありがとうございました。
ツイート | ![]() |