特にテーマは無く雑記かな。 最近は自分用メモが増えてきましたけど。
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


HSP2.61の小技その2
2006年04月03日 (月) | 編集 |
HSP2.61の小技その2という事で、今回はリストボックス内の文字を追加したり削除したりする方法を紹介します。
objprm命令でも内容を変更する事はできますが、変更するとフォーカス(選択状態)が解除されてしまったりちょっと不便ですが、これで解決できます。
また、任意のフォーカスに変更する事もできます。

それではHSP2.61についての記事ですが、宜しければ続きをどうぞ。

さて今回はobjsend命令を使います。
良く分かっていない人がobjsend命令を使おうとすると「何これ何やってるの?」と思うでしょうけど、とりあえずそういう話は置いておくとしましょう。
使えれば良いという事で。

とはいっても、使い方だけでも説明しづらいので、具体的なスクリプトを示して説明していきます。まずは実際にスクリプトを実行して、操作してみて下さい。
#define LB_ADDSTRING $180 ; 項目追加
#define LB_INSERTSTRING $181 ; 項目挿入
#define LB_DELETESTRING $182 ; 項目削除
#define LB_RESETCONTENT $184 ; 内容をクリア
#define LB_SETCURSEL $186 ; フォーカス位置設定
#define LB_GETCURSEL $188 ; フォーカス位置取得
#define LB_GETTEXT $189 ; 文字列取得
#define LB_GETTEXTLEN $18A ; 文字列長取得
#define LB_GETCOUNT $18B ; アイテム数取得
#define LB_SELECTSTRING $18C ; 文字列選択
#define LB_ERR -1 ; エラー
#define LB_ERRSPACE -2 ; 領域確保エラー

#define EM_SETREADONLY $CF ; 書き込み禁止

    screen 0,640,480,0:cls 1
    pos 0,0:objsize 320,240:listbox listselect,100,"abc\ndefg\nhijkl\nmnopqr\nstuvwxy":idlistbox=stat
    sdim smessage,16
    pos 320,0:smessage="やること":mesbox smessage,320,20,2
    pos 320,20:objsize 320,24:combox comselect,100,"項目追加\n項目挿入\n項目削除\n内容をクリア\nアイテム数取得\nフォーカス位置設定\nフォーカス位置取得\n文字列長取得\n文字列取得\n文字列選択"
    pos 320,60:smessage="項目位置":mesbox smessage,320,20,2:idtargetlinemes=stat
    pos 320,80:input targetline,60,24:idtargetline=stat
    pos 320,120:smessage="項目内容":mesbox smessage,320,20,2:idinputstrmes=stat
    pos 320,140:sdim inputstr,256:input inputstr,320,24:idinputstr=stat
    pos 320,180:objsize 80,24:button "実行",laction
    sdim outputstr,256
    nowcomselect=-1
    goto lmainloop

*laction
    if comselect==0{ ; 項目追加
        objsend idlistbox,LB_ADDSTRING,0,inputstr,0
        if stat==LB_ERR:dialog "失敗しました":goto lmainloop
        if stat==LB_ERRSPACE:dialog "保存スペースを確保できません":goto lmainloop
        dialog "項目を追加しました"
    }
    if comselect==1{ ; 項目挿入
        objsend idlistbox,LB_INSERTSTRING,listselect,inputstr,0
        if stat==LB_ERR:dialog "失敗しました":goto lmainloop
        if stat==LB_ERRSPACE:dialog "保存スペースを確保できません":goto lmainloop
        dialog "項目を挿入しました"
    }
    if comselect==2{ ; 項目削除
        lprm=0:objsend idlistbox,LB_DELETESTRING,listselect,lprm,1
        if stat==LB_ERR:dialog "指定した値が有効ではありません":goto lmainloop
        dialog "項目を削除しました"
    }
    if comselect==3{ ; 内容をクリア
        lprm=0:objsend idlistbox,LB_RESETCONTENT,0,lprm,1
        dialog "内容をクリアしました"
    }
    if comselect==4{ ; アイテム数取得
        lprm=0:objsend idlistbox,LB_GETCOUNT,0,lprm,1
        if stat==LB_ERR:dialog "失敗しました":goto lmainloop
        dialog "アイテム数は "+stat+" です"
    }
    if comselect==5{ ; フォーカス位置設定
        wprm=targetline:int wprm
        lprm=0:objsend idlistbox,LB_SETCURSEL,wprm,lprm,1
        if stat==LB_ERR:dialog "エラーが発生しました":goto lmainloop
        dialog "フォーカス位置を設定しました"
    }
    if comselect==6{ ; フォーカス位置取得
        lprm=0:objsend idlistbox,LB_GETCURSEL,0,lprm,1
        if stat==LB_ERR:dialog "選択されていません":goto lmainloop
        dialog "フォーカス位置は "+stat+" です"
    }
    if comselect==7{ ; 文字列長取得
        lprm=0:objsend idlistbox,LB_GETTEXTLEN,listselect,lprm,1
        if stat==LB_ERR:dialog "不正なインデックスです":goto lmainloop
        dialog "文字列長は "+stat+" です"
    }
    if comselect==8{ ; 文字列取得
        objsend idlistbox,LB_GETTEXT,listselect,outputstr,0
        if stat==LB_ERR:dialog "有効なインデックスではありません":goto lmainloop
        dialog "取得した文字列は\n"+outputstr+"\nです"
    }
    if comselect==9{ ; 文字列選択
        wprm=targetline:int wprm
        objsend idlistbox,LB_SELECTSTRING,wprm,inputstr,0
        if stat==LB_ERR:dialog "該当文字が存在しません":goto lmainloop
        dialog "文字列の存在する位置は "+stat+" です"
    }
    goto lmainloop

