(for Internet Explorer)
Sub  ShakerSort_fromDic( dic as Dictionary, out_arr as object array,
        sign as integer, compare_func as function, param as variant )
【引数】
dic
ソートするデータが入った辞書。(辞書はソートされません)
辞書に入っているデータをシェーカーソートします。
ソートした結果の配列。配列の要素はオブジェクト。
out_arr
compare_func
比較関数
param
compare_func の第3引数
参考
sign
正の数=dic の順がベース、負の数=dicの逆順がベース(*1)
sign 引数の説明
sign < 0 のときでも、compare_func は、sign > 0 のときの compare_func の返り値の
マイナスを返すようにしてください。
Sub  ShakerSort( Arr as array of Object, iLeft as integer, iRight as integer,
                 CompareFunc as function, Param as variant )
【引数】
Arr
iLeft
ソートする配列。
ソートする範囲。配列番号の最小値
配列をシェーカーソートします。安定ソートです。
ソートする範囲。配列番号の最大値
iRight
CompareFunc
比較関数
Param
compare_func の第3引数
Option Explicit

Class  ClassA : Public id : End Class

Redim  arr(5)
Set arr(1) = new ClassA : arr(1).id = 6
Set arr(2) = new ClassA : arr(2).id = 3
Set arr(3) = new ClassA : arr(3).id = 4
Set arr(4) = new ClassA : arr(4).id = 4
Set arr(5) = new ClassA : arr(5).id = 1


ShakerSort  arr, 1, UBound( arr ), GetRef("CmpFunc1"), Empty


WScript.Echo  arr(1).id &","& arr(2).id &","& arr(3).id &","& _
              arr(4).id &","& arr(5).id

Function  CmpFunc1( left, right, param )
  CmpFunc1 = left.id - right.id    '// 降順なら right.id - left.id
End Function
サンプル
→ [T_ShakerSort] ShakerSort のテスト
  Dim    line
  ReDim  lines(-1)
  Set f = OpenForRead( target_result_txt )
  Do Until  f.AtEndOfStream
    Set line = new String1
    line.s = f.ReadLine()
    ReDim Preserve  lines( UBound( lines ) + 1 )
    Set lines( UBound( lines ) ) = line
  Loop
  f = Empty

  ShakerSort  lines, 0, UBound( lines ), GetRef("StrCmpFunc"), Empty

Function  StrCmpFunc( left, right, param )
  If     left.s < right.s Then
    StrCmpFunc = +1
  ElseIf left.s > right.s Then
    StrCmpFunc = -1
  Else
    StrCmpFunc = 0
  End If
End Function

Class  String1
  Public  s
End Class
文字列を昇順にソートするサンプル
配列の要素はオブジェクトであること。
→ PArray_doShakerSort (clib)
テスト
関連
Function  CInt2( v as string ) as integer
CInt でエラーが発生する値を v に指定したときは、0 を返します。
文字列を数値に変換します。
関連
" " で囲まれた部分を取り出す。
Function  MeltQuot( Line as string, in_out_Start as integer ) as string
i = 1
Do
  s = MeltQuot( line, i )
  If not IsEmoty( s ) Then (s を使った処理)
  If i = 0 Then Exit Do
Loop
【引数】
Line
in_out_Start
文字列全体
(入力) 取り出しを開始する文字の位置、(出力)次に取り出す〜
返り値
" " で囲まれた部分文字列。Empty=項目に値が無い
サンプル
Function  CreateGuid() as string
GUID を生成します。
2D7E3038-E395-460A-86CC-C8AB3C3D5D54
返り値の例:
Function  get_Object( Name as string ) as Object
静的オブジェクト (または演算器的なオブジェクト) を取得します。
【引数】
Name
取得するオブジェクトのクラス名
返り値
オブジェクト
サンプル:
関連
  Dim  name : name = "ClassA"
  Dim  obj : Set obj = get_Object( name )
Dim  g_ClassA

Function    get_ClassA()  '// has_interface_of ClassI
  If IsEmpty( g_ClassA ) Then _
    Set g_ClassA = new ClassA : ErrCheck
  Set get_ClassA =   g_ClassA
