[autoit]
$pattern = ".+>"
[/autoit]$pattern = ".+>"
[/autoit]Hi und Willkommen,
zeig uns doch mal dein bisheriges Skript.
Dann können wir dir bei deinen Problemen besser helfen.
Oh man, deine Erklärungen sind aber nebulös
Allem Anschein nach hast du doch schon Code - dann zeig ihn mal (nicht nur 5 Zeilen, die uns wenig sagen).
Gib einfach an:
- Ausgangsstatus (GUI, Controls)
- was passiert
- wie soll darauf reagiert werden
Der Code läßt sich noch gewaltig zusammenstreichen.
Speichere die ID's in Arrays. Dann kannst du in einer Schleife die Prüfroutinen durchlaufen.
Das ist doch simples String-Handling.
Du sendest in deinem String eine Kennung voran (irgendeine Ziffernkombination) an der auf der Empfängerseite ersichtlich ist, dass hier eine MsgBox aufgerufen werden soll.
Etwa so:
; Sender
$strToSend = "00;MsgboxTyp;MsgboxTitel;MsgboxText"
TCPSend($ConnectedSocket, $strToSend)
; Empfänger
$recv = TCPRecv($ConnectedSocket, 40)
If StringLeft($recv, 2) = '00' Then
$aMsg = StringSplit($recv, ';')
MsgBox($aMsg[2],$aMsg[3],$aMsg[4])
Else
; ...
EndIf
Edit: Achja, die Länge des TCPRecv mußt du dann variabel gestalten.
bei einem Fehler eine 0 Zurück. Wenn alles ok war, dann liefert das Programm den Exit Code des Programms zurück.
Bei mir liefert er immer 0 zurück, obwohl das Programm bzw. die Batch Datei erfolgreich abgearbeitet wurde.
Prüf doch nicht den Rückgabewert - RunWait liefert doch @error, wenn was schiefgeht.
Runwait(....)
If @error Then
; ....
nur wie soll ich es schaffen,2 guifelder übereinander hinzupflanzen?
Verstehe nicht, was du damit meinst. Erstelle doch ein Child-GUI, das du an die Seite des Main-GUI andockst. Kannst du dann auch super per Klick auf den Rand ein- bzw. ausfahren lassen.
Da die Events des Childs an das Main weitergeleitet werden, kannst du von dort die Daten per Drag'nDrop rüberziehen.
Icons extrahieren (aus *.dll, *.exe, *.ocx, *.scr): mit dem Reshacker - im SciTE-AutoIt-Paket enthalten.
Hier mal ein Muster, wie es funktioniert:
#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include <GUIListView.au3>
Global $sOut, $msg
Global $gui = GUICreate('test')
Global $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200, -1, BitOR($LVS_SORTASCENDING,$LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES, $LVS_EX_REGIONAL))
_GUICtrlListView_SetColumnWidth($hListView, 0, 146)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
For $i = 1 To 10
GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
Next
Global $btn = GUICtrlCreateButton('check', 10, 220, 60, 20)
GUISetState()
Do
$msg = GUIGetMsg()
If $msg = $btn Then
$sOut = ''
For $i = 0 To _GUICtrlListView_GetItemCount($hListView) -1
If _GUICtrlListView_GetItemChecked($hListView, $i) Then _
$sOut &= _GUICtrlListView_GetItemText($hListView, $i, 0) & ' / ' & _
_GUICtrlListView_GetItemText($hListView, $i, 1) & @LF
Next
MsgBox(0, 'Markiert', $sOut)
EndIf
Until $msg = $GUI_EVENT_CLOSE
Nochmals die Bitte: AutoIt-Tag und Spoiler-Tag verwenden
Hi,
du hast dir AddArrayItem() gebastelt. AutoIt hat die Funktion _ArrayAdd() ![]()
for $x = 0 to $sRet[0]-1
[/autoit]Hier hast du einen Fehler. $sRet[0] ist das erste Element in dem Array $sRet und führt die Anzahl der Elemente. Wenn du also alle Elemente durchlaufen möchtest mußt du von 1 bis $sRet[0] durchlaufen bzw. von 1 bis UBound($sRet) -1.
Ich bevorzuge die UBound-Variante - damit vermeidest du solche Fehler von vornherein.
Die Dynamik an sich ist kein Problem. Du fragst in der Schleife ab, ob das LV-Element per CheckBox markiert ist. Wenn ja liest du den Inhalt des ListView-Elements aus und arbeitest entsprechend damit weiter.
Hab mal den Problemteil korrigiert:
[autoit]; Global $arBt[$FList[0]] $arBt war ein Bsp. von mir (Bt = Button in Bsp.-GUI) ==> überflüssig die Zeile
[/autoit][autoit][/autoit][autoit]$newList = _ArrayTrim( $FList, 4, 1,1) ;letzten vier Zeichen werden abgetrennt
[/autoit][autoit][/autoit][autoit]Global $y = 15
; Global $checkCN[UBound($arBt)] hier die Größe von FList einsetzen
Global $checkCN[$FList[0]]
; und jetzt natürlich mit $checkCN weiterarbeiten
GUICreate(" Install Progs", 558, 900, 196, 125)
For $i = 0 To UBound($checkCN) -1 ; Array beginnt bei 0 !!
; in $FList ist aber bei 0 der Zähler, erstes Element bei 1, also immer $i +1
$checkCN[$i] = GUICtrlCreateCheckbox($FList[$i +1], 10, $y, 120, 20)
$y += 20
Next
Wegen der Vielzahl von Elementen, mußt du halt festlegen, wieviel Elemente maximal dargestellt werden können. Wird die Anzahl überschritten erstellst du ein Tab und platzierst die restlichen Elemente dort (oder auf weiteren Tabs, je nach Anzahl).
Hi,
irgendwann die Tage hatte jemand Interesse an einer Darstellung von Arrays als Elemente in einem Array gezeigt.
Ich habe dazu mal die UDF _ArrayDisplay() etwas "vergewaltigt"
und eine Anzeigemöglichkeit dafür geschaffen.
Ist sicher noch nicht optimal gelöst aber funktioniert.
Allerdings nur für 1D/2D-Arrays und auch nicht rekursiv (also kein Array im Array im Array....;-) ).
- Ist ein Arrayelement selbst ein Array, so wird es in der Anzeige als [SubArray] dargestellt.
- Mit rechtem Mausklick auf [SubArray] kann nun dieses Array angezeigt werden.
Vielleicht probier ich nochmal bei Gelegenheit, die Funktion rekursiv zu gestalten. Aber ich denke, für den eher seltenen Einsatz solcher Darstellungen ist es ausreichend.
#include-once
#include <GuiListView.au3>
Global $arSub = _GetTestArray(120)
Global $arSub2 = _GetTestArray(120, 12)
Global $arTest[4][3]=[ _
[1,2,$arSub2], _
[4,5,6], _
[7,8,9], _
[$arSub,11,12]]
Func _GetTestArray($iUbDim1, $iUbDim2=0, $sValue='Wert ')
Local $i, $k, $2ndDim = False
Local $aOut[$iUbDim1]
If $iUbDim2 > 1 Then
$2ndDim = True
ReDim $aOut[$iUbDim1][$iUbDim2]
EndIf
For $i = 0 To $iUbDim1 -1
If $2ndDim Then
For $k = 0 To $iUbDim2 -1
$aOut[$i][$k] = $sValue & $i & '/ ' & $k
Next
Else
$aOut[$i] = $sValue & $i
EndIf
Next
Return $aOut
EndFunc ;==>_GetTestArray
_ArrayMultiDisplay($arTest)
[/autoit] [autoit][/autoit] [autoit];==================================================================================================
; Function Name: _ArrayMultiDisplay
; Description:: Anzeige von 1D/2D-Arrays
; Array-Elemente, die selbst ein 1D/2D-Array darstellen, werden als "[SubArray]"
; markiert und können per Rechtsklick angezeigt werden.
; Parameter(s): Identisch zur Funktion _ArrayDisplay()
;==================================================================================================
Func _ArrayMultiDisplay(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; Array für Subfunktionen Global zur Verfügung stellen
Global $avArrayMultiDisplay = $avArray
; Dimension checking
Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1
If $iDimension > 2 Then Return SetError(2, 0, 0)
; Separator handling
;~ If $sSeparator = "" Then $sSeparator = Chr(1)
If $sSeparator = "" Then $sSeparator = Chr(124)
; Declare variables
Local $i, $j, $vTmp, $aItem, $avArrayText, $sHeader = "Row", $iBuffer = 64
Local $iColLimit = 250, $iLVIAddUDFThreshold = 4000, $iWidth = 640, $iHeight = 480
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator)
; Swap dimensions if transposing
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf
; Set limits for dimensions
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit = 1 Then $iItemLimit = $iLVIAddUDFThreshold
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit
If $iLVIAddUDFThreshold > $iUBound Then $iLVIAddUDFThreshold = $iUBound
; Set header up
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
; Convert array into text for listview
Local $avArrayText[$iUBound + 1]
For $i = 0 To $iUBound
$avArrayText[$i] = "[" & $i & "]"
For $j = 0 To $iSubMax
; Get current item
If $iDimension = 1 Then
If $iTranspose Then
$vTmp = $avArray[$j]
Else
$vTmp = $avArray[$i]
EndIf
Else
If $iTranspose Then
$vTmp = $avArray[$j][$i]
Else
$vTmp = $avArray[$i][$j]
EndIf
EndIf
; Prüfen ob SubArray und entsprechend markieren
If IsArray($vTmp) Then
$vTmp = '[SubArray]'
Else
; Add to text array
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
EndIf
$avArrayText[$i] &= $sSeparator & $vTmp
; Set max buffer size
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
$iBuffer += 1
; GUI Constants
Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66
Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40
Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200
Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2
Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4
Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4
Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1
Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
Local Const $_ARRAYCONSTANT_LVM_INSERTITEMA = (0x1000 + 7)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
Local Const $_ARRAYCONSTANT_LVM_SETITEMA = (0x1000 + 6)
Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns"
Local Const $_ARRAYCONSTANT_WM_NOTIFY = 0x004E
Local Const $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG = 0x00100000
Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
Local $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer)
Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem)
DllStructSetData($tItem, "Param", 0)
DllStructSetData($tItem, "Text", $pBuffer)
DllStructSetData($tItem, "TextMax", $iBuffer)
; Set interface up
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX, $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG))
; GUI Global zur Verfügung stellen
Global $hArrayDisplayGUI = $hGUI
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
; ListView Global zur Verfügung stellen
Global $hArrayDisplayListView = $hListView
Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)
; Fill listview
For $i = 0 To $iLVIAddUDFThreshold
GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
Next
For $i = ($iLVIAddUDFThreshold + 1) To $iUBound
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1])
; Add listview item
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMA, 0, $pItem)
; Set listview subitem text
DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT)
For $j = 2 To $aItem[0]
DllStructSetData($tBuffer, "Text", $aItem[$j])
DllStructSetData($tItem, "SubItem", $j - 1)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMA, 0, $pItem)
Next
Next
; ajust window width
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
WinMove($hGUI, "", Default, Default, $iWidth + 20)
; Show dialog
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($_ARRAYCONSTANT_WM_NOTIFY, "WM_DISPLAY_NOTIFY")
Global $a_msgARRAY_DISPLAY
If Not IsDeclared('hSubGUI') Then Global $hSubGUI
While 1
$a_msgARRAY_DISPLAY = GUIGetMsg(1)
Switch $a_msgARRAY_DISPLAY[0]
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
If $a_msgARRAY_DISPLAY[1] = $hGUI Then
ExitLoop
Else
GUIDelete($hSubGUI)
EndIf
Case $hCopy
Local $sClip = ""
; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
Local $aiCurItems[1] = [0]
For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
$aiCurItems[0] += 1
ReDim $aiCurItems[$aiCurItems[0] + 1]
$aiCurItems[$aiCurItems[0]] = $i
EndIf
Next
; Generate clipboard text
If Not $aiCurItems[0] Then
For $sItem In $avArrayText
$sClip &= $sItem & @CRLF
Next
Else
For $i = 1 To UBound($aiCurItems) - 1
$sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
Next
EndIf
ClipPut($sClip)
EndSwitch
WEnd
GUIDelete($hGUI)
Opt("GUIOnEventMode", $iOnEventMode)
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)
Return 1
EndFunc ;==>_ArrayMultiDisplay
Func WM_DISPLAY_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
If Not IsDeclared('hArrayDisplayListView') Then Local $hArrayDisplayListView
If Not IsDeclared('avArrayMultiDisplay') Then Local $avArrayMultiDisplay
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hArrayDisplayListView
If Not IsHWnd($hArrayDisplayListView) Then $hWndListView = GUICtrlGetHandle($hArrayDisplayListView)
Local Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
Local Const $tagNMITEMACTIVATE = "hwnd hWndFrom;int IDFrom;int Code;int Index;int SubItem;int NewState;int OldState;" & _
"int Changed;int X;int Y;int lParam;int KeyFlags"
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case -5
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $ItemIndex = DllStructGetData($tInfo, "Index"), $SubIndex = DllStructGetData($tInfo, "SubItem")
If _GUICtrlListView_GetItemText($iIDFrom, $ItemIndex, $SubIndex) = '[SubArray]' Then
If Not IsArray($avArrayMultiDisplay) Then Return
Local $avArraySub = $avArrayMultiDisplay[$ItemIndex][$SubIndex - 1]
If Not IsDeclared('hArrayDisplayGUI') Then Local $hArrayDisplayGUI
Local $aMainPos = WinGetPos($hArrayDisplayGUI)
Local $hSubGUI = GUICreate('SubArray', 640, 480, -1, -1, Default, 0x00000040, $hArrayDisplayGUI)
Local $sItemText, $ub2nd, $sHeaderLV = 'Row | Col 1'
If UBound($avArraySub, 2) > 1 Then
$ub2nd = True
$sHeaderLV = 'Row | '
For $j = 0 To UBound($avArraySub, 2) -1
$sHeaderLV &= 'Col ' & $j & ' | '
Next
$sHeaderLV = StringTrimRight($sHeaderLV, 2)
Else
$ub2nd = False
EndIf
Local $hSubLV = GUICtrlCreateListView($sHeaderLV, 0, 0, 640, 480, Default, 0x00000001)
For $i = 0 To UBound($avArraySub) -1
$sItemText = '[' & $i & ']' & '|'
If $ub2nd Then
For $j = 0 To UBound($avArraySub, 2) -1
$sItemText &= $avArraySub[$i][$j] & '|'
Next
$sItemText = StringTrimRight($sItemText, 1)
Else
$sItemText &= $avArraySub[$i]
EndIf
GUICtrlCreateListViewItem($sItemText, $hSubLV)
Next
GUISetState(@SW_SHOW, $hSubGUI)
EndIf
EndSwitch
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_DISPLAY_NOTIFY
ich möchte so etwa von einer anderen GUI aus machen.
Ich verstehe auch nicht, was du meinst.
"andere GUI" - Ist das eine selbsterstellte, oder wird sie von einem Programm zur Verfügung gestellt?
Wenn du einen entsprechenden VB-Code hast, dann zeige ihn doch mal.
Häufig läßt sich VB-Code in AutoIt übertragen. Ist abhängig von den verwendeten Objekten.
Wieso selber schreiben, wenn 'Windows+L' die Station sperrt?
Weil das
a) nicht generell so ist - dazu muß die entsprechende Anmeldeform in Windows aktiv sein
b) Warum soll ich die Station sperren, wenn ich den Task-Manager deaktivieren will
Wozu Google, wenn die Forumsuche dafür eine AutoIt Funktion liefert ![]()
Hier hast du ein Beispiel wie es automatisiert wird:
#include <guiconstants.au3>
[/autoit] [autoit][/autoit] [autoit]Global $arBt[8]
; Größe des Array richtet sich nach Anzahl der Elemente
; $aFile = _FileListToArray($Path) dann ==> Global $arBt[$aFile[0]]
Global $y = 15
GUICreate('test')
For $i = 0 To UBound($arBt) -1
$arBt[$i] = GUICtrlCreateButton('Button', 10, $y, 60, 20)
$y += 30
Next
GUISetState()
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
Die Struktur: Array als Element in einem Array hat noch einen Nachteil: Du kannst nicht direkt auf ein Element in dem SubArray zugreifen. Deshalb habe ich dafür auch die Funktionen _SubArrayGetEntry() und _SubArraySetEntry() erstellt. Findest du in meiner Funktionssammlung ArrayMore.au3, s. Signatur.
Dann kann man sich auch das Deklarieren vorweg
sparen und hat dann die Variablen eben nur Lokal in
der Funktion
Man sollte sich angewöhnen, Variablen IMMER im entsprechenden Namespace zu deklarieren.