HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0608
名無しListboxの文字列を変更したい5未解決


名無し

リンク

2022/6/8(Wed) 23:36:04|NO.96606

Listboxであらかじめ表示されている文字列を、(ダブルクリックが検出されるなどの時に)任意の文字列に変更したいと考えています。
これについて、inputやmesboxを使わずに行う方法はありますか?
参考にしたいのでできれば、フォルダ名の変更の原理も教えていただけると嬉しいです
お願いします



この記事に返信する


沢渡

リンク

2022/6/9(Thu) 08:54:14|NO.96608

なぜリストボックスの内容変更なのにinputやmesboxが出てくるのかよくわかりませんが、
リストボックスの内容を変更したい場合は、objprmの第2パラメータに
文字列を指定すればできます。
(ちなみに整数を指定した場合は選択されている場所を変更する)

ただし、objprmの場合だと内容全体の変更になりますので、特定の行だけを変更したいのなら
sendmsgでウィンドウメッセージを送ることになると思います。
以下、リストボックスの内容の変更・削除・追加ができるモジュールを作成してみました。

//以下の命令と関数が追加されます // //・lb_set p1,p2,p3 //p1にはリストボックスのIDを、p2にはインデックスを、p3には文字列を指定します。 //p1で指定したリストボックスのp2番目の項目の内容を、p3に変更します。 // //・lb_del p1,p2 //p1にはリストボックスのIDを、p2にはインデックスを指定します。 //p1で指定したリストボックスのp2番目の項目を削除します。 // //・lb_ins p1,p2,p3 //p1にはリストボックスのIDを、p2にはインデックスを、p3には文字列を指定します。(p2は省略可能) //p1で指定したリストボックスのp2番目に、p3で指定した文字列の項目を追加します。 //p2を省略するか-1を指定した場合はリストの最後に追加されます。 // //・lb_getc(p1) //p1にはリストボックスのIDを指定します。 //リストボックスで選択されている項目のインデックスが返ります。 //どこも選択されていない場合は-1が返ります。 //lb_delやlb_insで項目の削除や追加を行った場合、リストボックスに割り当てられた変数と //実際に選択されている項目の間に食い違いが起きる可能性があります。 //その場合はこの関数を使って選択項目を取得するようにしてください。 #module #define global lb_del(%1,%2) sendmsg objinfo(%1,2),0x0182,%2,0 //LB_DELETESTRING #define global lb_ins(%1,%2=-1,%3) ___temp=%3 : sendmsg objinfo(%1,2),0x0181,%2,varptr(___temp) //LB_INSERTSTRING #deffunc lb_set int id,int in,str _s s=_s : h=objinfo(id,2) sendmsg h,0x0182,in,0 //LB_DELETESTRING if stat=-1 : return stat //LB_ERR sendmsg h,0x0181,in,varptr(s) //LB_INSERTSTRING return stat #defcfunc lb_getc int idg sendmsg objinfo(idg,2),0x0188,in,0 //LB_GETCURSEL return stat #global



沢渡

リンク

2022/6/9(Thu) 08:57:23|NO.96609

それから二番目の「フォルダ名の変更」についてですが、WinAPIのMoveFileを使えばできるようです。
(hspext.asのfxren命令でもフォルダ名の変更ができるが、試したところMoveFileと同じ内容の様子)
参考:https://www.tokovalue.jp/function/MoveFile.htm

#include "kernel32.as" //「MoveFile 変更前の名前,変更後の名前」でファイル名を変更できる。フォルダ名の変更も可能。 //ただし、変更前と変更後で異なるディレクトリを指定した場合、ファイル(フォルダ)が移動されるので注意。 //たとえば「MoveFile "a\\hoge.txt","b\\hoge2.txt"」とした場合、 //サブフォルダ"a"の中にあるhoge.txtをサブフォルダ"b"に移動し、さらにファイル名をhoge2.txtに変更する。 //(実験したところ、hspext.asのfxren命令もMoveFileと同じ仕様だった) MoveFile "test","test2"



名無し

リンク

2022/6/10(Fri) 17:51:21|NO.96619

早速の返信ありがとうございます
私の言葉足らずで一部伝わっていないかもしれないので補足します…

ソフト上で自動的に変更ではなく、ユーザーがその場で文字を打ち込んで文字列の変更を行う動作を再現したいと考えていまして…
なのであらかじめ決まっている文字列ではないというのが厄介で対処法がわからないと言う状況です

可能であれば返信いただけると幸いです
よろしくお願いします



