UWSCのループについて教えて下さい

UWSCのループについて教えて下さい。ループの方法や、それぞれの制御文の違いが知りたいです。
ループ、いわゆる繰り返し処理ですが、UWSCにはいくつかの実現方法があります。
参考になる記事を下に記します。

【プログラミング不要】
プログラムを書くことなく、起動時の設定で、処理回数を選ぶ方法
繰り返し処理を行いたいけど制御文が難しい

【プログラミング必要】
FOR-NEXT・・・指定回数の処理を実行する
制御文:FOR-NEXTの解説

WHILE-WEND・・・指定した条件を満たす間、処理を実行する
制御文:WHILE-WENDの解説

REPEAT-UNTIL・・・指定した条件になったら、処理を終了する
制御文:REPEAT-UNTILの解説

繰り返し処理を途中で終了、継続するCONTINUE、BREAK
CONTINUE
BREAK

上記3つの繰り返し処理制御文の使い分けについて
UWSCでFORとかREPEATとか繰り返し処理は何を使うのがベストですか?

その他参考になる、掲示板の投稿
FOR~NEXTでカウント中のカウンター(a)は増やすことは出来ないのでしょうか?

タグ

2013年5月24日 | コメントは受け付けていません。 |

カテゴリー:Q&A

UWSCの画像認識機能を教えて下さい

UWSCの画像認識機能を教えて下さい。どの記事を参照すればよいでしょうか。
いくつか記事があるのでリンクを張ります。

画像認識を行う関数CHKIMGについての解説は下記より
CHKIMG

画像認識を使ったスクリプトは下記の記事が参考になります
画像認識とマウス操作を組み合わせよう

タグ

2013年5月11日 | コメントは受け付けていません。 |

カテゴリー:Q&A

配列の要素をシャッフルしたい

配列の中身をランダムに変更する関数を作りたいのですが、分からないので教えてください
配列を1周する中で、ランダムに選ばれた配列の要素と該当する配列の要素を1対1で入れ替えることで、ランダムに配列の要素をシャッフル出来ます

処理イメージ ※クリックで拡大します

umiumiさんの掲示板で、直撃の関数をしろまささんが回答していたので、参考とさせて頂き、ご紹介します。

コード例

DIM list[] = 1,2,3,4,5,6,7,8,9,10

shuffle(list)

For num = 0 TO length(list)-1
	PRINT list[num]
NEXT

//---シャッフル関数
Procedure shuffle(var list[])
 Dim n = length(list)	//配列の要素数
 Dim i, r, tmp
 for i = 0 to n -1
  r = random(n)	
  tmp = list[r]		//ランダムに選ばれたr番目の配列の値を取得
  list[r] = list[i]	//配列i番目の値をr番目に入れる
  list[i] = tmp		//入替え完了
 next
Fend
ただし、UWSCのバージョンが4.0以上でないとエラーが出るようなので、注意です

タグ

2013年4月10日 | コメントは受け付けていません。 |

カテゴリー:Q&A

SELECT文のカンマによる複数表記可の意味は?

HELP(Ver 4.8b)にあるSELECT文の『カンマによる複数表記可』の意味が分かりません。何を意味していますか?
結論として、『カンマによる複数表記』は演算子『OR』として使えるようです。

コード例

cnt = input("1ケタの数値を入力してください")

select cnt
case cnt = 1, cnt =3, cnt =5, cnt =7, cnt =9
print "奇数"
case cnt = 2, cnt =4, cnt =6, cnt =8
print "偶数"
default
print "1ケタの数値を入力してください"

SELEND
『AND』ではなく、『OR』として機能する点に注意ですね

タグ

2013年4月2日 | コメントは受け付けていません。 |

カテゴリー:Q&A

参照ファイルのアップロードをしたい

フォームの参照ファイルをアップロードする制御のやり方が分かりません。
関数などありませんか? 

こういうの ↓↓

現状、デフォルトで用意されている専用関数は無いようですが、自作関数で対応出来そうです。

Pro版のrec機能を使いアップロード操作を記録すると、
最終的にダイアログウィンドウを制御できる自作関数が設定されます。

コード例

////編集ポイント
PATH = "C:\Program Files\UWSC\Readme.txt"
URL = "http://canal22.org/qanda/sansyou/" 
NAME = "omoro"
////編集ポイントここまで


IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate(URL)
BusyWait(IE)

Thread PopupWin("アップロードするファイルの選択","開く(&O)",2,PATH)
IESetData(IE,True,NAME) // FILE 
BusyWait(IE)

