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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0530
Gimicmesboxの最終行を常に表示させたい8解決


Gimic

リンク

2011/5/30(Mon) 21:49:12|NO.39466

いつもながら初歩的な質問になりますがよろしくお願いいたします。

複数行の文字列を表示させたいときに、mesだと画面端まで来ると次が表示されません。
そこでスクロールバーのあるmesboxを使って表示させようとしました。
しかし、処理後に最終行をmesbox上で表示させたいのに、
カーソルは最初の行に止まったままで、スクロールさせないと最終行が見えません。

********************************************************************
最初はこんなのを書いてました。

sdim a,1024 pos 0,320 mesbox a,640,150,1,0 repeat 100 b=cnt poke a,strlen(a),"\n"+str(b) objprm 0,a wait 1 loop
********************************************************************


過去ログに同じ質問があったので、回答の参考サイトを見て手直ししようと思ったのですが挫折しました。
過去ログ  http://hsp.tv/play/pforum.php?mode=pastwch&num=9260
参考サイト http://hspnext.com/hspkura/hspkura12.htm#contents47

********************************************************************
参考サイトを見てこのように直してみました。

#define EM_SCROLL $000000B5  ;追加 #define SB_LINEDOWN 1    ;追加 sdim a,1024 pos 0,320 mesbox a,640,150,1,0 repeat 100 b=cnt c=cnt poke a,strlen(a),"\n"+str(b) objprm 0,a sendmsg objinfo(0,2), EM_SCROLL, SB_LINEDOWN, 0 ;追加 wait 1 loop
********************************************************************

sendmsgのパラメーターである
 objinfo(0,2)がmesboxを指していることは分かりました。
 次のEM_SCROLLがメッセージID、SB_LINEDOWNがwParam値ということですが理解不能…。
 付け足した初っ端の
  #define EM_SCROLL $000000B5
  #define SB_LINEDOWN 1
 自体意味が分かりません。。。
 #defineがマクロを指定していることは理解できるのですが…。
 $000000B5 ??
 SB_LINEDOWN 1  ?? SB_LINEDOWN = 1って意味??


 「おまえにはまだ早い。」と言われればそれまでなのですが…
 できればコメントいただきたい次第です。。。



この記事に返信する


たんす

リンク

2011/5/30(Mon) 22:05:39|NO.39468

一度(もしくはスクリプトの一箇所で)しか使わないなら、

sendmes objinfo(0,2),$000000B5,1,0
で良いと思います。

しかし、$000000B5や1と書かれていても、何を設定しているのかすぐには理解できないので、

#define EM_SCROLL $000000B5 #define SB_LINEDOWN 1
としておき、

sendmsg objinfo(0,2), EM_SCROLL, SB_LINEDOWN, 0
と記述することで、「スクロール関係で、下へ下げるんだな」と理解しやすくなるのです。


これは#defineの説明ですね・・・



Cookies

リンク

2011/5/31(Tue) 23:03:16|NO.39490

#defineとは、おっしゃるとおり、マクロの定義です。
簡単に言うと、そっくりそのまま置き換えるってことです。
文字列置換みたいなものですかね。

たとえば、
;#define l __LINE__
;l=__LINE__ mes l
を、片方ずつセミコロンを外して実行してみてください。
(__LINE__とは、それが書いてあるスクリプトの行を表します。)

#defineを実行させるようにすると、lがそのつど__LINE__になるので、
mes __LINE__と置換され、「3」が表示されます。

一方、l=__LINE__を実行させるようにすると、そのときの__LINE__の値がlに代入されますから、
「2」が表示されます。

このように、変数では前に代入された値になってしまうのに対し、
マクロでは、書かれたその時点でのものにすることができます。