沢渡

リンク

2022/6/11(Sat) 19:13:21|NO.96624

追記です。
NO.96608に貼ったコードの終わりの方にある

sendmsg objinfo(idg,2),0x0188,in,0 //LB_GETCURSEL
は、以下のように置き換えてください。

sendmsg objinfo(idg,2),0x0188,0,0 //LB_GETCURSEL
お手数おかけしてすみませんでした。



沢渡

リンク

2022/6/12(Sun) 09:10:13|NO.96630

すみません、処理の効率化のために冒頭のモジュールを一部改変しましたので、
前のものは削除して上げ直します。
以下、本文を再掲します。

--------------------------------------------------

「それならinputで入力欄を作り、ボタンを押すなりEnterを押すなりしたら私のモジュールで
リストボックスの内容を変更すればいいじゃないか」…と思いましたが、
「inputやmesboxを使わずに」ということは、このやり方では駄目ということでしょうか?

「その場で文字を打ち込んで」という部分から推察しますが、
「Excelのように直接編集できるリストボックス」を作りたいということでしょうか?
直接編集、というのはちょっと調べてもわからなかったので、妥協案として
「リストボックスをダブルクリックしたら入力欄をポップアップで表示する」という線で
行ってみました。
ご要望通りのものなのかわかりかねますが、せっかく作りましたので貼っておきます。


