DEF_DLL

DEF_DLL

DLL(API等)の関数を使用

DEF_DLL 関数名(型, 型, …): 戻り型: DLL名
int
long
bool
uint
hwnd
string
Wstring
float
double
word
dword
byte
char
pchar
Wchar
pWchar
boolean
longlong
Extended
SafeArray

・64bitのDLLは呼び出し不可
・参照引数(値変更あり)の場合はVar 宣言が必要
※関数名( var double, var int )
  ・構造体:型を { } に展開して記述
※関数名( double, {int, int, int} )
・配列の場合は型に [] を付記
※関数名( double[], int[] )
(※)int=long= bool(4byte)
(※)dword=uint=hwnd
(※)char=boolean(1byte)
(※)ヌルポインタを渡す時は NULL定数を使用

タグ

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

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

TRY-ENDTRY

TRY-FINALLY-ENDTRY

例外処理をする
TRY
  処理1
[EXCEPT]
  処理2
[FINALLY]
  処理3
ENDTRY

・TRY・・・処理1には例外が発生する可能性のある処理を記述
・EXCEPT・・・処理2には例外が発生した場合の処理を記述(FINALLYとの同時記述は不可)
・FINALLY・・・処理3は例外が発生する、しないにかかわらず必ず実行される処理を記述(EXCEPTとの同時記述は不可)
・ENDTRY・・・例外処理の終了

例外とはエラーのこと

例えば、値を初期化していない変数を出力しようとした場合、
UWSCではエラーとなってしまいます。
他にも、ある数値を0で割ろうとした場合(ゼロ除算)、
同様にエラーが発生します。
このようにプログラム中は予期しないエラーが発生するケースが
多々あります。
TRY-ENDTRYはそのような可能性のある箇所に記述することで
例外発生時の処理を記述することができ、
プログラムを異常終了することなく
継続させることができます。

VAL = INPUT("1以上の数値を入れてください※と指示しても0やら文字列やらを入力する人はいる","あああああああ")
//エラーが発生する可能性があるので例外処理を記述
TRY
  PRINT 100 / VAL
EXCEPT
 //例外が発生した場合
 MSGBOX("正しい値が入力されていないようです")
ENDTRY

例外発生時の情報も取得可能

TRY_ERRMSGにはエラーの情報が
TRY_ERRLINEにはエラー発生した行数が格納されています。
下記のようにして出力してみましょう。

この投稿の続きを読む »

タグ

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

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

TEXTBLOCK-ENDTEXTBLOCK

TEXTBLOCK-ENDTEXTBLOCK

TEXTBLOCK 変数名
・・・・・・・・
・・・・・・・・
ENDTEXTBLOCK

・複数行にわたる文字列を変数に格納します

特殊文字を入れなくても改行を反映

TEXTBLOCK-ENDTEXTBLOCKを使うことにより
特殊文字の改行を記述しなくても、
改行を変数に挿入できます。

PRINT HELLOTEXT
TEXTBLOCK HELLOTEXT
こ
ん
に
ち
は
ENDTEXTBLOCK

OPTION SPECIALCHAR

ちなみにOPTION指定を指定するとTEXTBLOCKの特殊文字は変換されなくなります。
下記のようになります。

この投稿の続きを読む »

タグ

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

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

WITH-ENDWITH

WITH-ENDWITH

モジュール、クラス、COMオブジェクトの表記などのドット構文にて指定部分を省略して表記できる
WITH ドット構文共通部
.変数 = < 値>
.関数()
ENDWITH

・ドット構文共通部・・・ドットで区切られた部分の省略したい箇所
・変数・・・ドットを付けて変数を記述することで呼び出し可能
・関数・・・ドットを付けて関数を記述することで呼び出し可能

何度も同じ表記をするのは面倒くさい時に

上級者編で述べているCOMオブジェクトなどはドットで区切られた構文を多様します。
理解が進むと、段々感じてくると思いますが、
記述内容の繰り返しが多く出てきます。
まとめて同じドット以下に処理をしたい場合はWITH-ENDWITHを使いましょう。
以下、簡単な使い方です。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True
IE.navigate("http://www.yahoo.co.jp")
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readyState = 4

WITH IE.document
  .TITLE = "やっほー"
ENDWITH

必要に応じて使おう

