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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1206
kakiramesboxが思うように更新されない7解決


kakira

リンク

2008/12/6(Sat) 23:36:05|NO.21327

HSP初心者です。
コピーや貼り付けなどの操作を自動でしてみたいと思い、プログラムを組んで見たのですが、
どうせなら、クリップボードの中身も監視したいと思い、mesboxに表示させることにしました。
使い方は、マウスで対象物をドラックしてから、コピーを押すとクリップボードに対象物がコピーされます。
詳細モード表示中にコピーを押すと、クリップボードの中身とmesboxの中身が変わる・・・ように
組んだつもりなのですが、何故か2回コピーボタンを押さなければ更新されません。

#uselib "user32.dll" #cfunc GetForegroundWindow "GetForegroundWindow" #func SetForegroundWindow "SetForegroundWindow" int #func keybd_event "keybd_event" int, int, int #include "clipboard.hsp" sdim moji,2000 *def screen 0,200,180 gsel 0,2 objsize 100,80 if aa=null :aa="" button gosub "コピー",*copy pos 100,0 button gosub "ペースト",*pest pos 0,80 button gosub "切り取り",*kiritori pos 100,80 button gosub "元に戻す",*motoni pos 0,160 objsize 200,20 button gosub ">>>詳細オプション(兼更新)",*syousai gosub *main repeat wait 1 loop stop *main if a=0 { repeat // そのときアクティブなウィンドウのハンドルを取得する hWnd_active = GetForegroundWindow() a=0 wait 150 loop } return *syousai screen 0,450,180 gsel 0,2 if aa=null :aa="" Clipget c if c=null : aa="" :else : Clipget aa objsize 100,80 button gosub "コピー",*ccopy pos 100,0 button gosub "ペースト",*pest pos 0,80 button gosub "切り取り",*kiritori pos 100,80 button gosub "元に戻す",*motoni pos 0,160 objsize 200,20 button gosub "<<<詳細オプション",*def pos 250,0 Clipget aa mesbox aa,150,40,0 pos 200,10 mes "現在:" pos 400,0 objsize 50,40 button gosub "コピー",*acopy gosub *main stop *copy a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 67 keybd_event 17,,2 keybd_event 67,,2 return *pest a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 86 keybd_event 17,,2 keybd_event 86,,2 return *kiritori a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 88 keybd_event 17,,2 keybd_event 88,,2 return *motoni a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 90 keybd_event 17,,2 keybd_event 90,,2 return *ccopy a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 67 keybd_event 17,,2 keybd_event 67,,2 gsel 0,2 clrobj 5,5 pos 250,0 Clipget aa mesbox aa,150,40,0 pos 250,0 SetForegroundWindow hWnd_active return *acopy Clipset aa return

モジュールは、http://f17.aaa.livedoor.jp/~takasoft/Programer/HSP_module/clip.htmを使わせてもらっています。
解決できる方がいらっしゃったらご教授くださいm(_ _)m



この記事に返信する


ANTARES

リンク

2008/12/7(Sun) 06:57:44|NO.21332

>何故か2回コピーボタンを押さなければ更新されません。
 Ctrl+Cを押している時間が短すぎます。waitを入れましょう。

 起動して31回ほど「詳細オプション」ボタンを押すとエラーが起きます。
何でもかんでもgosubにすればいいというものではありません。

 clipboard.hspのClipgetには、クリップボードがテキストで
なおかつ空のとき、エラーが起きるというバグがあります。



Kpan

リンク

2008/12/7(Sun) 14:09:02|NO.21346