Procedure PopupWin(title, btn, no=-1, str="")
  id = Getid(title,"#32770",10)
  Sleep(1)
  if no>=0 then Sendstr(id,str,no,True)
  Clkitem(id,btn)
Fend

Procedure BusyWait(ie)
  Sleep(0.5)  // Wait
  Const TIME_OUT = 90
  tm = Gettime()
  repeat
    Sleep(0.2)
    ifb Gettime() - tm > TIME_OUT
      MsgBox("Time Out:BusyWait")
      ExitExit
    endif
  until (! ie.busy) and (ie.readyState=4)
  Sleep(0.5)
Fend

アンサーで確実に出来ると言い切れないのは、自作の関数ではない点と、GETIDで指定するクラス名:#32770に関する情報を持ちあわせていないからです。
念のため3台のパソコンで試した結果、上記コードは正常に動作していました。
それぞれのPCスペックは、WIN7、WIN7、WIN7PROでIEはVER9です。
他のバージョンのブラウザでは試していません。

重要なポイントは、PopupWin関数を設定することと、プラグラム内でThread 生成して実行している点です。

利用にあたっては、ファイルパスなど適宜変更してご利用ください。
NAMEで指定する文字列は、ファイルをアップロードするフォームのnameを指定します。

タグ

2013年3月27日 | コメントは受け付けていません。 |

カテゴリー:Q&A

UWSCスクリプトのセキュリティ対策

UWSCスクリプトに色々情報が書かれているので、
セキュリティに懸念があります。
誰でもパスワードが読み取れたり、
実行できたりするので、何か対策はありますか。
また、指定のフォルダからのみ実行できるようにすることは可能ですか。
UWSCスクリプトは便利ですが、
スクリプト自体を持ち出されたり、読み取られたり、
他の人でも実行できてしまうケースがあります。
いくつか対策を考えてみましたので下に記して見ます。
※パスワード、ファイルの持ち出し、その他の各セキュリティポリシーはご自身で検討お願いします
※UWSCのスクランブルについても絶対に解読されない事を保障するものでもありません

スクランブルをかけて、解読を困難にする

まずはスクランブルを実施することで、
中身の解読を困難にしてしまう方法があります。
パスワードを埋め込んでいたりする場合は、
ファイルの中から該当情報を取得することが難しくなります。
スクランブルのかけ方については、
コチラの記事の「スクランブル」をご参照ください。

実行時にパスワードを要求する

INPUT関数IF文を組み合わせて、
実行時にパスワードを要求するようにすることができます。
この方法とスクランブルの組み合わせで、
セキュリティを向上させることができます

IFB INPUT("パスワードを入力してください","",TRUE) <> "1234" THEN
  MSGBOX("パスワードが異なるため処理を終了します")
  EXITEXIT
ENDIF

PRINT "処理を実行しました!"

上のスクリプトは、
パスワードに「1234」を入力しないと、
次の処理が実行されずに終了してしまいます。
このスクリプトにスクランブルをかけることで、
実行時パスワードの取得も困難になります。

指定のディレクトリからのみ実行可とする

DOSCMD関数で、
スクリプトの実行位置ディレクトリを知ることができます。 これが指定のディレクトリと異なる場合は実行しないよう制御することができます。

CURDIR = TRIM(DOSCMD("CD"))

IFB CURDIR <> "C:\uwsc" THEN
  MSGBOX("指定位置と異なります")
  EXITEXIT
ENDIF

 PRINT "処理を実行しました!"

*

上記のスクリプトでは、Cドライブ直下にuwscというフォルダを作成し、
そこにあるスクリプトのみ実行できる仕組みになっています。
別のマシンでも同一のフォルダ構成を作成された場合は、
実行可能となる点は注意です。

別のファイルを読み込むようにする

CALLで、
他のスクリプトを呼び出す文を挿入しておけば、
単体での実行は出来なくなります。

 CALL "../required.uws"
 PRINT "処理を実行しました"

*

フォルダ構成は上記のようになっており、
一つ上の階層にrequired.uwsをおく必要があります。
required.uws自体は中身は空でも問題ありません。

外部Webサイトの情報を利用する

指定のページにアクセスし、
ページ内の情報が一致する場合に
次の処理に進むようにしてみます。
Webページの情報を書き換えて
スクリプトの実行可否を制御することができます。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = FALSE //バックグラウンドでチェックするため、画面表示しなくてもよい
IE.navigate("http://canal22.org/")
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readyState = 4
TITLE = IE.document.title
IE.QUIT
IFB TITLE <> "UWSC コバヤシ式" THEN
  MSGBOX("認証できません。処理を終了します")
  EXITEXIT
