登録・編集の続き。
前回は、文字一覧を表示して、カーソルキーで文字カーソルを動かすところまで作った。
次は、文字の入力処理を作る。
表示している文字一覧と同じ構成で、余分なスペースを除いた文字列の配列を作り、カーソル座標値と合わせることで、選択中の文字を取得する方法を考えてみた。
ecsrx=0:ecsry=0 ;カーソルのXY座標変数 sdim charlist,13 ;文字列リスト配列 charlist(0)="あいうえおはひふへほ" charlist(1)="かきくけこまみむめも" charlist(2)="さしすせそや ゆ よ" charlist(3)="たちつてとらりるれろ" charlist(4)="なにぬねのわ を ん" charlist(5)="ぁぃぅぇぉゃ ゅ ょ" charlist(6)="゛゜ー" charlist(7)="ABCDE12345" charlist(8)="FGHIJ67890" charlist(9)="KLMNO+-*/終" charlist(10)="PQRST" charlist(11)="UVWXY" charlist(12)="Z@・.!"
この文字列の配列charlistの添え字をY座標にして、X座標のところの文字をstrmid命令で取得する。
これで行けると思ったのだが、strmid命令は、1バイト単位になっている。2バイト文字を処理しようと思ったら、2の倍数で指定が必要になる。
まぁいいかと、X座標を2倍した値の場所から2文字(2バイト)分、取得するように修正したが、将来的に1バイト文字との混在が発生したときに、面倒なことになる。
しかも、この後の処理で使う予定の、指定文字列内を検索して、その場所を返す、instr命令も1バイト単位。
これは面倒だと思っていたら、やっぱり先人方は、そんなところはとっくに通りすぎているのですよね。
mod_picmesでお世話になっている、しまくろねこさんが、すでにモジュールを作ってくれていた。
このモジュールを使えば、見かけ上の文字数で扱えるように命令が用意されている。
strmidに相当するdstr_mid命令や、strlenに相当するdstr_len命令、instrに相当するdstr_instr命令がある。
これで、1バイト、2バイト文字が混在した文字列でも、単純に文字数を考えればよいことになる。
ユーザ関数で、BASICでいうLEFT$、RIGHT$相当の命令を定義していたので、ユーザ関数の中で使っているstrmidをdstr_midに置き換えて、mod_dstrtベースの仕様に統一した。
これで、charlistの配列からカーソル位置の文字を取得できるようになったので、カーソル位置の文字を、編集中の名前の文字列の末尾に追加するのだが、これも単純にはいかない。
続く。