ラベルジャンプ処理があっち行ったりこっち行ったりで無駄が多いです。(^^;

↓に注意して、一から書き直したほうがいいカモ

・screen命令を呼ぶのは一度だけ。
(ウィンドウの表示サイズを変更 → width命令)

・オブジェクトの設置も一度だけ。
(オブジェクトの中身を変更 → objprm命令)



kakira

リンク

2008/12/7(Sun) 19:14:12|NO.21378

>ANTARESさん
なるほど、waitを入れれば良いのですね。ありがとうございます。
wait 10を入れると、正常に動きました。
wait 1を入れても動かなかったので、そこを原因から完全に消去していたので、だめだったようです。
gosub命令は、行って帰ってくる命令なのですね。
button gosub ">>>詳細オプション(兼更新)",*syousai
などのところを、
button gosub ">>>詳細オプション(兼更新)",*syousai
こうしたらエラーが出ませんでした!ありがとうございます。
>クリップボードがテキストでなおかつ空のとき、エラーが起きるバグ
これは、クリップボードがテキストで空のときに、代理として" "(半角スペース)
などをクリップボードに入れることで回避可能でしょうか?

>Kpanさん
効率の悪いプログラムになっていますね^^;反省します。。
最初はobjprm命令を使っていたのですが、うまくmesboxの内容が更新されないようなので、
いったん消去してもう一度書き直したらうまくいくかなぁと思ってclrobj命令を使っていました。
治ったみたいなので、objprm命令に戻しました。
screen命令をwidth命令で書き直すと、どうも<<<詳細オプションボタンが機能しなくなってしまうのですが、
改善可能ですか?可能でしたら教えてください。m(_ _)m


<略> //最初に初期化 screen 0,450,180 *def //screen 0,200,180 width 200,180 <略> *syousai //screen 0,450,180 width 450,180 <略>
後の部分は変えていません。



Kpan

リンク

2008/12/7(Sun) 20:26:09|NO.21381

たとえば、こんな感じで組んでみてください。


screen 0, 400, 200 width 200, 200 pos 0, 0 button gosub "", *change sdim buf, 8096 pos 300, 0 mesbox buf, 100, 50 // 必要なオブジェクトはここまでに全部設置する repeat wait 50 // ここに監視する処理 loop *change if check { width 200, 200 } else { width 400, 200 } // 0 or 1のスイッチ check ^ 1 return



kakira

リンク

2008/12/7(Sun) 22:35:35|NO.21390

>Kpanさん
ありがとうございます。
オブジェクトなどは最初に配置して、変更するときにobjprmを使えば良いのですね。
おかげでプログラムが簡潔に&早くなりました。これで解決とさせていただきます。

また、Clipgetのバグは、clipboard.hspをイングルードするのではなく、hspext.asをイングルードすることで
なくなりました。Kpanさん、ANTARESさん、ありがとうございました。


#uselib "user32.dll" #cfunc GetForegroundWindow "GetForegroundWindow" #func SetForegroundWindow "SetForegroundWindow" int #func keybd_event "keybd_event" int, int, int #include "hspext.as" screen 0, 450, 180 gsel 0,2 width 200, 180 namae=">>>詳細オプション" pos 0, 0 objsize 100,80 button gosub "コピー",*copy pos 100,0 button gosub "ペースト",*pest pos 0,80 button gosub "切り取り",*kiritori pos 100,80 button gosub "元に戻す",*motoni pos 0,160 objsize 200,20 button gosub namae,*change pos 400,0 objsize 50,43 button gosub "コピー",*acopy sdim buf, 8096 dhWnd_active = GetForegroundWindow() pos 250,0 Clipget buf mesbox buf,150,43,0 pos 200,11 mes "現在:" // 必要なオブジェクトはここまでに全部設置する repeat chWnd_active = GetForegroundWindow() if dhWnd_active != cWnd_active { hWnd_active = chWnd_active } // ここに監視する処理 wait 50 loop *change if check { width 200, 180 namae=">>>詳細オプション" objprm 4,namae } else { width 450, 180 namae="<<<詳細オプション" objprm 4,namae } // 0 or 1のスイッチ check ^ 1 return *copy SetForegroundWindow hWnd_active keybd_event 17 keybd_event 67 wait 20 keybd_event 17,,2 keybd_event 67,,2 Clipget buf objprm 6,buf return *pest a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 86 wait 20 keybd_event 17,,2 keybd_event 86,,2 return *kiritori a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 88 wait 20 keybd_event 17,,2 keybd_event 88,,2 Clipget buf objprm 6,buf return *motoni a=1 SetForegroundWindow hWnd_active keybd_event 17 keybd_event 90 wait 20 keybd_event 17,,2 keybd_event 90,,2 return *acopy Clipset buf return
これからも、良いソフトができるよう、頑張ります!



ANTARES

リンク

2008/12/8(Mon) 00:49:54|NO.21396

>これは、クリップボードがテキストで空のときに、代理として" "(半角スペース)
>などをクリップボードに入れることで回避可能でしょうか?
 Clipgetを使わずにそんなことできないでしょう。

 最初に書いておけばよかった。

hRetText=GlobalLock(hMemText) if (lstrlen(hRetText)) { dupptr dRetText,hRetText,lstrlen(hRetText),2 RetText=dRetText } else { RetText="" } GlobalUnLock(hMemText)


>また、Clipgetのバグは、clipboard.hspをイングルードするのではなく、
>hspext.asをイングルードすることでなくなりました。
 ほかにもバグがあるかもしれないので、それでいいのなら
その方が安全でしょう。



SYAM

リンク

2008/12/8(Mon) 02:43:14|NO.21401

オブジェクトIDについて、せっかくなのでちょっとTIPSを書き添えときます。

オブジェクトを配置すると、そのオブジェクトのオブジェクトIDが、システム変数 stat に代入されます。
そこで、


sdim message,1024 button "1", *onbutton1 : objid_btn1 = stat button "2", *onbutton2 : objid_btn2 = stat mesbox message, 480,64, 0, 1000 : objid_mes = stat stop *onbutton1 btn="pushed." objprm objid_btn1, btn message += "button1 pushed.\n" objprm objid_mes, message stop *onbutton2 btn="pushed." objprm objid_btn2, btn message += "button2 pushed.\n" objprm objid_mes, message stop

……のように、オブジェクトを配置するときに必ずシステム変数 stat から オブジェクトID を取得するようにしておくと、後でオブジェクトの追加や削除、並べ替えがとってもラクになります。
上のサンプルでは、オブジェクトを並べ替えても それ以外の変更は発生しませんね。

逆に、objprm 命令にオブジェクトIDを直接数字で指定していると、
オブジェクト配置命令を追加または削除したとき、それ以降に配置しているオブジェクトのオブジェクトIDが全部ズレてしまいます。当然、スクリプト内の objprm 命令を全部書き換える羽目になります。
また、[Tab]キーでのフォーカス移動の順序はオブジェクト配置命令の順序と同じです。これを並べ替えなんかしたくなったらえらい手間です。
そして、変更の手間や範囲が大きいことは、変更漏れや間違いによってバグが発生する絶好の機会になります。



オブジェクト配置命令のHELPに、「配置したオブジェクトのオブジェクトIDがstatに代入される」ことが書いてあってもいいような気がするなぁ…。



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