昨年、Marksheet Reader Seconic SR-3500を入手し、汎用の読み取りソフトを 書きました。プログラムからOMRAPI.DLLを呼び出せば良いようです。やったこ とがないので、ちょっと困りました。 手順は、Sekonicから提供されているOMRAPI.HをDelphiに書き換えます。ヘッ ダファイルはCで書かれています。 大昔、Cは本を読んだだけで、細かい文法が分かりません。なつかしの林晴比 古氏は、まだご活躍中で、「新訂新C言語入門」という本を買ってきました。 Visual Basic, Visual C#, C++, Delphiのコマンド対照本では、「Windowsプ ログラミング逆引きクロス大辞典」を買いました。まあ、安心感です。 何ページにもわたるヘッダは簡単にDelphiに書き換えられません。変換ソフト はないか探しました。ありました。http://www.drbob42.com/ です。早速、使 わせてもらいました。見事に変換できますが、コンパイルできません。エラー だらけです。ヘッダーが大きすぎてうまく動作しないようです。 ヘッダは定義とか関数だけです。Delphiでは以下のようになります。かなりの 部分、手で直しました。 ....定義が数ページ続きます。 const SR_SUCCESS = 0; SR_UNSUCCESSFUL = 1; SR_DISCONNECTED = 2; .... type OMR_MARK_INFO = record xtype: LongInt; rows: LongInt; cols: LongInt; end {tagOMR_MARK_INFO}; .....読み取る関数、適当に書き直したもの。動くようです。 function OMR_GetMarks(iPage: Integer; var pMarkInfo: OMR_MARK_INFO; pMarks: PChar): boolean; stdcall ; external ' OMRAPI.dll'; Cに書き直したヘッダファイルをGroval_OMRAPI.PASとしてプロジェクトファイ ルにincludeし、メインプログラムから次のようなコマンドで読み出します。 if not OMR_GetMarks( SR_PAGE_FRONT, mark_info, marks ) then begin ShowMessage('マークデータの取得に失敗しました。'); OMR_Terminate; end; プログラムを一時停止し、marksの値を調べると、ちゃんと所定の文字列が入 っています。成功しました。まあ、2週間ほど、真剣に悩んで楽しかったです。 プログラムが完成、マークシートも調査用のオリジナル版を作成し、半年ほど 放置していました。調査も終了、さあ、自動入力だとソフトを動かすと、動き ますが、まったく読み取りません。いや読み取るのですが、まともではありま せん。プログラムを一時停止して調べると、nulの文字列がいくつも欠けてい ます。コラムとローがずれてしまいます。解決不能です。 原因は、Delphi 2009でコンパイルしたためでした。Delphi 2007でコンパイル すると、正常動作しました。配布元、http://www.codegear.com/jp にDelphi 2007と2009の違いを聞くと、文字の扱うがUnicodeになったことらしいです。 SR-3500はUSB対応で、USBから文字列を読み取ります。ここでエラーが起こる わけです。この件はSekonicに連絡し、ライブラリのUnicode対応を頼みました。 私には手に負えませんからね。 まとめます。Delphi2009はUnicode対応です。少なくともUSBから文字列を読み 取る時にはエラーが起こる可能性が大きいので要注意です。ファイル入出力と かは問題はありません。メーカーから提供されているライブラリがUnicode対 応でない場合が多いでしょうから、これは要注意です。 問題が解決するまで、Delphi 2009を使うのは留保し、Delphi 2007を使うこと にしました。 -------------------------------------- 村上宣寛 〒930-8555 富山市五福3190 富山大学人間発達科学部 TEL/FAX 076-445-6367 HP:http://psycho01.edu.u-toyama.ac.jp/ --------------------------------------
ここは心理学研究の基礎メーリングリストに投稿された過去の記事を掲載しているページです。