Contents
文字列を評価し値を返します。
- 構文
- void = EVAL( 文字列 )
- 引数
- 文字列
- 評価(実行)する文字列
- 戻り値
- 結果得られた値を返す
A = B は比較演算として処理、代入式の場合は A := B とする
プログラム実行例
CLKITEMで操作できる項目を取得
PUBLIC flg = FALSE
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
SETHOTKEY(VK_X, MOD_ALT, "flag")
DIM array[] = "BTN", "LIST", "TAB", "MENU", "TREEVIEW", + _
"LISTVIEW", "EDIT", "STATIC", "STATUSBAR", "TOOLBAR", + _
"LINK", "ACCCLK", "ACCCLK2", "ACCTXT", "ACCEDIT", + _
"FROMLAST", "BACK"
REPEAT
FUKIDASI("Alt + Xでカーソル下の情報を取得")
SLEEP(0.001)
UNTIL flg
FUKIDASI("取得中")
DIM ID = GETID(GET_FROMPOINT_WIN)
PRINT "DIM ID = GETID(<#DBL>" + STATUS(ID, ST_TITLE) + "<#DBL>, <#DBL>" + STATUS(ID, ST_CLASS) + "<#DBL>)"
PRINT
FOR item IN array
PRINT "// [" + item + "]"
FOR class IN GETITEM(ID, EVAL("ITM_" + item), -1)
PRINT "CLKITEM(ID, <#DBL>" + class + "<#DBL>, CLK_" + item + ")"
NEXT
PRINT
NEXT
PROCEDURE forceQuit()
EXITEXIT
FEND
PROCEDURE flag()
flg = TRUE
FEND
解説
- 1行目
- Alt+Xの入力を検知するための変数。
PUBLIC flg = FALSE
- 3行目
- ESCキーが入力されたらforceQuit関数を呼び出す。
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
- 4行目
- Alt+Xが入力されたらflag関数を呼び出し、変数flgにTrueを代入。
SETHOTKEY(VK_X, MOD_ALT, "flag")
- 11-14行目
- 変数flgにTrueが代入されるまで待機する。
REPEAT FUKIDASI("Alt + Xでカーソル下の情報を取得") SLEEP(0.001) UNTIL flg
- 18行目
- マウスカーソル下のウィンドウのIDを取得する。
DIM ID = GETID(GET_FROMPOINT_WIN)
- 20行目
- マウスカーソル下のウィンドウのタイトルとクラス名を出力。
PRINT "DIM ID = GETID(" + STATUS(ID, ST_TITLE) + ", " + STATUS(ID, ST_CLASS) + ")"
- 23,29行目
- 配列arrayの要素数だけループ。
FOR item IN array … NEXT
- 25-27行目
- 第二引数に指定した項目のキャプションやリスト等を取得する。For In構文に指定した場合は各要素が返されます。
FOR class IN GETITEM(ID, EVAL("ITM_" + item), -1) PRINT "CLKITEM(ID, " + class + ", CLK_" + item + ")" NEXT
入力された文字列の計算をする
HASHTBL variable
DIM array[-1]
DIM res = EMPTY
WHILE TRUE
DIM %val% = ""
FOR i = 0 TO LENGTH(variable) - 1
%val% = %val% + variable[i, HASH_KEY] + "=" + variable[i, HASH_VAL] + " "
NEXT
DIM str = INPUT("計算式を入力してください。<#CR><#CR>変数<#TAB>" + %val% + "<#CR>結果<#TAB>" + res)
IFB POS("=", str) THEN
DIM arr = SPLIT(str, "=")
TRY
variable[arr[0]] = EVAL(arr[1])
EXCEPT
FUKIDASI(TRY_ERRMSG)
CONTINUE
ENDTRY
ENDIF
FUKIDASI()
res = EVAL(REPLACE(str, "=", ":="))
IF res = EMPTY THEN BREAK
WEND
- 結果
INPUT:10>a=2 INPUT:10>b=3 INPUT:10>a*b 6
二次方程式を解く
DIM frac[2]
DIM coeff = SPLIT(INPUT("係数を入力してください。「ax^2+bx+c=0」の「a,b,c」を入力。"), ",")
DIM a = coeff[0]
DIM b = coeff[1]
DIM c = coeff[2]
// 判別式
DIM D = EVAL("POWER(b, 2) - 4 * a * c")
DIM ans[-1]
DIM digit = -3
SELECT TRUE
CASE D > 0
IFB b = 0 THEN
DIM root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
// 約分する
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(D)
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + "))/" + (frac[1] / num)))
ENDIF
ENDIF
CASE D = 0
arrayPush(ans, ROUND(EVAL("-b/(2*a)"), digit))
CASE D < 0
IFB b = 0 THEN
root = simplifySqrt(D)
frac[0] = root[0]
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = frac[0] + "/" + frac[1]
ENDIF
arrayPush(ans, (IIF(frac[0] / num <> 1, frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
arrayPush(ans, (IIF(frac[0] / num <> 1, -frac[0] / num, "") + IIF(root[1] <> 1, "√(" + root[1] + ")", "")))
ELSE
frac[0] = EVAL("-b")
frac[1] = EVAL("2 * a")
num = GCD(frac)
IFB frac[1] = ABS(num) THEN
res = frac[0] / ABS(num)
ELSE
res = IIF(frac[0] * frac[1] < 0, "-", "") + ABS(frac[0] / num) + "/" + ABS(frac[1] / num)
ENDIF
// ルートの中から整数を外に出す
root = simplifySqrt(ABS(D))
frac[0] = root[0]
num = GCD(frac)
IFB frac[1] = num THEN
arrayPush(ans, res + "+" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
arrayPush(ans, res + "-" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i"))
ELSE
arrayPush(ans, res + "+(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
arrayPush(ans, res + "-(" + (IIF(frac[0] / num <> 1, frac[0] / num, "") + "√(" + root[1] + ")i)/" + (frac[1] / num)))
ENDIF
ENDIF
SELEND
PRINT REPLACE(IIF(a <> 1, a, "") +"x^2+" + b + "x+" + c, "+-", "-")
PRINT "-----"
FOR item IN ans
PRINT item
NEXT
//////////////////////////////////////////////////
// 【引数】
// num : ルートの中
// 【戻値】
// 整数を外に出す
//////////////////////////////////////////////////
FUNCTION simplifySqrt(num)
HASHTBL root
DIM arr = primeFactorization(num)
DIM a = 1, b = 1
FOR item IN arr
root[item] = root[item] + 1
NEXT
FOR n = 0 TO LENGTH(root) - 1
IF INT(root[n, HASH_VAL] / 2) <> 0 THEN a = a * POWER(root[n, HASH_KEY], INT(root[n, HASH_VAL] / 2))
IF (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2)) <> 0 THEN b = b * (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2))
NEXT
DIM res[1] = a, b
RESULT = SLICE(res)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// arr : 最大公約数を求める数値を格納した配列
// 【戻値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(arr[])
DIM c = LENGTH(arr)
DIM rem = arr[c-1] MOD arr[c-2]
IFB rem = 0 THEN
IFB LENGTH(arr) = 2 THEN
RESULT = arr[c-2]
EXIT
ENDIF
RESIZE(arr, c-2)
RESULT = GCD(arr)
EXIT
ENDIF
arr[c-1] = arr[c-2]
arr[c-2] = rem
RESULT = GCD(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// num : 素因数分解する数値
// 【戻値】
// 素因数分解した数値を格納した配列
//////////////////////////////////////////////////
FUNCTION primeFactorization(num)
DIM arr[-1]
// 偶数なら2で割り続ける
WHILE num MOD 2 = 0
arrayPush(arr, 2)
num = num / 2
WEND
FOR n = 3 TO num
WHILE num MOD n = 0
arrayPush(arr, n)
num = num / n
WEND
NEXT
RESULT = SLICE(arr)
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- 結果
4x^2+5x+3 ----- -5/8+(√(23)i)/8 -5/8-(√(23)i)/8
指定期間のメール情報を取得(Outlook)
CONST olFolderInbox = 6
CONST xlTop = -4160
CONST xlLeft = -4131
DIM Excel = ExcelBoot()
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderInbox)
DIM Items = Folder.Items
DIM start = "2021/01/01"
DIM end = "2021/12/31"
Items = Items.Restrict("[ReceivedTime] >= '" + start + "' AND [ReceivedTime] < '" + end + "'")
DIM array[][1] = "BCC", "BCC", + _
"本文", "Body", + _
"CC", "CC", + _
"エントリID", "EntryID", + _
"HTML本文", "HTMLBody", + _
"重要度", "Importance", + _
"変更日時", "LastModificationTime", + _
"受信者表示名", "ReceivedByName", + _
"受信日時", "ReceivedTime", + _
"送信者メールアドレス", "SenderEmailAddress", + _
"送信者表示名", "SenderName", + _
"サイズ", "Size", + _
"件名", "Subject", + _
"受信者表示名", "To", + _
"未読", "UnRead"
FOR i = 0 TO UBound(array)
Excel.Cells(1, i + 1).Value = array[i][0]
NEXT
DIM row = 2
FOR MailItem IN Items
WITH MailItem
FOR i = 0 TO UBound(array)
Excel.Cells(row, i + 1).Value = EVAL("." + array[i][1])
NEXT
ENDWITH
row = row + 1
NEXT
WITH Excel.Cells
.ColumnWidth = 20
.RowHeight = 30
.VerticalAlignment = xlTop
.HorizontalAlignment = xlLeft
ENDWITH
//////////////////////////////////////////////////
// 【引数】
// path : 開くファイルのパス名
// 【戻値】
// Excelオブジェクト
//////////////////////////////////////////////////
FUNCTION ExcelBoot(path = "")
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
IFB path = "" THEN
Excel.Workbooks.Add
ELSE
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
IFB FSO.GetParentFolderName(path) = "" THEN
path = GET_CUR_DIR + "\" + path
ENDIF
Excel.Workbooks.Open(path)
ENDIF
RESULT = Excel
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- ExcelBoot
- CREATEOLEOBJ
- Application.GetNamespace メソッド
- NameSpace.GetDefaultFolder メソッド
- Folder オブジェクト
- Folder.Items プロパティ
- Items.Restrict メソッド
- UBound
- Application.Cells プロパティ
- Range オブジェクト
- Range.Value プロパティ
- MailItem オブジェクト
- EVAL
- MailItem.BCC プロパティ
- MailItem.Body プロパティ
- MailItem.CC プロパティ
- MailItem.EntryID プロパティ
- MailItem.HTMLBody プロパティ
- MailItem.Importance プロパティ
- MailItem.LastModificationTime プロパティ
- MailItem.ReceivedByName プロパティ
- MailItem.ReceivedTime プロパティ
- MailItem.SenderEmailAddress プロパティ
- MailItem.SenderName プロパティ
- MailItem.Size プロパティ
- MailItem.Subject プロパティ
- MailItem.To プロパティ
- MailItem.UnRead プロパティ
- MailItem.ReceivedTime プロパティ