MODULE-ENDMODULE、CLASS-ENDCLASS

MODULE-ENDMODULE、CLASS-ENDCLASS

モジュール化、クラス化して、スクリプトを意味のあるグループにまとめます
MODULE
  CONST 変数
  PUBLIC 変数
  DIM 変数
  PROCEDURE モジュール名
  PROCEDURE 関数名()
  FUNCTION 関数名()
ENDMODULE
または・・・
CLASS
  CONST 変数
  PUBLIC 変数
  DIM 変数
  PROCEDURE クラス名
  PROCEDURE 関数名()
  FUNCTION 関数名()
ENDCLASS
MODULEもCLASSも同義

・CONST 変数・・・名前.変数名で外部からアクセス可
・PUBLIC 変数・・・名前.変数名で外部からアクセス可
・DIM 変数・・・外部からアクセス不可
・PROCEDURE モジュール名/クラス名・・・コンストラクタ
・PROCEDURE 関数名()
・FUNCTION 関数名()

変数、関数をセットにした1つのグループを定義する際に使用

例えば、HUMANというオブジェクトがあったとします。
このオブジェクトには、NAMEという変えられない定数、
FEELINGという変数、そしてSPEAKという関数や
WALKという関数が備わっているとします。
これらの定数、変数、関数をバラバラに定義することも可能ですが、
HUMANというオブジェクトの中に収め、意味のあるグループで
まとめるたほうがよい場合が多々あります。
※メンテナンスがしやすい
※スクリプトの可読性が高まる
※変更してよい変数、してはいけない変数が明確になり、改修や影響調査がしやすい
などなど
もしオブジェクト指向という情報技術の一分野を学ぶ際には、
こういった考え方を知っておくのは大変役に立つでしょう。
まずは上のHUMANというオブジェクトを組み立ててみましょう。

//まずは喋らせてみる
MSGBOX(HUMAN.SPEAK())

//気分を変えてみる
HUMAN.FEELING = "I feel so bad"

//もう一度喋らせてみる
MSGBOX(HUMAN.SPEAK())

//歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()
//もう一度歩かせて見ます
HUMAN.WALK()

//MODULE-ENDMODULEとしてもよい
CLASS HUMAN
 CONST NAME = "John"
 PUBLIC FEELING = "I'm Happy"
 DIM STEPS
 PROCEDURE HUMAN()
  THIS.STEPS = 10
 FEND 
 FUNCTION SPEAK()
  RESULT = "My name is " + THIS.NAME + " " + THIS.FEELING
 FEND
 PROCEDURE WALK()
  THIS.STEPS = THIS.STEPS + 1
  PRINT THIS.STEPS + "歩目を踏み出しました"
 FEND
ENDCLASS

使い方

たとえば、汎用的な作業を別ファイルに書き出すとします。
UWSCではCALLを使うことで、
外部スクリプトを呼び出せますので、
よくある処理をまとめておけば、再度開発する手間が省けます。
こういう場合に、同じ名前の変数(関数)を使った/作ってしまった、
というケースは割とあります。
また、変数や関数が意味もなく、羅列してあるので収集がつかなくなったり
スクリプトのメンテナンス性が著しく悪くなってしまったりするケースもあります。
こういう場合にMODULEやCLASSを導入することで、
名前の被り(MODULE名やCLASS名が異なれば、内部の変数は被っても大丈夫)
意味のない関数、変数の乱雑さを抑止することができます。
下記のスクリプトは先ほどのスクリプトに一つ一つコメントを入れたものです。
導入する際のメリットになれば幸いです。

この投稿の続きを読む »

タグ

2012年9月15日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

THREAD

THREAD

THREAD 関数名()

スレッドを生成し、指定した関数を実行する

並列で作業させたい場合に活用

THREADはコンピューターの処理単位の1つだと思ってください。
通常、コンピューターは上から順番に処理をして行きますが、
THREADを実行することにより、その関数は別プロセス(別スレッド)で立ち上がり
独自に処理されていきます。
簡単な例を下に記します。
実行させてみるとわかりますが、
最初のA部とB部は1つ1つ処理されますが、
後半のC部とD部は並行処理されます。

