Schönen guten Abend!
Ich habe heute wieder mit der AutoItObject UDF herumgespielt und hatte das Bedürfnis einfach mal ein Objekt aus dem .NET Framework zu programmieren. Bei dieser UDF handelt es sich lediglich um eine Kopie (ich greife nicht wirklich auf das .NET Framework zu) der BitArray-Klasse. Ich habe diese Klasse bewusst gewählt da Sie mir als Übung recht einfach erschien und eben noch nicht via ObjCreate() ansprechbar ist. Diese Klasse ist dafür gedacht mit Booleschen Werten zu arbeiten und einzelne Bits in einem Array ansprechen zu können. Zwar ist meine Implementierung der Klasse nicht so schnell wie die Bit-Funktionen, ist aber von der Syntax und der Handhabung anders. Alternativ verlinke ich einfach mal zu meiner Bit.au3 da diese auch ganz gut in die Thematik passt.
Insgesamt werden folgende Funktionalitäten unterstützt:
Konstruktoren:
BitArray(BitArray)
BitArray(Boolean())
BitArray(Int32)
BitArray(Int32, Boolean)
Eigenschaften:
Count
Item
Length
Methoden:
And
Clone
ToArray (original: CopyTo)
Equals(Object)
Get
Not
Or
Set
SetAll
ObjType (original: ToString)
Xor
Alles anzeigen
Was welches Attribut, Eigenschaft oder Methode bewirkt ist in der oberen verlinkten Referenz nachzulesen. Habe mich bemüht alles genau so umzusetzen wie es dort beschrieben ist. Als Zusatz gibt es das Attribut $oBitArray.Error welches euch anzeigt ob die letzte Funktion fehlerhafte Eingaben entgegen nahm. Dieses Attribut ist Objekt bezogen und wird solange nicht überschrieben bis einer der Methoden aufgerufen wird. Bei irgendwelche fehlerhaften Eingaben wird dieses Attribut auf 1 gesetzt.
ToArray
Hier muss weder Array noch Index (anders als wie in der Referenz) übergeben werden. Es wird lediglich ein Abbild des BitArray als normales Array zurückgegeben.
ObjType
Wird genau so verwendet wie in der Referenz angegeben. Einziger Unterschied ist jedoch, dass nicht „System.Collections.BitArray“ sondern „AutoItObject.Collections.BitArray“ zurückgegeben wird. Daher auch die veränderte Bezeichnung und die Umwandlung von einer Methode zu einem Attribut.
Eigentlich dürfte die UDF soweit selbsterklärend sein. Mit der Referenz wird auch der Verwendungszweck schnell klar. Vielleicht kann diese ja jemand gebrauchen. Wenn nicht, auch nicht schlimm.
Falls Fragen oder Probleme auftauchen, ich stehe zur Stelle. Im Anhang findet ihr nochmals die oBitArray.au3 sowie die AutoItObject.au3 als ZIP Archiv. Falls jemand konkrete Wünsche hat dass ich mal ein paar .NET Framework Klassen als AutoIt Version übersetze, kann er / sie sich bei mir melden. Ansonsten viel Spaß!
oBitArray.au3
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include-once
#include "AutoItObject.au3"
_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func _BitArray_Object($vValue, $bValue = Default)
If IsObj($vValue) And $vValue.ObjType = 'AutoItObject.Collections.BitArray' Then
Return $vValue.Clone()
ElseIf IsArray($vValue) And UBound($vValue, 0) = 1 Then
Local $bBool = True
Local $iIndex
For $iIndex = 0 To UBound($vValue) -1
$bBool = $bBool And IsBool($vValue[$iIndex])
Next
If $bBool Then
Local $oBitArray = _BitArray_Object(UBound($vValue))
For $iIndex = 0 To $oBitArray.Count -1
$oBitArray.Set($iIndex, $vValue[$iIndex])
Next
Return $oBitArray
EndIf
ElseIf IsInt($vValue) And $vValue > 0 Then
Local $oBitArray = _BitArray_Class().Object
$oBitArray.Length = $vValue
$oBitArray.SetAll(IsBool($bValue) ? $bValue : False)
Return $oBitArray
EndIf
Return SetError(1)
EndFunc
Func _BitArray_Class()
Local $oBitArray = _AutoItObject_Class()
Local $aArray[1]
With $oBitArray
; Private Scope
.AddProperty('_BitArray_', $ELSCOPE_PRIVATE, $aArray)
; Attributes
.AddProperty('Count', $ELSCOPE_READONLY)
.AddMethod('Item', '__oBitArray_Item')
.AddMethod('Length', '__oBitArray_Length')
.AddProperty('ObjType', $ELSCOPE_READONLY, 'AutoItObject.Collections.BitArray')
; Methods
.AddMethod('And', '__oBitArray_And')
.AddMethod('Clone', '__oBitArray_Clone')
.AddMethod('Equals', '__oBitArray_Equals')
.AddMethod('Get', '__oBitArray_Get')
.AddMethod('Not', '__oBitArray_Not')
.AddMethod('Or', '__oBitArray_Or')
.AddMethod('Set', '__oBitArray_Set')
.AddMethod('SetAll', '__oBitArray_SetAll')
.AddMethod('ToArray', '__oBitArray_ToArray')
.AddMethod('Xor', '__oBitArray_Xor')
; Special
.AddProperty('Error', $ELSCOPE_READONLY)
.AddMethod('SetError', '__oBitArray_SetError', $ELSCOPE_PRIVATE)
.AddMethod('__default__', '__oBitArray_Default')
.AddEnum('__oBitArray_EnumNext', '__oBitArray_EnumReset')
EndWith
Return $oBitArray
EndFunc
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func __oBitArray_Item($oSelf, $iIndex, $bValue = Default)
$oSelf.SetError(0)
If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Then Return $oSelf.SetError(1)
If Not IsKeyword($bValue) Then $oSelf._BitArray_(($iIndex)) = $bValue Or False
Return $oSelf._BitArray_[$iIndex]
EndFunc
Func __oBitArray_Length($oSelf, $iValue = Default)
$oSelf.SetError(0)
If Not IsKeyword($iValue) Then
If Not IsInt($iValue) Or $iValue < 1 Then Return $oSelf.SetError(1)
Local $aBitArray = $oSelf._BitArray_
Local $iFrom = $oSelf.Count
Local $iIndex
ReDim $aBitArray[$iValue]
$oSelf._BitArray_ = $aBitArray
$oSelf.Count = $iValue
For $iIndex = $iFrom To $iValue -1
$oSelf.Set($iIndex, False)
Next
EndIf
Return $oSelf.Count
EndFunc
Func __oBitArray_And($oSelf, $oValue)
$oSelf.SetError(0)
If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
Local $oBitArray = _BitArray_Object($oSelf.Count)
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
$oBitArray.Set($iIndex, $oSelf.Get($iIndex) And $oValue.Get($iIndex))
Next
Return $oBitArray
EndFunc
Func __oBitArray_Clone($oSelf)
$oSelf.SetError(0)
Return _AutoItObject_Create($oSelf)
EndFunc
Func __oBitArray_Equals($oSelf, $oObj)
$oSelf.SetError(0)
If Not IsObj($oObj) Then Return $oSelf.SetError(1)
If $oSelf.ObjType <> $oObj.ObjType Or $oSelf.Count <> $oObj.Count Then Return False
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
If $oSelf.Get($iIndex) <> $oObj.Get($iIndex) Then Return False
Next
Return True
EndFunc
Func __oBitArray_Get($oSelf, $iIndex)
$oSelf.SetError(0)
If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Then Return $oSelf.SetError(1)
Return $oSelf._BitArray_[$iIndex]
EndFunc
Func __oBitArray_Not($oSelf)
$oSelf.SetError(0)
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
$oSelf.Set($iIndex, Not $oSelf.Get($iIndex))
Next
EndFunc
Func __oBitArray_Or($oSelf, $oValue)
$oSelf.SetError(0)
If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
Local $oBitArray = _BitArray_Object($oSelf.Count)
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
$oBitArray.Set($iIndex, $oSelf.Get($iIndex) Or $oValue.Get($iIndex))
Next
Return $oBitArray
EndFunc
Func __oBitArray_Set($oSelf, $iIndex, $bValue)
$oSelf.SetError(0)
If Not IsInt($iIndex) Or $iIndex < 0 Or $iIndex >= $oSelf.Count Or Not IsBool($bValue) Then Return $oSelf.SetError(1)
$oSelf._BitArray_(($iIndex)) = $bValue
EndFunc
Func __oBitArray_SetAll($oSelf, $bValue)
$oSelf.SetError(0)
If Not IsBool($bValue) Then Return $oSelf.SetError(1)
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
$oSelf.Set($iIndex, $bValue)
Next
EndFunc
Func __oBitArray_ToArray($oSelf)
$oSelf.SetError(0)
Return $oSelf._BitArray_
EndFunc
Func __oBitArray_Xor($oSelf, $oValue)
$oSelf.SetError(0)
If Not IsObj($oValue) Or $oSelf.ObjType <> $oValue.ObjType Or $oSelf.Count <> $oValue.Count Then Return $oSelf.SetError(1)
Local $oBitArray = _BitArray_Object($oSelf.Count)
Local $iIndex
For $iIndex = 0 To $oSelf.Count -1
$oBitArray.Set($iIndex, (Not $oSelf.Get($iIndex) And $oValue.Get($iIndex)) Or ($oSelf.Get($iIndex) And Not $oValue.Get($iIndex)))
Next
Return $oBitArray
EndFunc
Func __oBitArray_SetError($oSelf, $iError)
$oSelf.Error = $iError
EndFunc
Func __oBitArray_Default($oSelf, $iIndex, $bValue = Default)
$oSelf.SetError(0)
If IsKeyword($bValue) Then Return $oSelf.Get($iIndex)
$oSelf.Set($iIndex, $bValue)
EndFunc
Func __oBitArray_EnumNext($oSelf, ByRef $iCounter)
If $iCounter = $oSelf.Count Then Return SetError(1)
Local $bRet = $oSelf.Get(($iCounter))
$iCounter += 1
[/autoit] [autoit][/autoit] [autoit]Return $bRet
EndFunc
Func __oBitArray_EnumReset($oSelf, ByRef $iCounter)
$iCounter = 0
Return True
EndFunc
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]PS: Beispiele schreibe ich noch irgendwann.