ENDIF

上のスクリプトはcanal22.orgへアクセスし、
そのページのタイトルを照合しています。
バックグラウンドでチェックが進めば良いので、
visibleのプロパティはFALSEにしています。

上記全ての方法を組み合わせてみる

さて、何種類か方法を挙げてみましたので、
全てを組み合わせたスクリプトを作ってみます。
処理の順番は・・・
現在位置(ディレクトリ)の確認

外部スクリプトの確認

パスワード入力

外部サイトの確認
となります。
最後に任意でスクランブルをかけ、
解読を困難にすることも可能です。
スクリプトは下記のとおりです。

この投稿の続きを読む »

タグ

2013年3月16日 | コメントは受け付けていません。 |

カテゴリー:Q&A

複数のEXCELファイルを制御したい

ひとつのスクリプトで複数のExcelファイルからデータを取得したいのですが、 うまくいきません。 スクリプトは下記の通りです。
// A1には『りんご』 A2 には『ごりら』

PT1 = "C:\Users\UWSC\Desktop\TEST1.xls"
PT2 = "C:\Users\UWSC\Desktop\TEST2.xls"

Excel = XLOPEN(PT1)
PRINT XLGETDATA( Excel,"A1") //結果:りんご

Excel = XLOPEN(PT2)
PRINT XLGETDATA( Excel,"A2") //結果:ごりら
PRINT XLGETDATA( Excel,"A1") //結果は空になる

対策を教えて下さい。

COMオブジェクトの認識の問題ですね。

エクセルの操作はExcel = XLOPEN(ファイル名)と考えがちですが、
実際は戻値 = XLOPEN(ファイル名)です。
なので、戻値のCOMオブジェクトを適切に設定すれば、解決します。

修正コード

PT1 = "C:\Users\UWSC\Desktop\TEST1.xls"
PT2 = "C:\Users\UWSC\Desktop\TEST2.xls"

Excel = XLOPEN(PT1)
PRINT XLGETDATA( Excel,"A1") //結果:りんご

Excel2 = XLOPEN(PT2)
PRINT XLGETDATA( Excel2,"A2") //結果:ごりら
PRINT XLGETDATA( Excel,"A1")  //結果はりんご

ちなみに、COMオブジェクトをクリアーしないで、質問のコードを連続して走らせると、
『空』→『ごりら』→『空』になります。

タグ

2013年3月6日 | コメントは受け付けていません。 |

カテゴリー:Q&A

数分後に自動でシャットダウンしてくれる簡易なスクリプトを書きたい

数分後に自動でシャットダウンしてくれる簡易なスクリプトを書きたい

30分後にシャットダウンする、1時間後にシャットダウンするというスクリプトをUWSCで作ろうとしています。毎回時間をスクリプトに記入して保存するのが煩雑です。

予定時間、条件を元にPCをシャットダウンしてくれるツール、方法はたくさんあります。
もちろんUWSCにもシャットダウンするためのPOFF(P_POWEROFF)という関数があり利用可能です。

場面としては、長時間のファイルダウンロード、動画変換、その他自動処理中など、長時間PCに張り付いていたくない、だけどもある程度時間がたったらシャットダウンしたいという光景が浮かびます

お悩みの方は毎回、スクリプトに時間を記入しているそうなので、
そこはスクリプトが立ち上がるたびに値入力のウィンドウが出るようにしましょう。
また、単純にSLEEP(指定秒数)とした後にPOFF関数を実行するのも問題ありませんが、 それだと後どのくらい経過すればシャットダウンするかが分からず、少し不親切かもしれません。

SCD = INPUT("何分後にシャットダウンしますか?") * 60
SLEEP(SCD)
POFF(P_POWEROFF)

上のようなスクリプトを少し改善して、
何分後にシャットダウンされるのか可視化してあげましょう。
スクリプトは以下のようになります。

//値を整えて、秒数を取得
MNT = INT( TRIM( INPUT("何分後にシャットダウンしますか?") ) ) 
FOR A = MNT TO 1 STEP -1
 FUKIDASI(MNT + "分後にシャットダウン")
 SLEEP(60)
NEXT
POFF(P_POWEROFF)

タグ

2013年3月1日 | コメントは受け付けていません。 |

カテゴリー:Q&A

UWSCの設定をエクスポートしたい

新しいパソコンにuwscをダウンロード&インストールしたのですが、
以前設定していたランチメニューやスケジュール機能を再設定するのが面倒です。 これら設定のエクスポートとインポートは出来ないでしょうか?
出来ます。

