|
アプリに表示されているA.iniを選択し、TESTボタンを押す アプリに表示されているB.iniを選択し、TESTボタンを押すという動作がしたいと思って作りました。 (今回はA.iniを選択しTESTボタンを押す部分のみ抜粋。Whileの部分をコピペするだけです)
A.iniが無い場合や、それより前のTESTフォルダ自体が無い場合もあります。
対象ファイルが無い場合は処理を飛ばしたいWhileを使っていますが 飛ばされることはありません。CLK_BTNまで実行してしまいます。 また、アプリが起動していてもリストビューが出るのにタイムラグがあることがあり 処理だけドンドンすすんでしまい、リストビューを開けていないのに CLK_BTNを押してしまうことがあります。
Q1.リストビューに表示されるまで待つにはどうしたら良いでしょうか Q2.BUSYでは判定できなかったため、3秒待ち無ければ処理を飛ばすにはどうしたらいいか 上記2点、分かりましたら教えて頂けないでしょうか。
id=GETID("テストアプリ","#32770",-1) Sleep(1)
While HANTEI=TRUE KEYWORD=ITEMWAIT(id,CLK_LSTVIEW,"C:\",2) HANTEI=DATA_CLICK(id,KEYWORD)
KEYWORD=ITEMWAIT(id,CLK_LSTVIEW,"Program Files",2) If KEYWORD="NODATA" then KEYWORD=ITEMWAIT(id,CLK_LSTVIEW,"Program Files(x86)",2) Endif HANTEI=DATA_CLICK(id,KEYWORD)
KEYWORD=ITEMWAIT(id,CLK_LSTVIEW,"TEST",2) HANTEI=DATA_CLICK(id,KEYWORD)
KEYWORD=ITEMWAIT(id,CLK_LSTVIEW,"A.ini",2) HANTEI=DATA_CLICK(id,KEYWORD)
CLKITEM(id,"TEST",CLKBTN) break WEND
FUNCTION DATA_CLICK(id,item) RESULT=FALSE If item<> FALSE and item<>"NODATA" then CLKITEM(id,item,CLK_LSTVIEW,True) CLKITEM(id,item,CLK_LEFTCLK,True) CLKITEM(id,item,CLK_DBLCLK,True) RESULT=TRUE Endif FEND
FUNCTION ITEMWAIT(id,kind,item,num) count=0 While True Sleep(0.5) for n in GETITEM(id,kind,num) if n=item then RESULT=item exit Endif If count=3 then RESULT="NODATA" exit End if Next count=count+1 Wend FEND
|
No.4458 2017/09/22(Fri) 17:50:16
|
☆ Re: アプリの指定ITEMが出るまで待ち、無い場合は終了したい / たんと |
|
No.4468 2017/09/25(Mon) 10:12:17
|
|
☆ Re: アプリの指定ITEMが出るまで待ち、無い場合は終了したい / stuncloud |
|
|
> Q1.リストビューに表示されるまで待つにはどうしたら良いでしょうか > Q2.BUSYでは判定できなかったため、3秒待ち無ければ処理を飛ばすにはどうしたらいいか
僕ならITEMWAITを以下のようにして
function ITEMWAIT(id, kind, item, num, wait = 3) limit = gettime() + wait // wait秒間見つからなかったらFALSE repeat // itemがクリック可能ならTRUE(クリック自体はしない) result = clkitem(id, item, kind, FALSE, num) until gettime() >= limit or result fend
ITEMWAIT()を呼んでTRUEが返った場合は必要な処理を行いFALSEが返ったら処理をスキップ、とします
スキップに関してはどうスキップしたいのかが元のコードから読み取れないのでちょっとアドバイスできないです、すいません HANTEIがFALSEになったらループをやめたい?みたいな感じだったのなら単にその都度 if ! HANTEI then break すればOKです
ちなみにもともとのITEMWAIT関数でkindにCLK_*定数を渡してますけど、それを受けてるのがgetitem()なのがよくなかったんじゃないでしょうか…と思ったけどCLK_LSTVEWとITM_LSTVEWはたまたま値が一致するんですね # ほんとは別の関数用の定数を使うのはぜったいダメ
|
No.4471 2017/09/26(Tue) 12:29:43
|
|
☆ Re: アプリの指定ITEMが出るまで待ち、無い場合は終了したい / たんと |
|
|
回答ありがとうございます。
HANTEIがFALSEになったらループから抜けたいのですが、 上手く行かなくて困ってました。 FALSEになったら抜けるために、WHILEループにしたのですが上手くいかず…。 書き方が悪いのかもしれません。
if ! HANTEI then break のようにすると 毎行書く必要が出て、ソースを読むのに苦労しそうだと思い このような形になっています。現状でも読みづらいソースですけれど…。
>ちなみにもともとのITEMWAIT関数でkindにCLK_*定数を渡してますけど、それを受けてるのが>getitem()なのがよくなかったんじゃないでしょうか…と思ったけどCLK_LSTVEWとITM_LSTVEWはたま>たま値が一致するんですね ># ほんとは別の関数用の定数を使うのはぜったいダメ ありがとうございます! どうしようか迷った挙句、そのまま使ってしまいました。 他の適当な言葉?をあてるのがベストですよね!修正します!
頂いたソースを試してみましたが、 CLKITEMがされることもなく、単にBUTTUN?がカチカチカチカチ異常動作を繰り返すだけでした。 他の方法検討してみます。
|
No.4474 2017/09/27(Wed) 15:43:05
|
|
☆ Re: アプリの指定ITEMが出るまで待ち、無い場合は終了したい / stuncloud |
|
|
> if ! HANTEI then break のようにすると > 毎行書く必要が出て、ソースを読むのに苦労しそうだと思い > このような形になっています。現状でも読みづらいソースですけれど…。 毎回書かないと失敗したところで抜けられないのでめんどくさいですけど毎回書きましょう さすがにこの状況だとあまりシュッとしたのは書けないので泥臭くやるしかないですね
あるいは、while内で似たような作業が多いので "Program Files" とか "A.ini" とかを処理する順番に配列に入れてforで回すというように書き直せば、毎回のHANTEIチェックもfor文内に1度書くだけで済みます
例: if kindofos(TRUE) then // 64bitOS ProgramFiles = "Program Files(x86)" else // 32bitOS ProgramFiles = "Program Files" endif dim items[] = "C:\", ProgramFiles, "TEST", "A.ini"
for item in items KEYWORD=ITEMWAIT(id,ITM_LSTVEW,item,2) HANTEI=DATA_CLICK(id,KEYWORD) if ! HANTEI then break next CLKITEM(id,"TEST",CLKBTN)
※ アイテム名がx86かどうかはkindofos(TRUE)で決め打ちにしてみましたが、対象の実装がわからないので適当です
> 頂いたソースを試してみましたが、 > CLKITEMがされることもなく、単にBUTTUN?がカチカチカチカチ異常動作を繰り返すだけでした。 ああ、だめでしたかごめんなさい clkitemは第四引数をFALSE指定しているのでクリック動作しないのはいいのですが、異常動作についてはちょっと想定外ですね… (まぁおおよそこんな感じなら動くだろうというコードだったので、対象アプリによってはうまくいかない可能性はありました) ちなみに対象があるかどうか探す場合はgetitemで探すのが常套手段ではあるんですが、クリッカブルな場合はclkitemのほうが速いしコードも短いという理由でclkitemを採用しています なのでclkitem部分はgetitemから探すように書き換えてもOKです # キモは3秒過ぎてもダメならFALSEを返すという部分なので
|
No.4475 2017/09/27(Wed) 16:24:01
|
|
☆ Re: アプリの指定ITEMが出るまで待ち、無い場合は終了したい / たんと |
|
|
stuncloud様
再度回答頂きありがとうございました。 頂いたソースをもとに、自分のソースを変更したところ 上手く動くようになりました!
教えて頂いたソースをみたら、CLKITEMの戻り値を利用していることに気づき(今更ですが) 戻り値になるように設定したら上手く動きました。初歩的なことで申し訳ありませんでした。
また、clkitem様の言うようにCLKITEMで確認したほうがソースも短くなるし 読みやすくなるし…良いことばかりのような気がするので、CLKITEMだけに統一します!
ありがとうございました!
|
No.4493 2017/10/02(Mon) 14:35:41
|
|