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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1123
Dreamer指定文字列を含む行の抜き出し11解決


Dreamer

リンク

2010/11/23(Tue) 17:04:53|NO.36004

何度もお世話になり、大変申し訳ありませんが、
リストの検索を実装しようと思い、Google等で調べても思うようにできないので
質問させていただきます。

リストに"テスト\nHSP\nテステス\nHotSP"と言う項目があるとして
テキストボックスに文字列を指定して実行するとリスト内にある
当確文字列の行を全て抜き出し、表示したいと思っています。

ご教示頂ければと思っております。



この記事に返信する


いかろ

リンク

2010/11/23(Tue) 18:01:51|NO.36005

効率悪いかもしれませんけど、noteとinstrを使かうのが一番確実かと。

a="test\ntes\nためし\ndooe\ntestです" SearchWord="test" notesel a Data="" repeat noteinfo(0) noteget tmp,cnt if instr(tmp,0,SearchWord)!=-1:Data+=tmp+"\n" loop print Data



hexa.hemi

リンク

2010/11/23(Tue) 18:10:35|NO.36006

note系の命令とinstrを使う以外方法が浮かびません。
スクリプト↓

cont = "テスト\nHSP\nテステス\nHotSP";リストボックスの内容 contents = cont;検索結果が入る変数 sel = 0;リストボックスで選択されている行が入る swd = "";検索する文字列 buf = "";一時的に使う変数 bwd = "x";inputの内容が変更されたか取得するためのもの notesel cont;contの変数をメモリノートパッドのバッファに設定 objsize 400, 200;リストボックスの大きさ listbox sel, 0, cont;リストボックス配置 pos 0, 200;位置変更 input swd, 200, 20, -1;検索ボックスを配置 gosub *search oncmd gosub *search, 0x111;WM_COMMANDメッセージが送られたら*searchラベルに移動 stop *search if swd != bwd {;inputの内容が変更されたら contents = "";検索結果が入る変数を初期化 if swd != "" {;検索文字列が空欄以外の場合 repeat noteinfo(0);リストボックスの内容の行数分ループをする。 noteget buf, cnt;bufにその行の内容を入れる。 if instr(buf, 0, swd) != -1 : contents += buf + "\n";検索する。 wait 0 loop } else : contents = cont;空欄の場合はすべて表示 redraw 0;redraw 1まで描画をさせない color 255, 255, 255;色を背景色にして boxf;いったん塗りつぶす。 color 0, 0, 0;色を黒に戻して pos 0, 220;位置を設定して mes contents;表示! redraw 1;描画 bwd = swd;inputの内容が変更されたか取得するための変数の内容を変更する。 } return



レノス

リンク

2010/11/23(Tue) 19:39:38|NO.36007

つ split



Dreamer

リンク

2010/11/23(Tue) 21:55:54|NO.36009

hexa.hemiさんの方法を利用させて貰おうと組み込もうとしたところ
とある問題にぶつかってしまいました。

Inputに文字を入力した途端に落ちてしまいます。
普段ならエラーがでるのですが、直ぐに消えてしまいます。

mes contents
の代わりに
objprm 0, contents
を使用しています。
これを含めると落ちてしまうようです。 タブを使用しているためオブジェクトIDが上手く取得できていないのでしょうか? タブは http://lhsp.s206.xrea.com/hsp_object6.html#1 を使用させて頂いております。



inovia

リンク

2010/11/23(Tue) 22:20:53|NO.36010

*search ラベルにあるループに wait 0 が入っています。

これを削除することで落ちないと思います。

メッセージで飛んできた処理に wait が 入っていると、
そこでメッセージの処理をしてしまい、
多数のネストが発生して落ちてしまう場合があります。
(特に、WM_COMMAND などは何回も呼び出される可能性があります)



Dreamer

リンク

2010/11/23(Tue) 22:37:55|NO.36011

>>inoviaさん
早い回答有難うございます。
しかし、inputに文字を入力すると変わらず落ちてしまうようです。



SYAM

リンク

2010/11/24(Wed) 10:49:09|NO.36015

タブ云々…ってことは、hexa.hemiさんのサンプルのやり方を組み込んだ、別のスクリプトが落ちるのですよね?



hexa.hemi

リンク

2010/11/24(Wed) 16:59:54|NO.36018

bwd = swdの部分をcontents = ""の上に移動してみてください。
それでも落ちるようでしたら、フラグを作ってリストボックスの内容の検索中には
処理をさせないようにしてみてください。



Dreamer

リンク

2010/11/24(Wed) 23:15:37|NO.36023

