Funktion zur Auswahl von Arrays

  • Hallo,

    ich wollte eine Funktion erstellen, die mir gewisse Arrays in einer Liste anzeigt (wie die Standartfunktion _arraydisplay)
    Allerdings soll die gewünschte Zeile angeklickt werden und mit Bestätigung auf einen Button in einer Variable gespeichert werden.

    Mein Problem dabei: ich kenn mich in der Materie sehr wenig aus.


    Kann mir jemand dabei helfen?

    Vielen Dank schonmal :)

    2 Mal editiert, zuletzt von tztztz (1. April 2014 um 10:32) aus folgendem Grund: Thema verschoben da es sich offenbar um eine Programmieranfrage handelt

  • oder du nimmst einfach den code der ArrayDisplay-Funktion und änderst diesen ein bischen ab. dann haste schonmal 90% der Arbeit erledigt ohne was gemacht zu haben ;)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • danke, die Idee war gut :) ,

    Habe beim Suchen der originalen Funktion eine abgewandelte entdeckt, die mir an sich ganz gut passt,
    woran es allerdings bei mir hängt (sorry falls es einfach ist, bin recht unerfahren):

    ich kann den Wert zwar als ini speichern oder als Textfile aber will es als Variable, die ich im Script benutzen kann haben.

    Falls ich mich dumm anstelle bitte ich das zu entschuldigen!


    Hier die Funktion, die ich gefunden habe:

    [autoit]

    Func _ArrayDisplay2(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
    If Not IsArray($avArray) Then Return SetError(1, 0, 0)
    ; 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)

    [/autoit][autoit][/autoit][autoit]

    ; Separator handling
    If $sSeparator = "" Then $sSeparator = Chr(124)

    [/autoit][autoit][/autoit][autoit]

    ; Check the separator to make sure it's not used literally in the array
    If _ArraySearch($avArray, $sSeparator, 0, 0, 0, 1) <> -1 Then
    For $x = 1 To 255
    If $x >= 32 And $x <= 127 Then ContinueLoop
    Local $sFind = _ArraySearch($avArray, Chr($x), 0, 0, 0, 1)
    If $sFind = -1 Then
    $sSeparator = Chr($x)
    ExitLoop
    EndIf
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; Declare variables
    Local $vTmp, $iBuffer = 4094 ; AutoIt max item size
    Local $iColLimit = 250
    Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator)

    [/autoit][autoit][/autoit][autoit]

    ; Swap dimensions if transposing
    If $iSubMax < 0 Then $iSubMax = 0
    If $iTranspose Then
    $vTmp = $iUBound
    $iUBound = $iSubMax
    $iSubMax = $vTmp
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; Set limits for dimensions
    If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
    If $iItemLimit < 1 Then $iItemLimit = $iUBound
    If $iUBound > $iItemLimit Then $iUBound = $iItemLimit

    [/autoit][autoit][/autoit][autoit]

    ; Set header up
    If $sHeader = "" Then
    $sHeader = "Row " ; blanks added to adjust column size for big number of rows
    For $i = 0 To $iSubMax
    $sHeader &= $sSeparator & "Col " & $i
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; 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

    [/autoit][autoit][/autoit][autoit]

    ; Add to text array
    $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)

    [/autoit][autoit][/autoit][autoit]

    ; Set max buffer size
    If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)

    [/autoit][autoit][/autoit][autoit]

    $avArrayText[$i] &= $sSeparator & $vTmp
    Next
    Next

    [/autoit][autoit][/autoit][autoit]

    ; 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_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
    Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
    Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
    Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
    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

    [/autoit][autoit][/autoit][autoit]

    ; Set interface up
    Local $iWidth = 640, $iHeight = 480
    Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
    Local $aiGUISize = WinGetClientSize($hGUI)
    Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
    Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0]/3 - 9, 20)
    Local $hSaveSelected = GUICtrlCreateButton("Save Selected", (($aiGUISize[0])/3) + 6, $aiGUISize[1] - 23, $aiGUISize[0]/3 - 9, 20)
    Local $hSave = GUICtrlCreateButton("Save All", (2*($aiGUISize[0])/3) + 9, $aiGUISize[1] - 23, $aiGUISize[0]/3 - 9, 20)
    GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
    GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
    GUICtrlSetResizing($hSaveSelected, $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
    GUICtrlSetResizing($hSave, $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)

    [/autoit][autoit][/autoit][autoit]

    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)

    [/autoit][autoit][/autoit][autoit]

    ; Fill listview
    For $i = 0 To $iUBound
    GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
    Next

    [/autoit][autoit][/autoit][autoit]

    ; adjust 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
    $iWidth += 20

    [/autoit][autoit][/autoit][autoit]

    If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100

    [/autoit][autoit][/autoit][autoit]

    WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)

    [/autoit][autoit][/autoit][autoit]

    ; Show dialog
    GUISetState(@SW_SHOW, $hGUI)

    [/autoit][autoit][/autoit][autoit]

    While 1
    Local $guiMsg = GUIGetMsg()
    Switch $guiMsg
    Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
    ExitLoop

    [/autoit][autoit][/autoit][autoit]

    Case $hCopy,$hSaveSelected
    Local $sClip = ""

    [/autoit][autoit][/autoit][autoit]

    ; 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

    [/autoit][autoit][/autoit][autoit]

    ; 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
    If $hSaveSelected = $guiMsg Then
    $sFile = FileSaveDialog("Choose a name", @ScriptDir, "Text files (*.txt)", 16, "fred.txt")
    If @error Then
    MsgBox(4096, "", "Save cancelled.")
    Else
    MsgBox(4096, "", "You chose " & $sFile)
    ; IniWrite("Config.ini", "check", "check", $sClip) / die Zeile hab ich eingefügt, der Rest ist nur kopiert die Variable $sClip hat den String den ich brauche
    _FileCreate($sFile)
    FileWrite($sFile,$sClip)
    EndIf
    Else
    ClipPut($sClip)
    EndIf
    Case $hSave
    $sFile = FileSaveDialog("Choose a name", @ScriptDir, "Text files (*.txt)", 16, "fred.txt")
    If @error Then
    MsgBox(4096, "", "Save cancelled.")
    Else
    MsgBox(4096, "", "You chose " & $sFile)
    _FileWriteFromArray($sFile, $avArray)
    EndIf
    EndSwitch
    WEnd
    GUIDelete($hGUI)

    [/autoit][autoit][/autoit][autoit]

    Opt("GUIOnEventMode", $iOnEventMode)
    Opt("GUIDataSeparatorChar", $sDataSeparatorChar)

    [/autoit][autoit][/autoit][autoit]

    Return 1
    EndFunc ;==>_ArrayDisplay

    [/autoit]

    Zur Vollständigkeit hier noch die Quelle des Originals:
    http://www.autoitscript.com/forum/topic/15…-array-display/

  • Wenn du es in eine Ini geschrieben bekommst warum nimmst du nicht einfach

    [autoit]

    Return $sClip

    [/autoit]

    um die Variable $sClip an dein Script zurückzugeben und mit

    [autoit]

    $DeineVar = _ArrayDisplay2($DeinArray)

    [/autoit]

    in deine Variable zu bekommen? Natürlich musst du im Code noch ein paar andere sachen ändern, z.B. zeile 164 auskommentieren aber im grunde hast du doch schon alles was du brauchst.

  • Gut wenn du es geschafft hast, Hier nochmal zur veranschaulichung wie ich es gemacht hätte.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func _ArrayGetList(Const ByRef $aArray)
    If Not isArray($aArray) Then Return SetError(1,0,0)
    GUICreate("", 400, 300)
    $bButton = GUICtrlCreateButton("OK", 185, 272, 50)
    $hListView = GUICtrlCreateListView("", 2, 2, 394, 268)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_InsertColumn($hListView, 0, "Bitte Auswählen", 350)

    For $i = 0 To Ubound($aData)-1
    _GUICtrlListView_AddItem($hListView, $aArray[$i])
    Next
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Return SetError(1,0,0)
    Case $bButton
    Local $iIndex = -1
    For $i = 0 To _GUICtrlListView_GetItemCount ($hListView) -1
    If _GUICtrlListView_GetItemFocused($hListView, $i) Then
    $iIndex = $i
    Exitloop
    EndIf
    Next
    If $iIndex >= 0 And $iIndex <= Ubound($aArray)-1 Then Return $aArray[$iIndex]; <--- Variable mit dem ausgewählten wert
    MsgBox("", "Fehler", "Bitte Wert auswählen")
    EndSwitch
    WEnd
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Local $aData[15] = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]; Beispiel Array
    Local $DeineVar = _ArrayGetList($aData)
    If @error = 0 Then MsgBox("","Deine Auswahl",$DeineVar)

    [/autoit]