FOR A = 1 TO 5
 SLEEP(1)
 FUKIDASI("A:" + (5 - A),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT


FOR B = 1 TO 5
 SLEEP(1)
 FUKIDASI("B:" + (5 - B),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT

MSGBOX("AとBが順番に処理されました。続いてTHREADで実施します。")


THREAD ExecuteC()

FOR D = 1 TO 5
 SLEEP(1)
 FUKIDASI("D:" + (5 - D),G_MOUSE_X,G_MOUSE_Y,0,20)
NEXT


PROCEDURE ExecuteC()
 FOR C = 1 TO 5
  SLEEP(1)
  FUKIDASI("C:" + (5 - C),G_MOUSE_X + 50,G_MOUSE_Y + 50,0,20)
 NEXT
FEND

並列で処理させてみよう

以下のスクリプトでは、メモ帳を立ち上げ、片方には英語、もう一方には日本語を書き込みます。
THREADですので、同時に実行されます。

この投稿の続きを読む »

タグ

2012年9月9日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

COMオブジェクト操作関連

COMオブジェクト操作関連関数

COMについては上級者編で解説されております。
関数を使用した具体的なCOMオブジェクトの活用例は上級者編をご参照下さい。

CREATEOLEOBJ

COMオブジェクト生成
戻値 = CREATEOLEOBJ( COMオブジェクト名 )
引数
 COMオブジェクトを指定
戻値
 COMオブジェクト
なお、COMからメソッド使用時に引数に値取得がある場合
引数の変数の前にVarを付記


GETACTIVEOLEOBJ

既に起動中のCOMオブジェクトを取得
戻値 = GETACTIVEOLEOBJ(COMオブジェクト名,[タイトル, 順番])
引数
 COMオブジェクトを指定
 タイトル: 複数時にタイトルで区別(部分一致可)
 なお、Excel、Access、Wordの場合はファイル名を指定
 IE、Office以外では無効
 順番: IEのみ有効、タイトルが同じ時に区別
戻値
 COMオブジェクト


GETOLEITEM

コレクションの取得
戻値 = GETOLEITEM( コレクションプロパティ名)
引数
 コレクションプロパティ名:COMオブジェクトのコレクション取得プロパティ名を指定
戻値
 取得したコレクションの数
 取得したコレクションは配列変数の
 ALL_OLE_ITEM[ ]に配列ゼロから格納


OLEEVENT

イベント処理の定義
OLEEVENT( COMオブジェクト, インタフェース名, イベント名, Procedure名)
引数
 COMオブジェクトを指定
 インタフェース名: ディスパッチインタフェース名
 イベント名
 Procedure名:UWSC側Procedure
 Procedure内にてイベントの引数は配列変数EVENT_PRM[ ]に配列ゼロから格納


COM_ERR_IGN-COM_ERR_RET

COMエラーメッセージの抑止
COM_ERR_IGN
 ・・・COM処理・・・
COM_ERR_RET
COM処理中のエラーはCOM_ERR_FLG にTRUEが設定


SAFEARRAY

SAFEARRAY型の作成
戻値 = SAFEARRAY( [下限, 上限])
引数
 下限: 配列の下限を設定
 上限: 配列の上限を設定
戻値
 作成されたSAFEARRAY型を返す


タグ

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

カテゴリー:関数一覧

EXIT

EXIT

関数を終了する
EXIT

自作関数を途中で終了する場合

ループを途中で終了するにはBREAKを使いますが
自作関数を途中で終了する場合はEXITを使います。

//自作関数HELLOはあいさつ文を返す
PRINT HELLO("CN")
//但し、存在しないパラメーターを渡した場合は終了する
FUNCTION HELLO(LANG="EN")
 HELLO = "UNKNOWN"
 SELECT LANG
   CASE "EN"
     HELLO = "Hello"
   CASE "JP"
     HELLO = "こんにちは"
   CASE "FR"
     HELLO = "Bonjour"
   DEFAULT
    EXIT
 SELEND
 //もしEXITがなければ最初に設定されたUNKNOWNが出る。けどもEXITで終了しているため出ない。
 RESULT = HELLO
FEND

再帰的な処理を表現してみよう

例えばある自作関数を宣言し、
その中で、その自作関数を再度呼び出します。
特に条件が無ければ、無限ループのように
ずっと再帰的に処理がされます。
ここで、終了条件とEXITを組み合わせて使い、
自作関数を完成させましょう。
スクリプトは以下のようになります。

この投稿の続きを読む »

タグ

2012年7月30日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

自作関数の定義

UWSCで自作関数を定義する方法です
PROCEDURE 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, …. )
    処理
FEND

FUNCTION 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, …. )
    処理
    RESULT = 戻り値    // Result に戻り値を入れる
FEND

Var 宣言を付けると引数を変更可能とする(参照引数)
配列変数には次元数分 []を付ける (2次元配列の場合 引数[][] )
= 定数 にてデフォルトパラメータを指定できる
(デフォルトパラメータ以降に通常引数を書く事はNG)

戻り値のあるなしで書式が変わるので注意が必要です。
関数はFUNCTIONS.UWSなどでまとめて、
Call関数で呼び出して利用するとスッキリして分りやすいです。

自作関数を利用して消費税を得るスクリプト
PRE_PRICE = INPUT("金額を入力してください<#CR>※数字のみ")
AFTER_PRICE = TAX(PRE_PRICE)
PRINT "税込み価格:" + AFTER_PRICE

FUNCTION TAX(PRICE)

	TAX_PRICE = PRICE * 1.05
	RESULT	= INT(TAX_PRICE)
FEND

タグ

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

カテゴリー:逆引き関数

このページの先頭へ