End Function
get_Object は、機能的には、"get_" + Name の関数を呼び出すだけなので、
別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、get_ClassA の関数が呼ばれます。
ClassI
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
Name が変数ではないときは、直接 get_ClassA を呼び出すことができます。
  Dim  obj : Set obj = get_ClassA()
new でオブジェクトを生成すると、get_ClassA で取得できるオブジェクトと別の
インスタンスになります。
Name が動的に変わることがないときは、get_ClassA 関数を直接呼び出して
ください。
→ T_GetObject.vbs [T_IncludeObjs1]
テスト
Function  get_ObjectFromFile( ModulePath as string, Name as string ) as Object
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
【引数】
ModulePath
Name
スクリプトファイルのパス
取得するオブジェクトのクラス名
返り値
取得したオブジェクト
  Dim  m : Set m = get_ObjectFromFile( "Lib\SampleLib.vbs", "Sample" )
サンプル: SampleLib.vbs ファイルで定義されている Sample オブジェクトを取得する。
上記サンプルは、下記と同じです。
  include  "Lib\SampleLib.vbs"
  Dim m : Set m = get_Sample()
オブジェクトを取得する部分は、機能的には、"get_" + Name の関数を呼び出すだけなので、
スクリプトファイルの中で、別途関数を定義する必要があります。 参考
→ T_GetObject.vbs get_ObjectFromFile [T_NewModule]
テスト
Sub  get_ObjectsFromFile( GetFuncs as string or Array of Function,
                          InterfaceName as string, out_Objs as Array of Object )
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
【引数】
GetFuncs
InterfaceName
スクリプトのパス、または include_objs の out_GetFuncs
Empty または、取得するオブジェクトが持つインターフェイス
out_Objs
取得したオブジェクトの配列
  get_ObjectsFromFile  "Lib\*_obj.vbs", "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードと同時に、静的オブジェクトを取得する
  include_objs  "Lib\*_obj.vbs", Empty, m_CreateFuncs '// [out] m_CreateFuncs
  get_ObjectsFromFile  m_CreateFuncs, "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードした後で、静的オブジェクトを取得する(ファイルを走査しない)
Sub  get_StaticObjects( InterfaceName, out_Obj )
  If IsEmpty( InterfaceName ) or  InterfaceName = "ClassI" Then
    Set  out_Obj = get_ClassA()
  ElseIf InterfaceName = "ClassI2" Then
    out_Obj = Array( get_ClassA(),  get_ClassB() )
  End If
End Sub
静的オブジェクトを一覧できるようにするには、それぞれのスクリプトで、get_StaticObjects
関数を定義する必要があります。 get_ObjectsFromFile や include_objs は、別のスクリプト
ファイルであれば、同じ関数名でも異なる関数インスタンスになります。
参考
→ T_GetObject.vbs [T_IncludeObjs2] [T_IncludeObjs3]
テスト
Sub  include_objs( Wildcard as string, Flags as Empty, out_GetFuncs as Array of Funcion )
静的オブジェクト・スクリプトファイルをインクルードします。
【引数】
Wildcard
Flags
スクリプトファイルのパス、またはフォルダパス
Empty を指定してください
out_GetFuncs
Empty、または、静的オブジェクトを取得する関数の集合
out_CreateFuncs が Empty ではないときのサンプル
include_objs は、インクルードのみ行います。 オブジェクトの生成は、new で生成するか、
get_ObjectsFromFile で行います。
サンプル: Lib フォルダをインクルードして、その中で定義された ClassA オブジェクトを生成する。
  include_objs  "Lib\*_obj.vbs", Empty, Empty
  Set obj : Set obj = new ClassA : ErrCheck
→ new_X_array
Flags = Empty かつ out_GetFuncs = Empty なら、include で代用できます。
関連
out_GetFuncs は、静的オブジェクトを取得する関数の集合です。 get_ObjectsFromFile の第1引数
に渡すと、文字列を渡したときより高速に処理します。
→ T_GetObject.vbs [T_IncludeObjs3]
テスト
Sub  get_DefineInfoObject( in_out_Object as DefineInfoClass, FullPath as string )
単純な DefineInfo オブジェクトを生成します。
参考
DefineInfo オブジェクトに FullPath プロパティしか必要ないときのみ使えます。
他のプロパティがあるときは、
Dim  g_SrcPath
Dim  g_Sample_vbs : get_DefineInfoObject  g_Sample_vbs, g_SrcPath

