Kontextmenü bei ListView

  • Hi,
    bin gerade frisch registriert hier und habe schon die erste Frage.
    Eins vorweg ich bin noch ein Anfänger in AutoIt ;)

    Also ich bin dabei mir zu Übungszwecken ein Programm zu erstellen das Geburtstage verwaltet.
    Vieleicht wird es durch das Script deutlicher:

    [autoit]


    #include <ButtonConstants.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=c:\users\kevin\documents\auto it scripte\geburtstage.kxf
    $Form1_1 = GUICreate("Form1", 513, 352, 241, 224)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitClick")
    $Date1 = GUICtrlCreateDate("2009/11/29 19:14:50", 200, 64, 186, 21)
    $Label1 = GUICtrlCreateLabel("Bitte Name eingeben:", 32, 24, 106, 17)
    $Label2 = GUICtrlCreateLabel("Bitte Geburtsdatum wählen:", 200, 24, 134, 17)
    $Button1 = GUICtrlCreateButton("Eintragen", 408, 64, 75, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Eintragen")
    $List1 = GUICtrlCreateList("", 32, 128, 457, 201)
    $Label3 = GUICtrlCreateLabel("Eingetragene Geburtstage:", 32, 104, 131, 17)
    $Input1 = GUICtrlCreateInput("", 32, 64, 121, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1

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

    WEnd

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

    Func Eintragen()
    $name = GUICtrlRead($Input1)
    $datum = GUICtrlRead($Date1)
    GUICtrlSetData($List1, $name & $datum)
    EndFunc

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

    Func ExitClick()
    Exit
    EndFunc

    [/autoit]

    Nun möchte ich wenn ich einen Eintrag in die Liste gemacht hab und ihn makiert habe das sich mit einem Rechtsklick ein Kontextmenü öffnet indem man den Eintrag löschen oder bearbeiten kann.
    Da ich noch nicht so erfahren mit AutoIt bin weis ich leider nicht wie ich das lösen soll. :(


    Meine zweite Frage ist kann man irgendwie 2 Spalten in der Liste erzeugen damit die Namen und Geburtstage untereinander stehen?

    Ich hoffe ihr könnt mir helfen. ;)

    MfG

    Bladerunner85

    PS: Habe schon im Forum gesucht aber nichts darüber gefunden.

    Einmal editiert, zuletzt von Bladerunner85 (16. Juli 2010 um 11:55)

  • 1. Du hast eine Listbox, keine ListView
    2. Kontextmenü würde dann zB so gehen:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>

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

    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=c:\users\kevin\documents\auto it scripte\geburtstage.kxf
    $Form1_1 = GUICreate("Form1", 513, 352, 241, 224)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitClick")
    $Date1 = GUICtrlCreateDate("2009/11/29 19:14:50", 200, 64, 186, 21)
    $Label1 = GUICtrlCreateLabel("Bitte Name eingeben:", 32, 24, 106, 17)
    $Label2 = GUICtrlCreateLabel("Bitte Geburtsdatum wählen:", 200, 24, 134, 17)
    $Button1 = GUICtrlCreateButton("Eintragen", 408, 64, 75, 25, $WS_GROUP)
    GUICtrlSetOnEvent(-1, "Eintragen")
    $List1 = GUICtrlCreateListView("Name|Geburtstag", 32, 128, 457, 201)
    _GUICtrlListView_SetColumnWidth($List1,0,200)
    _GUICtrlListView_SetColumnWidth($List1,1,200)

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

    $Label3 = GUICtrlCreateLabel("Eingetragene Geburtstage:", 32, 104, 131, 17)
    $Input1 = GUICtrlCreateInput("", 32, 64, 121, 21)
    GUISetState(@SW_SHOW)

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

    $kMenu = GUICtrlCreateContextMenu($List1)
    GUICtrlCreateMenuItem("Löschen",$kMenu)
    GUICtrlSetOnEvent(-1, "_Delete")
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep(500)
    WEnd

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

    Func Eintragen()
    If Not GUICtrlRead($Input1) = "" Then
    GUICTRLCREATELISTVIEWITEM(GUICtrlRead($Input1)&"|"&GUICtrlRead($Date1),$List1)
    Else
    MsgBox(64,"","Bitte einen Namen eingeben",1)
    EndIf
    EndFunc

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

    Func _Delete()
    _GUICtrlListView_DeleteItemsSelected($List1)
    EndFunc

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

    Func ExitClick()
    Exit
    EndFunc

    [/autoit]

    Gruß,
    SEuBo

  • Hi,
    vielen Dank für deine Antwort.
    Ist genau das was ich wollte :D

    Wenn mir jetzt noch jemand sagen könnte was man machen muss das das Kontextmenu nur auf einem Markierten Eintrag funktioniert, würde ich micht freuen ;) .

    MfG

    Bladerunner85

  • Sry wenn ich nerve :S aber ich bekomme es leider immer noch nicht hin :( .
    Bin ja wie gesagt noch Anfänger ^^.

    MfG

    Bladerunner85

  • Poste doch mal den aktuellen Stand deines Scriptes, nur dann kann dir geholfen werden ;)

    EDIT:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>
    #include <Date.au3>
    #include <Array.au3>
    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=c:\users\kevin\documents\auto it scripte\geburtstage.kxf
    $Form1_1 = GUICreate("Form1", 513, 352, 241, 224)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitClick")
    $Date1 = GUICtrlCreateDate(_NowCalcDate(), 200, 64, 186, 21)
    $Label1 = GUICtrlCreateLabel("Bitte Name eingeben:", 32, 24, 106, 17)
    $Label2 = GUICtrlCreateLabel("Bitte Geburtsdatum wählen:", 200, 24, 134, 17)
    $Button1 = GUICtrlCreateButton("Eintragen", 408, 64, 75, 25, BitOr($WS_GROUP, $BS_DEFPUSHBUTTON))
    GUICtrlSetOnEvent(-1, "Eintragen")
    $List1 = GUICtrlCreateListView("Name|Geburtstag", 32, 128, 457, 201)
    _GUICtrlListView_SetColumnWidth($List1,0,200)
    _GUICtrlListView_SetColumnWidth($List1,1,200)

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

    $Label3 = GUICtrlCreateLabel("Eingetragene Geburtstage:", 32, 104, 131, 17)
    $Input1 = GUICtrlCreateInput("", 32, 64, 121, 21)
    GUISetState(@SW_SHOW)

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

    $kMenu = GUICtrlCreateContextMenu($List1)
    GUICtrlCreateMenuItem("Bearbeiten",$kMenu)
    GUICtrlSetOnEvent(-1, "_Edit")
    GUICtrlCreateMenuItem("Löschen",$kMenu)
    GUICtrlSetOnEvent(-1, "_Delete")

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

    #EndRegion ### END Koda GUI section ###

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

    Global $Edit = False, $Selection
    ControlFocus($Form1_1,"",$Input1)

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

    While 1
    Sleep(500)
    WEnd

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

    Func Eintragen()
    If Not $Edit Then
    If Not GUICtrlRead($Input1) = "" Then
    GUICTRLCREATELISTVIEWITEM(GUICtrlRead($Input1)&"|"&GUICtrlRead($Date1),$List1)
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Date1,_NowCalcDate())
    Else
    MsgBox(64,"","Bitte einen Namen eingeben",1)
    EndIf
    Else
    $Edit = False
    _GUICtrlListView_SetItemText($List1,$Selection,GUICtrlRead($Input1))
    _GUICtrlListView_SetItemText($List1,$Selection,GUICtrlRead($Date1),1)
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Date1,_NowCalcDate())
    GUICtrlSetData($Button1,"Eintragen")
    EndIf
    EndFunc

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

    Func _Delete()
    ;Das ist eigentlich eine Zeile. Zugunsten der Lesbarkeit hab ich es aber auf mehrere Zeilen aufgeteilt.
    IF MsgBox(4,"Wirklich löschen?","Möchtest du den Geburtstag von "&_GUICtrlListView_GetItemText($List1, _
    _GUICtrlListView_GetSelectionMark($List1))&","&@CRLF&_GUICtrlListView_GetItemText($List1, _
    _GUICtrlListView_GetSelectionMark($List1),1)&" wirklich löschen?") = 6 Then _GUICtrlListView_DeleteItem($List1, _
    _GUICtrlListView_GetSelectionMark($List1))
    EndFunc

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

    Func _Edit()
    $Edit = True
    $Selection = _GUICtrlListView_GetSelectionMark($List1)
    GUICtrlSetData($Input1,_GUICtrlListView_GetItemText($List1,$Selection))
    GUICtrlSetData($Date1,_DELongFormat2Int(_GUICtrlListView_GetItemText($List1,$Selection,1)))
    GUICtrlSetData($Button1,"Speichern")
    ControlFocus($Form1_1,"",$Input1)
    EndFunc
    Func ExitClick()
    Exit
    EndFunc

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

    Func _DELongFormat2Int($sDate)
    ;Author: SEuBo | Descr: Gibt ein Datum im deutschen Longformatin internationalem Format wieder
    ;Bsp: Montag, 30. November 2009 -> 2009/10/30
    Local $aMonth[13] = ["-","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]
    $aSplit = StringSplit($sDate,",")
    $aSplit = StringSplit(StringTrimLeft($aSplit[2],1)," ")
    For $i = 1 to 12
    If StringInStr($aSplit[2],$aMonth[$i]) Then $aSplit[2] = StringReplace($aSplit[2],$aMonth[$i],$i)
    Next
    $aSplit[1] = StringTrimRight($aSplit[1],1)
    Return StringFormat("%04i/%02i/%02i",$aSplit[3],$aSplit[2],$aSplit[1])
    EndFunc

    [/autoit]

    Löschen / Bearbeiten ist jetzt so eingebaut. Hoffe das ist in Ordnung :P
    Schau es dir in Ruhe an, vielleicht blickst du ja noch durch

    PS: Dieses GUICtrlCreateDate hat mir echt Kopfzerbrechen bereitet ^^

  • Hi,
    danke funktioniert genau so wie ich es haben wollte :D .
    Das Problem ist, das sich das Programm mit einem Fehler schließt wenn man im Kontextmenu Bearbeiten auswählt ohne das ein Eintrag in der Liste ausgewählt ist.

    Fehler:

    [autoit]


    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    [/autoit]

    Trotzdem nochmaln Thanks an alle ;)

    MfG

    Bladerunner85

  • Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>
    #include <Date.au3>
    #include <Array.au3>
    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=c:\users\kevin\documents\auto it scripte\geburtstage.kxf
    $Form1_1 = GUICreate("Form1", 513, 352, 241, 224)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitClick")
    $Date1 = GUICtrlCreateDate(_NowCalcDate(), 200, 64, 186, 21)
    $Label1 = GUICtrlCreateLabel("Bitte Name eingeben:", 32, 24, 106, 17)
    $Label2 = GUICtrlCreateLabel("Bitte Geburtsdatum wählen:", 200, 24, 134, 17)
    $Button1 = GUICtrlCreateButton("Eintragen", 408, 64, 75, 25, BitOr($WS_GROUP, $BS_DEFPUSHBUTTON))
    GUICtrlSetOnEvent(-1, "Eintragen")
    $List1 = GUICtrlCreateListView("Name|Geburtstag", 32, 128, 457, 201)
    _GUICtrlListView_SetColumnWidth($List1,0,200)
    _GUICtrlListView_SetColumnWidth($List1,1,200)

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

    $Label3 = GUICtrlCreateLabel("Eingetragene Geburtstage:", 32, 104, 131, 17)
    $Input1 = GUICtrlCreateInput("", 32, 64, 121, 21)
    GUISetState(@SW_SHOW)

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

    $kMenu = GUICtrlCreateContextMenu($List1)
    GUICtrlCreateMenuItem("Bearbeiten",$kMenu)
    GUICtrlSetOnEvent(-1, "_Edit")
    GUICtrlCreateMenuItem("Löschen",$kMenu)
    GUICtrlSetOnEvent(-1, "_Delete")

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

    #EndRegion ### END Koda GUI section ###

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

    Global $Edit = False, $Selection
    ControlFocus($Form1_1,"",$Input1)

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

    While 1
    Sleep(500)
    WEnd

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

    Func Eintragen()
    If Not $Edit Then
    If Not GUICtrlRead($Input1) = "" Then
    GUICTRLCREATELISTVIEWITEM(GUICtrlRead($Input1)&"|"&GUICtrlRead($Date1),$List1)
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Date1,_NowCalcDate())
    Else
    MsgBox(64,"","Bitte einen Namen eingeben",1)
    EndIf
    Else
    $Edit = False
    _GUICtrlListView_SetItemText($List1,$Selection,GUICtrlRead($Input1))
    _GUICtrlListView_SetItemText($List1,$Selection,GUICtrlRead($Date1),1)
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Date1,_NowCalcDate())
    GUICtrlSetData($Button1,"Eintragen")
    EndIf
    EndFunc

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

    Func _Delete()
    If Not _GUICtrlListView_GetSelectionMark($List1) = -1 Then
    IF MsgBox(4,"Wirklich löschen?","Möchtest du den Geburtstag von "&_GUICtrlListView_GetItemText($List1, _
    _GUICtrlListView_GetSelectionMark($List1))&","&@CRLF&_GUICtrlListView_GetItemText($List1, _
    _GUICtrlListView_GetSelectionMark($List1),1)&" wirklich löschen?") = 6 Then
    _GUICtrlListView_DeleteItem($List1,_GUICtrlListView_GetSelectionMark($List1))
    If $Edit = True Then
    GUICtrlSetData($Input1,"")
    GUICtrlSetData($Date1,_NowCalcDate())
    GUICtrlSetData($Button1,"Eintragen")
    EndIf
    EndIf
    EndIf
    EndFunc

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

    Func _Edit()
    $Edit = True
    $Selection = _GUICtrlListView_GetSelectionMark($List1)
    If Not $Selection = -1 Then
    GUICtrlSetData($Input1,_GUICtrlListView_GetItemText($List1,$Selection))
    GUICtrlSetData($Date1,_DELongFormat2Int(_GUICtrlListView_GetItemText($List1,$Selection,1)))
    GUICtrlSetData($Button1,"Speichern")
    ControlFocus($Form1_1,"",$Input1)
    EndIf
    EndFunc
    Func ExitClick()
    Exit
    EndFunc

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

    Func _DELongFormat2Int($sDate)
    ;Author: SEuBo | Descr: Gibt ein Datum im deutschen Longformatin internationalem Format wieder
    ;Bsp: Montag, 30. November 2009 -> 2009/10/30
    Local $aMonth[13] = ["-","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]
    $aSplit = StringSplit($sDate,",")
    If $aSplit[0] <> 1 Then
    $aSplit = StringSplit(StringTrimLeft($aSplit[2],1)," ")
    For $i = 1 to 12
    If StringInStr($aSplit[2],$aMonth[$i]) Then $aSplit[2] = StringReplace($aSplit[2],$aMonth[$i],$i)
    Next
    $aSplit[1] = StringTrimRight($aSplit[1],1)
    Return StringFormat("%04i/%02i/%02i",$aSplit[3],$aSplit[2],$aSplit[1])
    EndIf
    EndFunc

    [/autoit]