Fehlermeldung bei Zugriff auf zweites Element von StringSplit

  • Bei Zeile 97 soll der Fehler liegen!

    Fehlermeldung:
    *\mainWindow.au3 (98) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    _GDIPlus_GraphicsDrawString($hBuffer2,"Beschreibung:" & @CRLF & $artikel[2],370,40,"Arial",22)
    _GDIPlus_GraphicsDrawString($hBuffer2,"Beschreibung:" & @CRLF & ^ ERROR

    Kann mir da jemand den Fehler Zeigen? Danke!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <GuiListView.au3>
    #include <GuiMenu.au3>
    #include <Array.au3>
    _Main()
    Func _Main()
    Local $filemenu, $fileitem, $recentfilesmenu, $separator1
    Local $exititem, $helpmenu, $aboutitem, $okbutton, $cancelbutton
    Local $msg, $file
    #forceref $separator1
    $iGUIWidth = 1000
    $iGUIHeight = 600
    $hWnd = GUICreate("Lagerliste", $iGUIWidth, $iGUIHeight)
    #region Datei
    $filemenu = GUICtrlCreateMenu("Datei")
    $connectitem = GUICtrlCreateMenuItem("Verbinden", $filemenu)
    $separator1 = GUICtrlCreateMenuItem("", $filemenu)
    $fileitem = GUICtrlCreateMenuItem("Öffnen...", $filemenu)
    $recentfilesmenu = GUICtrlCreateMenu("zuletzt geöffnet", $filemenu)
    $separator2 = GUICtrlCreateMenuItem("", $filemenu)
    $exititem = GUICtrlCreateMenuItem("Schließen", $filemenu)
    #endregion Datei
    #region Bearbeiten
    $editmenu = GUICtrlCreateMenu("Bearbeiten")
    $additem = GUICtrlCreateMenuItem("Hinzufügen", $editmenu)
    $delitem = GUICtrlCreateMenuItem("Löschen", $editmenu)
    #endregion Bearbeiten
    #region Hilfe
    $helpmenu = GUICtrlCreateMenu("?")
    $aboutitem = GUICtrlCreateMenuItem("About", $helpmenu)
    #endregion Hilfe
    $refreshbutton = GUICtrlCreateButton("Aktualisieren", 10, 550, 70, 20)
    $cancelbutton = GUICtrlCreateButton("Cancel", 920, 550, 70, 20)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hBitmap2 = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer2 = _GDIPlus_ImageGetGraphicsContext($hBitmap2)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer2, 2)
    $table = GUICtrlCreateListView("Artikel# |Beschreibung |Lagerstand |Preis",10,10,400,500)
    _GDIPlus_GraphicsDrawLine($hBuffer,410,300,1000,300)
    _refreshListView($table)
    While Sleep(20)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $cancelbutton
    _disconnectSQL()
    ExitLoop
    Case $msg = $connectitem
    _connectSQL()
    if @error Then
    MsgBox(0,"Status","Verbindung wurde hergestellt")
    Else
    MsgBox(0,"Status","Fehler beim Verbinden")
    EndIf
    Case $msg = $fileitem
    $file = FileOpenDialog("Datei auswählen...", @TempDir, "All (*.*)")
    If @error <> 1 Then GUICtrlCreateMenuItem($file, $recentfilesmenu)
    Case $msg = $exititem
    ExitLoop
    Case $msg = $refreshbutton
    _refreshListView($table)
    Case $msg = $aboutitem
    MsgBox(0, "Über", "written by Palmers Julian 2012")
    EndSelect
    ;Produktinformationen schreiben:
    $artikel = StringSplit(GUICtrlRead(GUICtrlRead($table)),"|")
    _ArrayDisplay($artikel)
    If $artikel[1] > -1 Then
    _GDIPlus_GraphicsClear($hBuffer2, 0xFFEEEE22)
    $image=_GDIPlus_ImageLoadFromFile(@WorkingDir&"\jpg.jpg") ;Produktbild laden
    _GDIPlus_GraphicsDrawImageRect($hBuffer2,$image,0,0,350,600) ;Produktbild zeichnen
    _GDIPlus_GraphicsDrawString($hBuffer2,"Artikelnummer: " & $artikel[1],370,10,"Arial",22) ;Artikelnummer
    _GDIPlus_GraphicsDrawString($hBuffer2,"Beschreibung:" & @CRLF & $artikel[2],370,40,"Arial",22) ;Beschreibung
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap2, 415,10,575,280)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    WEnd
    GUIDelete()
    Exit
    EndFunc ;==>_Main
    Func _connectSQL()
    ;$error: 1=OK 0=Fehler
    SetError(0)
    EndFunc
    Func _disconnectSQL()
    EndFunc
    Func _refreshListView($listView)
    _GUICtrlListView_DeleteAllItems($listView)
    For $i=0 To 100 Step +1
    GUICtrlCreateListViewItem($i&"|test |"&$i+5&"|100€",$listView) ;creates a sample Lagerstand
    Next
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von palmers7 (18. Dezember 2012 um 16:09)

  • Zeile 44:

    [autoit]

    $table = GUICtrlCreateListView("Artikel# |Beschreibung |Lagerstand |Preis",10,10,400,500)

    [/autoit]

    Hier wird ein ListView Control erstellt. Diese können nicht mit GUICtrlRead ausgelesen werden (Zeile 71)! Demnach kannst du dies schonmal verwerfen.
    Du kannst allerdings die einzelnen Elemente mit GUICtrlRead auslesen. Dazu müsstest du allerdings die ID jedes Elementes speichern.


    Zudem sollte in Zeile 71 beachtet werden, dass keine 2 GUICtrlRead Funktionen verschachtelt werden. Es wird jeweils eine ID erwartet und ein String zurück gegeben.

    €dit: Sorry, hatte den Sourcecode nur in der schnelle angeschaut.

    Einmal editiert, zuletzt von Yjuq (18. Dezember 2012 um 16:20)

  • ahm...

    Daraus wurde ich jetzt nicht schlauer!

    Bitte bedenkt, das ist mein 2. Thema und ich bin erst seit 2 Wochen am AutoIten.

    Dachte GUICtrlRead() funktioniert so:
    GUICtrlRead() => Index der Markierung
    GUICtrlRead(GUICtrlRead()) => Text der markierten Zeile (zb.: ID|Beschreibung|Lagerstand|Preis)

    diese Rückgabe will ich dann bei jedem "|" splitten um den einzelnen Eintrag, nicht die ganze Zeile zu bekommen.

    !?. ?(

    Edit:
    Und bevor ich mich hier in etwas verlaufe, das so und so nicht geht:
    Ich will die Elemente von der Zeile der ListView bekommen, die markiert wurde!

  • die Abfrage die du machst (Zeile 71) ist auch korrekt ;)

    aber in Zeile 73 solltest du lieber
    If $artikel[0] > 1 Then
    machen, weil wenn StringSplit fehlschlägt, weil kein ListView Item makiert ist, ist $artikel[0] = 1

    mfg

  • die Abfrage die du machst (Zeile 71) ist auch korrekt ;)

    aber in Zeile 73 solltest du lieber
    If $artikel[0] > 1 Then
    machen, weil wenn StringSplit fehlschlägt, weil kein ListView Item makiert ist, ist $artikel[0] = 1

    mfg


    Krabat, mein heutiger Held! auch ein großes Dankeschön an alle anderen Helfer!