Class  SampleObj
  Public Property Get  DefineInfo() : Set DefineInfo = g_Sample_vbs : End Property
End Class
サンプル:
Function  get_NameDelegator( Name as string, TrueName as string,
                             InterfaceName as string ) as InterfaceName_Delegator
正式名オブジェクトに委譲する、一般名オブジェクトを取得します。
【引数】
Name
TrueName
一般名
正式名
InterfaceName
インターフェイス名 (*1)
参照
一般名オブジェクト (*2)
返り値
(*1)
(*2)
InterfaceName + "_Delegator" クラス(*1)のオブジェクト。
InterfaceName + "_Delegator" クラス(= 一般名オブジェクトのクラス)が定義されていて、
そのインスタンスを生成する new_InterfaceName_Delegator 関数が定義されていること。
new_InterfaceName_Delegator 関数については、
と、InterfaceName インターフェイスを持った
Class NameDelegator  '// defined_as_interface
  Public  Name
  Public Property Get  TrueName() : TrueName = NameDelegator_getTrueName( Me ) : End Property
  Public  m_Delegate ' as ClassA or ClassB or string(before validated)
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
End Class

Const  F_ValidateOnlyDelegate = &h40000000
Dim    g_bNeedValidateDelegate
Function  NameDelegator_getTrueName( m )
Sub       NameDelegator_validate( m, Flags )
Function  NameDelegator_getXML( m )
DefineInfo プロパティは、オプションです。
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
場面Aの関数
Name 以外は
参照
場面Aでの Name
場面Bでの Name
ある1つのインスタンス
TrueName
ClassI_Delegator クラス
場面Bの関数
ClassI
参考
Function  new_X( Name as string ) as object
文字列で指定した名前のクラスのオブジェクトを生成します。
Function  new_ClassA()
  Set new_ClassA = new ClassA
End Function
機能的には、"new_" + Name の関数を呼び出すだけなので、別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、new_ClassA の関数が呼ばれます。
→ new_from_file
関連
ただし、多くの場合、get_Object の方が適していることが多いので、get_Object を使うことを検討
してください。
サンプル:
Dim  obj : Set obj = new_X( "ClassA" )
.Keyword
.IsMatch
Function  StrMatchKey::IsMatch( TestStr as string ) as Boolean
* のワイルドカードを使って、マッチするかどうかを高速に判定します。
Property  Keyword  as string
ワイルドカードを含むキーワード。
TestStr が、.Keyword で設定したワイルドカードにマッチするかどうかを返す。
大文字小文字を区別しません。
.IsMatchULCase
TestStr が、.Keyword で設定したワイルドカードにマッチするかどうかを返す。
大文字小文字を区別します。
Function  StrMatchKey::IsMatch( TestStr as string ) as Boolean
サンプル:
  Dim  match : Set match = new StrMatchKey
  match.Keyword = LCase( "*.TXT" )
  If match.IsMatch( "file1.txt" ) Then
    :
  End If