>>hexa.hemiさん
実行したところ落ちる事はなくなりました。
が、今度はエラーが表示されてしまいます。
やはりオブジェクトIDが上手く取得できていないのでしょうか?

以下のソースで再現致しました。

;	超低機能なタブコントロール作成モジュール (by Kpan)
#module #uselib "user32" #func GetClientRect "GetClientRect" int, int #func SetWindowLong "SetWindowLongA" int, int, int #func SetParent "SetParent" int, int #uselib "gdi32" #cfunc GetStockObject "GetStockObject" int ; CreateTab p1, p2, p3, p4 ; タブコントロールを設置します。statにタブコントロールのハンドルが ; 返ります。 ; p1〜p2=タブコントロールのX/Y方向のサイズ ; p3(1)=タブの項目として貼り付けるbgscr命令の初回ウィンドウID値 ; p4=タブコントロールの追加ウィンドウスタイル #deffunc CreateTab int p1, int p2, int p3, int p4 winobj "systabcontrol32", "", , $52000000 | p4, p1, p2 hTab = objinfo(stat, 2) sendmsg hTab, $30, GetStockObject(17) TabID = p3 if TabID = 0 : TabID = 1 dim rect, 4 return hTab ; InsertTab "タブつまみ部分の文字列" ; タブコントロールに項目を追加します。 #deffunc InsertTab str p2 pszText = p2 : tcitem = 1, 0, 0, varptr(pszText) sendmsg hTab, $1307, TabItem, varptr(tcitem) GetClientRect hTab, varptr(rect) sendmsg hTab, $1328, , varptr(rect) bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1 SetWindowLong hwnd, -16, $40000000 SetParent hwnd, hTab TabItem++ return ; タブ切り替え処理用 #deffunc ChangeTab gsel wID + TabID, -1 sendmsg hTab, $130B wID = stat gsel wID + TabID, 1 return #global ; 以下、サンプル screen , 700, 200 syscolor 15 : boxf ; タブコントロールの設置。第3パラはbgscr命令で作成するウィンドウ ; IDの初期値です。たとえば、下のように「1」でタブの項目が4個あると ; すると、1〜4のウィンドウが使われます。「2」でタブの項目が5個とすると、 ; 2〜6が使われます。別で使用するウィンドウID値と被らないよう注意。 pos 0, 0 CreateTab 700, 200, 1 ; タブつまみ切り替え時に利用するタブコントロールのハンドルを取得 hTabControl = stat ; このサンプル上ではbgscr命令で作成したウィンドウID値「1」が使われ ; ます。 InsertTab "AAA" buf = "テスト\nHSP\nテステス\nHotSP" cont = buf contents = cont;検索結果が入る変数 sel = 0;リストボックスで選択されている行が入る swd = "";検索する文字列 rombuf = "";一時的に使う変数 bwd = "x";inputの内容が変更されたか取得するためのもの flag1=1 notesel cont;contの変数をメモリノートパッドのバッファに設定 objsize 620,51 pos 5,5 syscolor 15 : boxf listbox sel, 60, cont;リストボックス配置 pos 5,100 oncmd gosub *Search, $111 input swd , 620 , 20,-1 hinput = objinfo(stat, 2) ; タブの項目追加が終わったら、タブ内に貼り付けたbgscr命令が非表示 ; 状態になっているので、表示されるようgsel命令を指定。CreateTab命令で ; 指定したウィンドウIDの初期値と同じ値を指定します。 gsel 1, 1 ; 元々のscreen命令のウィンドウID 0に描画先を戻します。 gsel ; タブ項目切り替え処理時のメッセージ (WM_NOTIFY) oncmd gosub *notify, $4E stop ; タブ項目切り替え処理部分です。 *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab ; 元々のscreen命令のウィンドウID 0に描画先を戻します。 gsel } return *Search if swd != bwd {;inputの内容が変更されたら bwd = swd;inputの内容が変更されたか取得するための変数の内容を変更する。 contents = "";検索結果が入る変数を初期化 if swd != "" {;検索文字列が空欄以外の場合 repeat noteinfo(0);リストボックスの内容の行数分ループをする。 noteget rombuf, cnt;bufにその行の内容を入れる。 if instr(rombuf, 0, swd) != -1 : contents += rombuf + "\n";検索する。 loop } else : contents = cont;空欄の場合はすべて表示 redraw 0 objprm 0, contents redraw 1 } return



inovia

リンク

2010/11/24(Wed) 23:33:46|NO.36024


objprm 0, contents
の上下にあるredraw を削除して、objprm の上に


gsel 1,0
を追加。



Dreamer

リンク

2010/11/26(Fri) 21:20:11|NO.36035

>>inoviaさん
ありがとうございました。
お陰さまで解決することができました。



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