これらの設定は、UWSC.INIファイルに書き込まれています。
UWSC.INIファイルそのものをコピー&上書きするか、対象部分を上書きすることで、 以前設定した時と同様にランチメニューやスケジュール機能を利用することが出来るようになります。

ということで、UWSC.INIファイルについてご説明致します。

UWSC.INI

場所:UWSCのプログラムが入っているフォルダの第一階層。
HELPによると、OSによって以下のような場合があるようです。

Vista以上にて Pragram files下にインストールした場合に VirtualStoreリダイレクト機能により以下のフォルダに作られます C:\Users\ユーザ名\AppData\Local\VirtualStore\Program Files\UWSC (AppDataフォルダは非表示フォルダ) また、カレントに作成できない場合には Application Data\UWSC ディレクトリに作成

構成[SET] [LUNCHMENU] [SCHEDULE] セクションから成り立っています。

SETセクションは、UWSC運用の設定が書き込まれています。

LogLines :PRINT文でのロギングの最大行数を指定 (デフォルトは2000行)
DefaultFont: フォント名, サイズ (MSGBOX, FUKIDASI, ログ等でのフォント、デフォルトは’MS Pゴシック’)
NotMultiplex : スクリプト実行の多重起動を制限します (ファイルの関連付等からの実行)
0:制限なし、 1:一つのみ、 2:二つまで(数はUWSC本体も含む)
-9:制限なし、-1:一つのみ、-2:二つまで(マイナス値の場合 ‘多重起動禁止’のダイアログは出ない)
NotTaskBar = 1  関連付け実行時にアイコンをタスクバーに出さない
その他、Positionやホットキーの設定などがあります。

LUNCHMENUセクションは、ランチメニューの設定が記載されています。
この範囲をコピペすれば、新しいUWSCでランチメニューを引き継ぐことが出来ます。

SCHEDULEセクションは、スケジュール機能の設定が記載されています。
この範囲をコピペすれば、新しいUWSCでスケジュール設定を引き継ぐことが出来ます。

ちなみに、スケジュールの最大設定は、MaxNumberで変更が出来ます。
MaxNumber = スケジュールの最大設定数 (デフォルトは40、最大400まで)

INIファイルに関係する関数は、

  • READINI(INIファイル 読み込み)
  • WRITEINI(INIファイル 書き込み)
  • DELETEINI(INIファイル キーの削除)
などがあります。

※バージョンの異なるUWSC間で、この方法が可能かは、確認がとれていません。
将来的にiniファイルの設定が変更された場合、エラーを起こす可能性もあります。
さらに深く確認をとりたい場合は、本家ウミウミさんのページよりお調べください。

タグ

2013年1月29日 | コメントは受け付けていません。 |

カテゴリー:Q&A

UWSCのFORや繰り返し処理は何がベスト?

UWSCでFORとかREPEATとか繰り返し処理は何を使うのがベストですか?
UWSCでは、以下のような繰り返し処理を行う制御文が用意されています。
FOR 変数 = 初期値 TO 終了値 [ STEP 刻み値]
 処理
NEXT

WHILE 条件
 処理
WEND

REPEAT
 処理
UNTIL 条件 

これらの制御文はそれぞれ特徴があり、
どれがベストという評価は出来ません。
目的に応じて、使いこなすことがベストです

特徴

FOR~NEXTは、最も直感的に設定が出来て、繰り返し回数が分かっている場合に便利です。

WHILE~WENDは、条件がTrueの結果を返す限り、繰り返し処理を続けるループ文です。ループを開始する前に条件を判定するので、最初から条件を満たしていなければ、1度もループを行いません。

REPEAT~UNTILは、条件がFalseの結果を返す限り、繰り返し処理を続けるループ文です。ループの条件が終了判定となっているので、最低1回はループ処理を行います。

覚え方

当然、全ての制御文を使いこなせることが理想ですが、
はじめからうまく出来る人は多くありません。

これからスクリプトを習っていく方は、最も平易なFOR~NEXT文を覚えることをオススメします。

そして、色々とスクリプトを作成していく中で、FOR~NEXTで対応出来ないケースが生じてくるので、 その時、改めてWHILE~WENDの利用を検討してみてください。

それまでの経験でループ処理のアルゴリズムを理解していれば、
WHILE~WENDも容易に理解出来るようになっているでしょう。
※繰り返し処理に関するアルゴリズムの解説はリンク先が分かりやすいです。

タグ

2013年1月10日 | コメントは受け付けていません。 |

カテゴリー:Q&A

このページの先頭へ