共通処理は別ファイルに部品化しておくと、実装やメンテナンスが効率化できます。
UWSCでスクリプトを作成すると「.UWS」形式のファイルを作成するかと思います。
通常は、目的とする全ての処理をこの「.UWS」のファイルに記述します。
なので、「1つの目的・操作」=「1つのUWSファイル」となりがちです。
しかし、
「他のスクリプトで書いた処理を、もう一回書くのは面倒だなぁ・・・」
「共通のPROCEDUREを別ファイルにしておきたいなぁ・・・」
「処理を修正したいけど、全部のスクリプトをメンテするのは面倒・・・」
なんて思うことはないでしょうか?
UWSCでは「CLASS~ENDCLASS」の記述をすることでクラス化し、スクリプトを意味のあるグループにまとめることができます。
これを利用することで、効率的にスクリプトを作成することができます。
例えば、ポイントサイト関連などのスクリプトを作成する場合、以下のような良く使う処理などはまとめておくと便利です。
IEを起動する。
IEの画面遷移後のウェイト処理。
画面の最大化。
全IEのクローズ。
などなど。
また、昨今は外部提供のゲームや1円アンケートなど、ポイントサイト間で同じコンテンツが導入されていることが多いです。
このようなコンテンツを自動化する場合も、スクリプトをクラス化しておくと非常に便利です。
1つのコンテンツの自動化スクリプトを共通クラスに準備しておけば、複数のサイトで呼び出して共通的に使うことができます。
さらに、コンテンツの仕様変更などがあった場合、クラス化したファイルのみを修正するだけで、全スクリプトに修正を反映することができるわけです。
メンテナンスの手間が省けるわけですね!(∩´∀`)∩
「CLASS~ENDCLASS」の記述をしておくだけで、簡単に共通部品化することができます。
共通化・部品化するのは非常に簡単です。
「CLASS~ENDCLASS」の記述したうえで、共通PROCEDUREの処理などを記述したファイルを用意するだけです。
例えば、以下の3ファイルがあると仮定します。
共通部品ファイル:COMMON.UWS
スクリプト①:SAMPLE1.UWS
スクリプト②:SAMPLE2.UWS
「共通部品ファイル:COMMON.UWS」に、「CLASS~ENDCLASS」でクラス定義し、共通処理を記述します。
すると、「スクリプト①:SAMPLE1.UWS」、「スクリプト②:SAMPLE2.UWS」の両方から共通の処理を呼び出すことができるわけです。
具体的にソースを見てみます。
共通処理側のプログラム(共通部品ファイル:COMMON.UWS)
「COMMON.UWS」に「CLASS~ENDCLASS」の記述でクラスを定義しました(クラス名=COMMONPROC)。
その中にIE起動、ウェイト処理、最大化処理、IEクローズの4つのPROCEDURE/FUNCTIONを記述しました。
処理の書き方は普段通りでOKです。
処理全体を「CLASS~ENDCLASS」で括るだけですね。(*^-^*)
CLASS COMMONPROC DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32 CONST WM_ACTIVATE = $06 // IE起動 FUNCTION CREATEIE() TRY IE = CREATEOLEOBJ("InternetExplorer.Application") EXCEPT EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE = GETACTIVEOLEOBJ("InternetExplorer.Application") ENDTRY IE.visible = true RESULT = IE FEND // 遷移ウェイト PROCEDURE BUSYWAIT(IE) SLEEP(0.5) ClkItem(GetID("Windows", "#32770", 1), "OK") ClkItem(GetID("Windows", "#32770", 1), "このページから移動") ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します") ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します") CONST TIME_OUT = 60 tm = Gettime() REPEAT SLEEP(1) ifb Gettime() - tm > TIME_OUT break endif UNTIL (! IE.BUSY) AND (IE.READYSTATE=4) SendMessageA(IE.Hwnd, WM_ACTIVATE, 0, 0) SLEEP(0.5) FEND // 画面の最大化 PROCEDURE MAXIMIZE(SITE) CTRLWIN(GETID(SITE), MAX) CTRLWIN(GETID(SITE), ACTIVATE) SLEEP(0.5) FEND // 全IEクローズ PROCEDURE CLOSINGIE() for i = 0 to GETALLWIN()-1 if POS("iexplore.exe", STRCONV(STATUS(ALL_WIN_ID[i], ST_PATH),SC_LOWERCASE)) <> 0 then CTRLWIN(ALL_WIN_ID[i], CLOSE) next FEND ENDCLASS
呼び出し側のプログラム(スクリプト①:SAMPLE1.UWS)
次に呼び出し側のプログラムになります。
まずは、「共通部品の呼び出し」を行います。
呼び出しは、「CALL 共通部品名.UWS」と最初に記述することで、共通部品内のPROCEDURE/FUNCTIONを使えるようになります。
これを忘れてしまい、「呼び出せないお・・(´・ω・`)」となる人が多いのでご注意ください(;^ω^)。
次に、実際のPROCEDURE/FUNCTIONの呼び出しは「クラス名.PROCEDURE/FUNCTION名」となります。
通常のPROCEDURE/FUNCTIONの呼び出しの頭に「クラス名.」を付けるだけです。
こちらは共通部品の「ファイル名」ではなく「クラス名」なのでご注意ください。
// 共通クラスの呼び出し CALL COMMON.UWS // IE起動 IE = COMMONPROC.CREATEIE() // 遷移ウェイト IE.Navigate("https://www.google.co.jp/") COMMONPROC.BUSYWAIT(IE) // 画面の最大化 COMMONPROC.MAXIMIZE("Google") // 全IEクローズ COMMONPROC.CLOSINGIE()
共通化すると、ソースコードが大変スッキリしますw。
まとめ。UWSCでも汎用的な処理は共通化しておくと、効率がグッとアップしますよ~。
というわけで、UWSCでも汎用的な処理は共通化しておくことが推奨されます。例えば以下みたいな感じ。
同じ処理を何度も書かなくても済む。
修正が発生した場合も、共通部品の1か所の修正で済む。
ソースコードがめっちゃスッキリ。
などのメリットがあります。
先々を考えて、効率的な開発ができるように、共通部品を設計しておくことは大事ですよね。
UWSC関連の記事あります!
UWSC関連の記事もたくさん書いてます^^。良かったら読んでくださいね。自動化ライフの実現に一歩近づくテクニックがあるかもしれませんよ?(嘘ですwありませんw)