とはいえ、#define EM_SCROLL $000000B5みたいなのは、
いつ置き換えられたって変わるものじゃないですから意味ないんですけどね。
こういう場合、どちらかというと#constを使った方がいいのかなぁと思います。
(自分もしょっちゅう定数定義に#define使ってるけど。。)


ちなみに…
#define A 1
#define B 2 A=B
を実行しようとすると、コンパイルエラーが出てきて「1=2」とでます。
ばっちり置換されてますね。



Gimic

リンク

2011/6/1(Wed) 19:42:39|NO.39502

>>たんすさん
コメントありがとうございます。
なるほど。#defineはコードを見やすくするために使っている訳ですね。

>>Cookiesさん
__LINE__の例は大変わかりやすいです。


;#define l __LINE__  ・・・① ;l=__LINE__      ・・・② mes l
①だと__LINE__が3行目のmes lの時点で初めて実行されるので結果は「3」
②だと2行目で__LINE__が「l」に代入され、その後mesで表示されるので結果は「2」
なのですね。 

おかげで#defineの意味と使い方が解ってきました^^

さて、あとは

sendmsg objinfo(0,2), EM_SCROLL, SB_LINEDOWN, 0
なのですが…。

"EM_SCROLL $000000B5"  メッセージIDが$000000B5=181

"SB_LINEDOWN 1" wpalam値が 1 (おそらく1行下げる役割を果たす)

そもそもwpalam値、lparam値の意味が分かっていないのですが。。。

うーん。

もう少し研究してみます^^



whoさん

リンク

2011/6/1(Wed) 21:49:03|NO.39504

wpalam値、lparam値というのは、ウィンドウプロシージャに送られる値です。

すべてのウィンドウやらボタン類やらは、ウィンドウプロシージャに送られてくる情報をもとに処理を行っています。
たぶん(汗

なので今でいうMesBoxにEM_SCROLLに付加情報を与えて送ってやると、それに合わせてオブジェクトが動作するわけです。



Cookies

リンク

2011/6/2(Thu) 18:19:08|NO.39507

「wparam」「lparam」という言葉単体に特に意味はありません。
強いて言えば、ワードパラメータ、ロングパラメータですね。

wparam,lparamの具体的な意味が知りたいときは、
「EM_SCROLL」でググってみてください。
そしたらhttp://hp.vector.co.jp/authors/VA024411/vbtips03.html#03が見つかると思います。
すると、
wparamには0,1,2,3のどれかが入ること、それぞれの意味が書いてあります。
lparamには常に0を入れるのだそうです。(意味をなさないのでしょう。)



これからそれぞれのウィンドウメッセージに送るべきwparam,lparamが知りたくなった時は、
そのウィンドウメッセージの名前で検索してみてください。



Gimic

リンク

2011/6/2(Thu) 23:54:19|NO.39513

>>whoさん
なるほど。
画面に立ち上がっているウィンドウひとつひとつを制御しているのがプロシージャなのですね。
そしてこのプロシージャにメッセージを渡して仕事させるわけですか。

>>Cookiesさん
大変参考になるサイト紹介ありがとうございます!
英語の構文みたいにこれだけのメッセージがあるんですね。

あとwparamとlparamの意味と読み方がようやく分かりました^^
あまりに基本的なことなのか、どこを調べてみても見つけられませんでした。。。
特に読み方。。。

ちなみにiparamもあるみたいですが、これはどんな読み方なのでしょうか??


それと今回の問題無事解決しました^^
過去ログ紹介の参考サイトの参考にすべき箇所が違っていたようです^^;
最初参考にしたのは『テキストを垂直にスクロールする』だったのですが、
やりたかったことは『キャレットをスクロールさせて表示する』で実現できました。

以下手直し後のスクリプト
*****************************************************************************

#define EM_SCROLLCARET $000000B7 #define EM_GETLINECOUNT $000000BA #define EM_LINEINDEX $000000BB #define EM_SETSEL $000000B1 sdim a,1024 pos 0,320 mesbox a,640,150,1,0 repeat 100 b=cnt poke a,strlen(a),"\n"+str(b) objprm 0,a gosub*down wait 1 loop stop *down sendmsg objinfo(0,2),EM_GETLINECOUNT,0,0 c=stat sendmsg objinfo(0,2),EM_LINEINDEX,c-1,0 d=stat sendmsg objinfo(0,2),EM_SETSEL,d,d sendmsg objinfo(0,2),EM_SCROLLCARET,0,0 return
******************************************************************************

皆さんのコメントでここまでたどり着くことができました。
理解はまだまだなのですが、ひとまず思い通りの結果が出たことに今は満足です^^b



Cookies

リンク

2011/6/3(Fri) 19:03:57|NO.39520

解決済みですが、自分もiparamについて気になったので・・・
iparamで検索すると、ヒットするのはほとんどHSPの情報ですね。

そして、lParam,wParamの方からアプローチしてみることにしました。
lParamとwParamのついでに出てきてるかな~と思って。
(ロングパラメータ、ワードパラメータというのを知ったのもずいぶん昔で、
本当かどうか怪しい気もしてきたので。)

結論から言うと、ロング、ワードというのはあってたらしいです。
が、全くiParamについては書いてありませんでした。
英語サイトも調べましたが、「iParam」というのさえ見つかりませんでした。
(関係なさそうなのがいくつかはありましたが。)

ワード、ロングの根拠:
MSDN: http://blogs.msdn.com/b/oldnewthing/archive/2003/11/25/55850.aspx
CodeGuruForum: http://www.codeguru.com/forum/archive/index.php/t-418570.html


iParamについては、HSP以外ほとんど情報がありませんでした。
で、思ったことは、これはHSPだけの名前なのでは?
ちなみにHSPでは、onkeyのときiParamに文字コードが入るようですが、
普通は一緒に送られるWM_CHARを捕まえるのだそうです。
http://www.geocities.jp/ky_webid/win32c/027.html

そしてonexitでは、iParamにシャットダウンか否かが代入されるようですが、
普通はWM_CLOSEとWM_QUERYENDSESSIONという二つのウィンドウメッセージの
どっちが来るかを判定するそうです。
(WM_CLOSEは普通にウィンドウクローズなどで、WM_QUERYENDSESSIONはWindowsの終了によるもの)

使いやすくするためにできた、HSP特有のシステム変数なのでは?



Gimic

リンク

2011/6/3(Fri) 20:58:35|NO.39525

>>Cookiesさん
参考サイトの紹介ありがとうございます^^
wparamは整数とハンドルを、lparamはポインタを返すのに使用すると。。。

ちなみに以前次のようなスクリプトを作ってキーを返すパラメータを調べたことがあります。


onkey*main *main mes "w:"+str(wparam)+" "+"l:"+str(lparam)+" "+"i:"+str(iparam)

この時にiparamがHSPの文字コードと同じ値を返すことに気づいたので


sdim text,2 text(65)="A","B","C" onkey*main *main mes text(iparam)
のような文字を入力する仕組みを作りました。
キャラクターの名前登録に使おうと考えていました。

wparamもA~Zなどの文字だとiparamと同じ値なのですが、
テンキーから入力されるとwparamとiparamの値は違っていました。

たとえば0をテンキーから入力するとwparam:96 iparam:48 という風に。

またiparamは上下左右キーやDeleteキーなどは値が全部0でした。

なのでキー操作をするときにはwparamを使っていました。


onkey*main *main gosub*key_check gosub*draw stop *key_check Xadd=0 :Yadd=0 key=wparam if key=38 :Yadd = -10 if key=40 :Yadd = 10 if key=37 :Xadd = -10 if key=39 :Xadd = 10 return *draw color 255,255,255 :boxf color ,, X+=Xadd Y+=Yadd pos X,Y :mes "◆" return

標準命令のgetkeyやstickをあまり使わないのですが、これで大丈夫なのかなぁ?という思いがあります。
さすがに同時押しの判定はstickでないと実現できないのでこれを使っているのですが。

どちらの方法がどんな特色があるのか、まだまだ理解の足らない今日この頃です^^;



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