#include "user32.as" #include "gdi32.as" //以下はポップアップ表示中に一時的に画面上のオブジェクトを消し、 //代わりにオブジェクトを模した「画像」を表示するモジュール //<使い方> //・screenでウィンドウを初期化したら、fakeobj_init p1を実行する。 //p1は内部での処理で使用するバッファの番号。 //p1は省略可能で、省略した場合は200番が指定される。 //・listbox等、オブジェクトを追加するたびに、fakeobj_add p1を実行してオブジェクトを登録する。 //p1はオブジェクトのID。 //・fakeobj_go p1で、登録したオブジェクトを一時的に消し、代わりに偽のオブジェクトを描画する。 //p1は省略可能。p1に0以外の値を指定した場合は、画面全体を描画対象にする。 //省略するか0を指定した場合は、これまでに登録したオブジェクトが存在する範囲のみが対象。 //・fakeobj_resumeで、消したオブジェクトを復活させる。 //・不要になったらfakeobj_endを実行。 #module #const objmax 100 //オブジェクトの最大数 #define ctype lower(%1,%2) ((%2)+((%1)-(%2))*((%1)<(%2))) //小さい方を返す #define ctype higher(%1,%2) ((%2)+((%1)-(%2))*((%1)>(%2))) //大きい方を返す #define global fakeobj_init(%1=200) _fakeobj_init %1 #deffunc _fakeobj_init int _buf_id boot_flag=1 : objnum=0 dim h_list,objmax buf_id=_buf_id x_min=0 : x_max=0 : y_min=0 : y_max=0 //画面書き換えの範囲 first_flag=0 dim rect,4 sel=ginfo_sel : wid=ginfo_sx : hei=ginfo_sy buffer buf_id,wid,hei : gsel sel return #deffunc fakeobj_add int objid if boot_flag=0 : return h_list(objnum)=objinfo(objid,2) GetWindowRect h_list(objnum),varptr(rect) ScreenToClient hwnd,varptr(rect) : ScreenToClient hwnd,varptr(rect(2)) if first_flag { x_min=lower(x_min,rect(0)) : y_min=lower(y_min,rect(1)) x_max=higher(x_max,rect(2)) : y_max=higher(y_max,rect(3)) } else { first_flag=1 x_min=rect(0) : y_min=rect(1) : x_max=rect(2) : y_max=rect(3) } objnum++ return #define global fakeobj_go(%1=0) _fakeobj_go %1 #deffunc _fakeobj_go int all_flag if (boot_flag=0)|(objnum=0) : return if all_flag { x=0 : y=0 : w=wid : h=hei } else { x=x_min : y=y_min : w=x_max-x_min : h=y_max-y_min } GetDC hwnd : hdc0=stat sel=ginfo_sel : gsel buf_id hdc1=hdc : BitBlt hdc1,x,y,w,h,hdc0,x,y,0x00CC0020 //SRCCOPY gsel sel : ReleaseDC hwnd,hdc0 BitBlt hdc,x,y,w,h,hdc1,x,y,0x00CC0020 : redraw 1,x,y,w,h repeat objnum : ShowWindow h_list(cnt),0 : loop return #deffunc fakeobj_resume if boot_flag=0 : return repeat objnum : ShowWindow h_list(cnt),5 : loop return #deffunc fakeobj_end if boot_flag=0 : return sel=ginfo_sel : buffer buf_id,1,1 : gsel sel objnum=0 : boot_flag=0 return #global //ここまでモジュール //このモジュールを作ったのは、ポップアップ入力中にオブジェクトをクリックすると //クリック判定が上手くいかず、ウィンドウメッセージで処理するのも手間だと思ったので。 #define global b_not(%1) ((%1)^0xFFFFFFFF) //p1のnotを返す fakeobj_init //ポップアップ用の入力欄 pop_wid=100 : pop_hei=20 //ポップアップのサイズをここで設定する _dummy_="" : input _dummy_,pop_wid,pop_hei,0 pop_h=objinfo(stat,2) //ポップアップのハンドル GetWindowLong pop_h,-16 SetWindowLong pop_h,-16,stat&b_not(0x10010000) //ウィンドウスタイルからWS_TABSTOPとWS_VISIBLEを削除し、ポップアップを隠す a=0 listbox a,,"あ\nい\nう\nえ\nお" list_h=objinfo(stat,2) //リストボックスのハンドル fakeobj_add stat //オブジェクトのフェイク表示の対象にする GetWindowLong list_h,-16 SetWindowLong list_h,-16,stat|0x1 //LBS_NOTIFYを設定し、WM_COMMANDで通知を受け取れるようにする pop_flag=0 //ポップアップを表示しているフラグ edit_h=0 //ポップアップ表示時、編集の対象となるリストボックスのハンドル edit_l=0 //ポップアップ表示時、編集の対象となるリストボックスの行 dim point,2 //カーソル位置取得に使用する dim rect,4 //リストボックスの範囲取得に使用する oncmd gosub *cmd,0x0111 //WM_COMMAND onclick gosub *click onkey gosub *key stop *cmd if ((wparam>>16)&0xFFFF)=2 { //通知がLBN_DBLCLKなら if lparam=list_h { //通知を送ってきたのがリストボックスなら edit_h=lparam sendmsg edit_h,0x0188,0,0 //LB_GETCURSEL if stat!=-1 { edit_l=stat gosub *pop_start } } } return *click if pop_flag { gosub *pop_cancel //画面のどこかをクリックしたら入力を取り消す場合。 //入力を反映する場合はこれを消して下の行のコメントアウトを外す //gosub *pop_finish } return *key if pop_flag { if wparam=13 : gosub *pop_finish //ポップアップ内を入力中にEnterが押されたら、変更を反映する。 } return *pop_start //これを呼ぶ前にedit_hにリストボックスのハンドルを、edit_lに行番号を入れておくこと sendmsg edit_h,0x18A,edit_l,0 //LB_GETTEXTLEN if stat=-1 : return sdim s,stat+1 sendmsg edit_h,0x189,edit_l,varptr(s) //LB_GETTEXT。sにリストボックスの指定行のテキストが入る sendmsg pop_h,0xC,0,varptr(s) //WM_SETTEXT。ポップアップにテキストを表示。 GetWindowRect edit_h,varptr(rect) : ScreenToClient hwnd,varptr(rect) //リストボックスの範囲を取得 fakeobj_go //オブジェクトをフェイク化 GetCursorPos varptr(point) : ScreenToClient hwnd,varptr(point) //マウスカーソル位置を取得(mouseyが上手く動作しないので) SetWindowPos pop_h,0,rect(0),point(1)-pop_hei/2,0,0,0x41 //SWP_SHOWWINDOW|SWP_NOSIZE SetFocus pop_h sendmsg pop_h,0xD5,0,0 //EM_GETLIMITTEXT sendmsg pop_h,0xB1,stat,-1 //EM_SETSEL。カーソルをポップアップの末尾に。 pop_flag=1 return *pop_finish sendmsg pop_h,0xE,0,0 //WM_GETTEXTLENGTH sdim s,stat+1 sendmsg pop_h,0xD,stat+1,varptr(s) //WM_GETTEXT。sにポップアップ内のテキストが入る sendmsg edit_h,0x0182,edit_l,0 //LB_DELETESTRING if stat!=-1 : sendmsg edit_h,0x0181,edit_l,varptr(s) //LB_INSERTSTRING *pop_cancel ShowWindow pop_h,0 //ポップアップを隠す fakeobj_resume pop_flag=0 return



ONION software Copyright 1997-2023(c) All rights reserved.