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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0630
irakusaobjenableを使用するとonkey命令が機能しなくなってしまう6解決


irakusa

リンク

2011/6/30(Thu) 16:39:57|NO.39883

ツールをつくっていて「セーブボタンが二回連続で押されても一回だけ保存するようにする」ためにobjenalbe命令でボタンの無効化をしたところ、
Escキーを押したら終了するように指定しておいたonkey命令が動かなくなってしまいました。
どのようにすればonkey命令が復活するでしょうか?
下に問題の部分だけのソースをのせます。

症状
起動し、なにもせずにEscキーを押すとソフトは終了します。しかし、起動した後に「SAVE」と書かれたボタンを押して
セーブ処理終わった後にEscキーを押すとソフトが終了しません。
ですが、「SAVE」ボタンを押し、Escキーを押してソフトが終了しないのを確認した後にウィンドウを最小化し最大化すると
Escキーが反応します。他のウィンドウを選択してからまた元に戻ってEscを押すとEscが反応します。

なぜでしょうか?




ttl = "テスト"
ttls = "セーブ中"
screen 0,854,480
title ttl
onkey gosub *key //*keyにジャンプするように指定
pos 70,430
objsize 780,45
button gosub "SAVE",*savedata

*main
///
await 1
goto *main

*savedata //セーブ
objenable 0,0 ///SAVE ボタンを無効化 2重保存防止
title ttls
wait 50
onkey 1
title ttl
objenable 0,1 //SAVE ボタンを有効化
return

*key //Escを押されたら終了
if iparam = 27 : end
return



この記事に返信する


ひらまる

リンク

2011/6/30(Thu) 18:09:54|NO.39886

なんか知らんけど他のウィンドウを選択してから戻ってくるとonkeyが有効になります。
解決策としては、*savedataに

*savedata objenable 0,0 title ttls wait 50 onkey 1 title ttl objenable 0,1 gsel 0, -1 ;ウィンドウを非表示(フォーカスを外す) gsel 0, 1 ;ウィンドウを表示(フォーカスを戻す) return
を追加すると動きますが、なんでこんなことしなきゃならないのかはわかりません。
おそらくスマートな方法ではなくかなりごし押しな方法なので推奨はしません。
ウィンドウハンドルとか割り込み機能に詳しい人に期待してください;



Cookies

リンク

2011/6/30(Thu) 18:21:23|NO.39888

ボタンを押してからでも、ほかのウィンドウを選択してから、
HSPウィンドウをクリックすると動きます。

ここから考えられることは、ボタンを押したときにボタンにフォーカスがいき、
キーを押してもメインウィンドウにウィンドウメッセージがいかず、
ボタンにメッセージがいっているのでしょう。

どうにかしてメインウィンドウにフォーカスを移動させる必要が。
ということでSetFocus APIを利用してみました。
#uselib "USER32.DLL"
#func SetFocus "SetFocus" int ttl = "テスト" ttls = "セーブ中" screen 0,854,480 title ttl onkey gosub *key //*keyにジャンプするように指定 pos 70,430 objsize 780,45 button gosub "SAVE",*savedata *main /// await 1 goto *main *savedata //セーブ SetFocus hwnd ///////////////フォーカス移動////////////////////// objenable 0,0 ///SAVE ボタンを無効化 2重保存防止 title ttls wait 50 ;onkey 1 title ttl objenable 0,1 //SAVE ボタンを有効化 return *key //Escを押されたら終了 if iparam = 27 : end return


質問者さんの問題の箇所の抜き出し方はとてもいいですね。
回答しやすいです。長ったらしいスクリを載せてる人は見習ってほしいものです。
あ、でも<pre></pre>でスクリを囲むのを忘れずに。



ひらまる

リンク

2011/6/30(Thu) 18:29:05|NO.39889

>質問者さんの問題の箇所の抜き出し方はとてもいいですね。
そうですねーpreで囲ってないのに気づかないほどでしたw
正直、「セーブ機能とかそのままコピーしてたらめんどいな…」とか思っていたのですが、
必要な部分だけの抜粋なので問題個所も見つけやすくなっていました。

CookiesさんのSetFocusが正統派なのでしょうか。
もしそうなら、APIを使うのに抵抗がある場合、
gsel 0,-1 : gsel 0,1の方が楽でわかりやすいかもしれません…
格好悪いですけど;



Cookies

リンク

2011/6/30(Thu) 18:37:46|NO.39890

>もしそうなら、APIを使うのに抵抗がある場合、
ええ、そうなんですよね。自分も、初めのころはAPIはできるだけ避けてました。
今では、まず初めにAPIみたいな感じで、
おんなじことする標準命令があるにもかかわらずAPIを掲示板で紹介してしまったり。。
今回はちゃんと標準命令も調べましたがね。

そういえば、オブジェクトID -28をobjselに…なんて思いましたが
あれってHSP2だっけ…と。
http://lhsp.s206.xrea.com/hsp_tips8.html#3
-28はなんで廃止されたんでしょうね。



irakusa

リンク

2011/6/30(Thu) 19:45:32|NO.39892

タグでの囲みの指摘ありがとうございます。忘れていました。
投稿した後に自力で調べて gsel で無理矢理 onkey を有効化させることには成功しましたが、一瞬ウィンドウが消えてかなり不格好でした...
APIの使い方がよくわからなかったのでとても参考になりました。今後はAPIの使用も徐々に増やしていきたいと思います。
回答してくださった方々、ありがとうございます。



ひらまる

リンク

2011/6/30(Thu) 22:40:23|NO.39895

>objsel 0
天才!



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