file1.txt
*.TXT
大文字小文字を区別しないときは、LCase を使って小文字にしてください。
文字列を
と同じようにアクセスします。
.SetString( Str as string )
.ReadLine
.AtEndOfStream
1行取り出します。 TextStream 互換
すべて取り出したかどうか。 TextStream 互換
全体の文字列を設定する
[ テスト ]
LenK
Function  LenK( Str as string ) as integer
英文字を 1文字、日本語(文字コード256以上)を 2文字として文字数を返します。
サンプル:
LenK( "123" ) = 3
LenK( "123あいう" ) = 9
Function  DateAddStr( BaseDate as Date, Plus as string ) as Date
日付時刻の加減算をします。
サンプル:
d = DateAddStr( CDate("2009/1/1"), "+1month 10days" )  '// d = CDate("2009/2/11")
t = DateAddStr( CDate("17:00"), "-8hours" )  '// t = CDate("9:00")
t = DateAddStr( CDate("10:00"), "+1hours -5min" )  '// t = CDate("10:55")
t = DateAddStr( CDate("10:00"), "-1hours -5min" )  '// t = CDate("9:05")
Plus 引数
先頭は、"+" か "-" を指定します。 省略すると "+" になります。
先頭以外にも、"+" か "-" を指定できますが、先頭の "-" の影響を受けます。
単位に指定できるキーワードは次のものがあります。
"year", "years", "month", "months", "day", "days"
"hour", "hours", "minute", "minutes", "min", "second", "seconds", "sec"
関連
→ 時間の加減算 (clib)
Function  KeyClass::IsSame( Key as object ) as boolean
Function  KeyClass::SetKey( Key as object ) as object
キーとなるオブジェクトを登録します。 一度しか登録できません。 返り値は、Key です。
以前登録したキーと同じかどうかを判定します。
サンプル:
Dim  g_AppKey

  Dim  AppKey : Set AppKey = new KeyClass ' for Ident only
  Set  g_AppKey = new KeyClass : g_AppKey.SetKey( AppKey )
  If not g_AppKey.IsSame( AppKey ) Then  Err.Raise 1,,"Invalied AppKey"
以前登録した特定のオブジェクトかどうかを判定します。
KeyClass から特定のオブジェクトを取得することはできないので、グローバルスコープに、
KeyClass オブジェクトを置いても、特定のオブジェクトへの参照を複製することから守ります。
関連
レジストリのサブキーを列挙します。
指定のレジストリ・キーに入っている値を列挙します。
レジストリ・キーの値を .reg ファイルに出力します。
指定の拡張子の [開く(&O)] メニューのコマンドを登録します。
すべてのファイルに対するコンテキストメニューを追加登録します。
レジストリにライトします。
指定のレジストリ・キーか値が存在するかどうかを判定します。
Sub  RegEnumKey( Path as string, out_Keys as array of string, Opt as integer )
レジストリのサブキーを列挙します。
【引数】
Path
out_Keys
レジストリのキーのパス
(出力) サブキーの名前の配列
ファイル:
System.vbs
  Dim  keys

  RegEnumKey  "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\" + _
              "Windows\CurrentVersion", keys, Empty
サンプル:
Opt
オプション。 Empty か F_SubFolder
サブキーが無いときは、UBound( out_Keys ) = -1 になります。
Sub  RegEnumValues( Path as string, out_Values as array of RegValueName )
指定のレジストリ・キーに入っている値を列挙します。
【引数】
Path
out_Values
レジストリのキーのパス
(出力) 値と型名の配列
ファイル:
System.vbs
Class  RegValueName
  Public  Name  as string
  Public  Type_ as string
End Class
  Dim  values

  RegEnumValues  "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\" + _
                 "CurrentVersion\Setup", values
サンプル:
Sub  RegExists( RegPath as string )
指定のレジストリ・キーか値が存在するかどうかを判定します。
【引数】
RegPath
レジストリのキーのパス
ファイル:
System.vbs
  If RegExists( "HKEY_CURRENT_USER\Software\_Test\" ) Then  Fail
サンプル:
Path の末尾が \ のときは、キーがあるかどうかを判定します。
Path の末尾が \ ではないときは、値があるかどうかを判定します。
Function  RegRead( Path ) as variant
との違いは、キーが見つからないときにエラーになるのではなく、
Empty を返すところです。
レジストリからリードします。
【引数】
返り値
値、または Empty
リードする場所。キーまたは値の名前へのパス。
Path
Sub  RegExport( RegPath as string, OutFilePath as string, Opt as variant )
指定のレジストリ・キーに入っている値を .reg ファイルに出力します。
【引数】
RegPath
OutFilePath
レジストリのキーのパス
出力ファイルパス
ファイル:
System.vbs
Opt
オプション。 Empty か F_SubFolder
  RegExport  "HKEY_CURRENT_USER\Control Panel\Keyboard", _
             "keyboard.reg", F_SubFolder
サンプル:
(src)