OPLのアーカイブ
見よう見真似でOPX作成(笑)
- 2006/7/3 月曜日 19:21:08
- OPL
Arjen’s OPX Development Pagesで公開されているOPXのソースコードや、OPXs from the C++ viewを参考に、ちまちまやってみたら単純な動作*1をするOPXを作る事ができました\(^0^)/
まあ見よう見真似でやっただけなので作り方のまだ具体的な説明はできませんが(汗)、現状手の届く範囲で一通りの事は今の環境でできるということが判りました。まー、がんばれば何とかなるもんですね(笑)。久しぶりに勉強したって感じで満足満足。
さて、次はシリアル通信関係*2でも見ようかなと思います。って、シリアル通信は今までに全くやったことがないので未知の世界だったりしますが…。
このエントリをTwitterで紹介する - コメント: 0
- トラックバック(閉): 0
メモ帳データの読み取りに失敗orz
ぼへ~っとメモ帳の保存データをバイナリデータで眺めていたら、OPLで作成したデータベースファイルと内部構造が似ているので、OPLからデータを参照できるのでは!?とか希望を抱いて実験してみましたがみごとに失敗…orz。どうもフォーマットが違うみたいですね。同じようにスケジュールや電話帳のデータも試しましたがいずれも×。世の中そんなに甘くないかぁ(意味不明)。これが上手くいけばCSVで保存とかPCとM1000でインポート、エクスポートができて楽しいことになりそうだったのですが。
ちなみに実機上のデータをエミュレータにコピーしたら見事に使えました。これでいちいちエミュ上でデータを作らなくても良くなりました(^^)。エミュはよく落ちるけど意外と素直に挙動してくれるので偉いですねw
このエントリをTwitterで紹介する - コメント: 0
- トラックバック(閉): 0
データベースは使えそうです
- 9:06:57
- OPL
まだ触りしかやってませんが、M1000上のOPLでデータベースが使えそうです(動作だけ確認)。自分は全くデータベースを触った事が無いのですが、これが使いこなせられればOPLでできることの幅がぐっと広がりそうですね(^^)。ちなみに標準コマンドよりも「data.opx」を使った(併用した)方が使い勝手は良さそうです。
以下サンプル。(特に説明無し;)
INCLUDE “Data.oxh”
PROC main:
if exist(“c:\TestDB”)
delete “c:\TestDB”
endif
ODbStartTable:
ODbTableField:(“name”, KODbColText&, 25)
ODbTableField:(“age”, KODbColInt32&, 0)
ODbTableField:(“memo”, KODbColInt32&, 0)
ODbCreateTable:(“C:\TestDB”,”TestTbl”)
ODbOpen:(2, “C:\TestDB SELECT name,age,memo FROM TestTbl”, “$&&”)
BEGINTRANS
INSERT
C.F1$ = “Name”
C.F2& = 11
C.F3& = 105
PRINT C.F1$,C.F2&,C.F3&
PUT
COMMITTRANS
CLOSE
GET
ENDP
このエントリをTwitterで紹介する - コメント: 0
- トラックバック(閉): 0
OPLでテキストファイルを読み込む方法
- 2006/6/29 木曜日 9:31:53
- OPL
テキストファイルの出力ができたので今度は入力にチャレンジしてみました。
テキストファイル(Unicode&CRLF)を読込む時はIOOPENのフラグを「$0220」にします。これは「$0200」がランダムアクセスを、「$0020」がテキストタイプを示します。ちなみに「$0200」を付けないとアクセスした瞬間(読み込みでも)に落ちます;;
以下、サンプルコード。
(TestFile.txt[Unicode])
One
Two
Three
PROC main:
LOCAL h%
LOCAL ret%
LOCAL s$(255)
PRINT IOOPEN(h%,”C:\TestFile.txt”,$0220)
ret% = IOREAD(h%,ADDR(s$)+2,255)
POKEB ADDR(s$),ret%
PRINT s$,ret%
ret% = IOREAD(h%,ADDR(s$)+2,255)
POKEB ADDR(s$),ret%
PRINT s$,ret%
ret% = IOREAD(h%,ADDR(s$)+2,255)
POKEB ADDR(s$),ret%
PRINT s$,ret%
PRINT IOCLOSE(h%)
GET
ENDP
IOREADコマンドの第3引数は「指定バイト数」ではなく「読み込み可能な最大バイト数」なので注意です。このコードで対象テキストファイルを一行ずつ読み込みます。変数への読込先は書き込み時と同じように文字列変数の3バイト目以降に書き込む必要があります。書き込んだ後は1バイト目に文字数(IOREADコマンドの戻り値)を書き込みます*1。
なお上記方法だとOPLの配列要素数の上限が「255」の為に一行が256文字以上のテキストファイルに対応していません。この辺はいろいろと工夫する必要があると思われます。
バイナリタイプのファイルIOはOPLのみで完結するようにすれば、文字列型のフォーマット(先頭1バイト)にさえ気をつければ特に問題がないと思いますので、必要になった時に実験しようかと思います。
これでだいたいアプリケーションを作成するのに必要最低限の要素がそろったと思います。あとはゴリゴリとコーディングするだけですね(笑)。
しかし、まだ「データベース」と「OPX」関係の話がまだ残ってたりします。これらは使いこなせられればOPLで実現できる事が大幅に広がると思われますので、まとめしだいエントリしていきたいと思います。
*1:ちなみに日本語等の倍角文字をPRINTで表示したい場合は2倍した値を書き込むと正常に表示します。が、この場合はメモリ上のゴミデータ等に注意。
このエントリをTwitterで紹介する - コメント: 0
- トラックバック(閉): 0
OPLでテキストファイルを出力する方法
- 2006/6/28 水曜日 14:02:18
- OPL
やっとOPLでテキストファイル(Unicode)を出力する方法が見つかりました(汗)。というか正確にはIOWRITEコマンドで先頭1バイトに文字数を出力させない方法ですね。
IOWRITE(h%,ADDR(s$)+2,LEN(s$)*2)
このように対象文字列の3バイト目から出力するようにすると文字列のみをファイルに出力してくれます。どうもテキスト出力で不要なデータは先頭1バイトではなく2バイトだったようです。なお出力される文字コードは「Unicode」です。1文字2バイトの為に出力サイズは文字列の長さの2倍に設定する必要があります。
で、出力ファイルをWindows上で素直にテキストファイル(Unicode)として扱う為のサンプルコードを晒しておきます。Unicodeは先頭2バイトにBOM(Byte Order Mark)として「FFFE」を付ける必要があります。また改行コードは「CRLF=0D000A00(4バイト)」になります。(これらのコード上とファイル上でのバイトの並び順に注意)
PROC main:
LOCAL h%,s1$(10),s2$(10),bom%,crlf&
s1$ = “一行目”
s2$ = “二行目”
rem — BOM(FFFE) —
bom% = $FEFF
rem — CRLF(0D000A00) —
crlf& = &000A000D
rem — New File Open —
IOOPEN(h%,”C:\Test.txt”,$0001)
IOWRITE(h%,ADDR(bom%),2)
IOWRITE(h%,ADDR(s1$)+2,LEN(s1$)*2)
IOWRITE(h%,ADDR(crlf&),4)
IOWRITE(h%,ADDR(s2$)+2,LEN(s2$)*2)
rem — File Close —
IOCLOSE(h%)
GET
ENDP
●余談
実はファイルオープンでテキストモードが存在する事も判明したのですが、テキストモード時にIOWRITEコマンドで文字列を出力すると、なぜか最後に「A0(いわゆるLF)」をご丁寧に付けてくれる*1ので(涙)上記サンプルのようにバイナリモードで強引にテキストファイルを出力するような方法をとりました。ただ上記の方法だとただの数字を出力する時もいちいち文字列かして出力しないといけないので面倒ですが…むー。
ちなみにテキストモードでファイルを開きたい場合はIOOPENコマンドの第3引数に「$0020」を足して下さい。
*1:テキスト時とバイナリ時で挙動が変わる。
このエントリをTwitterで紹介する - コメント: 0
- トラックバック(閉): 0
- 検索
- フィード
- メタ情報