上の例ですと、ブラウザがアクセスしたページのタイトルだけ変えています。
こういう場合は大した威力は発揮できませんが、
数が多い場合には是非とも活用して下さい。
次に、MODULE-ENDMODULE、CLASS-ENDCLASSで説明した
サンプルスクリプトを WITH-ENDWITHで呼び出してみましょう。
以下のようになります。

この投稿の続きを読む »

タグ

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

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

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日 | コメントは受け付けていません。 |

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

16進数

16進数

$<16進数>

$を付記することで、16進数の値を表記できます

16進数を使う場合

例えば16進数のFFは10進数の255に該当します。
UWSCでは$を付記した、$FFという形で16進数を表現できます。
もちろん出力すると255となります

PRINT $FF

16進数←変換→10進数

FORMAT関数には16進数表記にするパラメーターがあります。
組み合わせて、変換をしてみましょう。

この投稿の続きを読む »

タグ

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

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

特殊文字

特殊文字

< #CR>・・・改行
< #DBL>・・・ダブルクォテーション
< #TAB>・・・タブ

・改行、ダブルクォテーション、タブを文字列で表現する場合は特殊文字で表記する

そのまま書けない文字列は特殊文字で

改行や、ダブルクォテーションをそのままスクリプトに記入すると
正しく動作しません。特殊文字で置き換えます。

PRINT "改行<#CR>改行。<#DBL>ダブルクォテーション<#DBL>。"
PRINT "タブ<#TAB>タブ"

OPTION SPECIALCHAR

ちなみにOPTION指定を指定するとTEXTBLOCKの特殊文字は変換されなくなります。
下記のようになります。

この投稿の続きを読む »

タグ

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

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

組込み定数

組み込み定数

予め定数として組み込まれている定数
宣言は不要

TRUE・・・True、1も同義
FALSE・・・False、0も同義
NULL・・・ヌルポインタ
EMPTY・・・値の無い状態を示す
NOTHING・・・オブジェクトの無い状態を示す

定数のため変更はできず、かつ宣言済

上記の定数は
既に宣言されているため、再宣言や変更はできません。
スクリプトを書く際にも、上記の定数は表記するだけで、
決まった値を取得できます。

PRINT TRUE //True、1も同義
PRINT FALSE //False、0も同義
PRINT NULL //ヌルポインタ
PRINT EMPTY //値の無い状態を示す
PRINT NOTHING //オブジェクトの無い状態を示す

NULL、EMPTY、NOTHINGの違いは?

TRUE/FALSEは出力される値が違うので
一目瞭然ですが、それ以外のNULL、EMPTY、NOTHINGは
パッと見、違いが良く分かりません。
一行で説明すると・・・
・NULL・・・ヌルポインタ
・EMPTY・・・値が無い状態
・NOTHING・・・オブジェクトが無い状態
となります。
それでは、次の質問に正確に回答できるでしょうか。
もし出来たらかなりUWSCに精通していることになります。
・NULL、EMPTY、NOTHINGは”"や0と等価でしょうか( = で比較するとTrueになるか)
・NULLとEMPTYとNOTHINGはそれぞれ等価でしょうか( = で比較するとTrueになるか)
・NULLとEMPTYとNOTHINGをそれぞれ単体で出力するとどのようになるでしょうか
・NULLとEMPTYとNOTHINGを加算に使うとどうなるでしょうか
・NULLとEMPTYとNOTHINGの文字列の長さ(LENGTH関数の返り値)はいくつでしょうか
以下のスクリプトで検証してみましょう。

この投稿の続きを読む »

タグ

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

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

行結合

行結合

_(アンダーバー)

・_(アンダーバー)を行末につけることで次行を結合して処理を行います

基本は1処理1行だけど・・・

UWSCは基本1処理1行です。
例えばA = 1 + 1を表現する際に
A
=
1
+
1
と書いてもエラーになります。
表現したい場合は_(アンダーバー)で、行結合をします。

A _
= _
1 _
+ _
1
PRINT A

行結合の用途は?

例えばIFの条件式が長くなり、見た目がよくないと感じたとします。
そういう場合はただ改行しても、思うように動作しないので
行結合を試みます。
下記のようになります。

この投稿の続きを読む »

タグ

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

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

このページの先頭へ