*lmainloop ; inputの書き込み禁止を設定・解除
    wait 1
    if comselect!=nowcomselect{
        if comselect==0{ ; 項目追加
            title "項目の文字列",idinputstrmes
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,0,lprm,1
        }
        if comselect==1{ ; 項目挿入
            title "項目の文字列",idinputstrmes
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,0,lprm,1
        }
        if comselect==2{ ; 項目削除
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==3{ ; 内容をクリア
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==4{ ; アイテム数取得
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==5{ ; フォーカス位置設定
            title "フォーカス位置",idtargetlinemes
            lprm=0:objsend idtargetline,EM_SETREADONLY,0,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==6{ ; フォーカス位置取得
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==7{ ; 文字列長取得
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==8{ ; 文字列取得
            lprm=0:objsend idtargetline,EM_SETREADONLY,1,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,1,lprm,1
        }
        if comselect==9{ ; 文字列選択
            title "検索インデックス",idtargetlinemes
            title "検索文字列",idinputstrmes
            lprm=0:objsend idtargetline,EM_SETREADONLY,0,lprm,1
            lprm=0:objsend idinputstr,EM_SETREADONLY,0,lprm,1
        }
        nowcomselect=comselect
    }
    goto lmainloop
#define命令が分からないと何も分からないでしょうから、簡単に説明を。
例えば「#define LB_ADDSTRING $180」と書いてあったら、それ以降の「LB_ADDSTRING」を「$180」に置き換える、という意味です。
ちなみに「$180」は16進数表示で「384」の事です。具体的な数字を表しているのだと思っておけば十分です。
いちいち#define命令を書きたくなければ、objsend命令で使う引数を、具体的な値に置き換えてしまっても問題ありません。

それではスクリプトでやっている事を簡単に説明します。これらの処理は、*lactionへ飛んだ先で行っています。
「項目追加」は、リストの一番下に項目を追加します。
「項目挿入」は、指定した場所へ項目を挿入します。
「項目削除」は、選択された項目を削除します。
「内容をクリア」は、全ての項目を削除します。
「アイテム数取得」は、現在のアイテム数を取得します。
「フォーカス位置設定」は、指定した項目を選択状態にします。
「フォーカス位置取得」は、選択状態となっている項目が何かを取得します。通常は変数(この場合はlistselect)の値と一致します。
「文字列長取得」は、選択された項目の文字列の長さを取得します。
「文字列取得」は、選択された項目の文字列を取得します。
「文字列選択」は、指定した文字列の項目を、指定した位置から下へ順に検索していきます。そして該当する項目が見つからない場合は、statに-1が代入されます。

ループの中では、使用しない引数についての入力ボックスを、書き込み禁止に設定しているだけです。リストボックスの処理は、ここではやっていません。
余談ですが、mesboxによるオブジェクトの文字列の書き換えにtitle命令を使用していますが、objprm命令を使うとフォーカスが移動してしまうので、これを避ける為に使用しています。

objsend命令は、第4引数を変数としないといけないので、いくらlprm=0としていても、lprmを0と置き換えてはいけません。エラーになってしまいます。
これは、場合によっては変数のポインタを用いる事がある為なのですが、分からなければそういうものだと思えばとりあえず良いとは思います。

それぞれの操作方法はobjsend命令で各操作を行う事ができます。
分かり辛いスクリプトですけど、とりあえず実行して確かめてみると良いかもしれません。
ここで一つ厄介なのは、ここで紹介した方法でフォーカス位置を設定した場合、変数(この場合はlistselect)へは反映されないという事です。
その場合でも、ここで紹介したフォーカス位置を取得する方法で調べれば、正確な値が取得できます。

リストボックスの表示内容を書き換えている最中にチラつかないよう、描画/非描画を設定する事もできます。
#define WM_SETREDRAW $00B ; 描画指定
    lprm=0:objsend idlistbox,WM_SETREDRAW,wprm,lprm,1
このスクリプトで、wprm=0とすると非描画となり、wprm=1とすると描画されるようになります。
ちょうど、redraw命令と同様だと考えれば良いと思います。

以上の小技はリストボックスについて書きましたけど、コンボボックスでもほぼ同じ手順で同じ様な事が出来ます。

ちなみにこの記事で紹介した方法は、
WisdomSoft - リストボックス
ここを参考にしました。このページの具体的な言語はC言語ですが、APIの参考とするにはC言語の記事でも大体は使えるので。

つまり私は、HSP2.61用に書き直しただけなんですね、実は。
まぁC言語が見たくも無い人向けという事で。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。