Schwierigkeiten mit der Listbox...

  • Hallo,

    ich habe das Problem das ich Dateinamen in einer Listbox und parallel in einer .ini speichern lasse. Damit die Listbox nicht mit den Pfaden zugespammt wird füge ich die Dateinamen mit _guictrllistbox_addfile hinzu. In der Ini wird natürlich der komplette Name mit Pfad gespeichert.
    Das klappt alles wunderbar bis ich eine löschfunktion geschrieben habe die beides löschen sollte (eintrag in Listbox und ini-File. Der Eintrag sollte gelöscht werden wenn man einen Namen anklickt in der Box und dann den "lösch-Button" drückt. Nunja den Eintrag aus der Listbox zu bekommen ist kein Problem aber aus dem ini-File.....

    Das Problem ist das guictrlread(listbox) nur den Namen der Datei wie sie dort steht übermittelt und nicht mehr den kompletten Pfad. Darum klappt es auch nicht wenn ich versuche einfach das ergebnis aus der ini zu löschen.

    Meine Frage: Wie bekomme ich die Einträge aus dem ini-File (als sections gespeichert) heraus UND behalte trotzdem NUR die Dateinamen in der Box. Ich habe wirklich schon alles mögliche ausprobiert und bin ratlos :(

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    AutoIt Version: 3.2.10.0
    Author: Marko H.

    Script Function: Dieses Programm wechselst automatisch zwischen verschiedenen Designs von WindowsXP


    #ce ----------------------------------------------------------------------------

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

    #include
    #include
    #include
    #include
    #include
    #Include
    #include
    #include

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

    Global $themes, $test = 0, $confirmation = 0, $what_now = 0, $liste, $time_now, $timesave, $time_to_save, $x, $top, $timefield[10], $themefield[10], $y

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

    Opt("GUIOnEventMode", 1)

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

    $data = @ScriptDir & "\Data\themes.ini"
    $data2 = @ScriptDir & "\Data\time.ini"

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

    $hauptgui = GUICreate("Designswitcher 2008", 300, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
    GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
    $tab = GUICtrlCreateTab(1, 1, 600, 600)

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

    $tab1 = GUICtrlCreateTabItem("settings")
    $durchsuchen = GUICtrlCreateButton("durchsuchen...", "30", "100", "90", "25")
    GUICtrlSetOnEvent($durchsuchen, "durchsuchen")
    $delete = GUICtrlCreateButton("loeschen", "130", "100", "90", "25")
    GUICtrlSetOnEvent(-1, "loeschen")
    $auflistung = GUICtrlCreateList("", "30", "150", "220", "100")
    $themes = IniReadSectionNames($data)
    If @error = 0 Then
    For $i = 1 To $themes[0]
    _GUICtrlListBox_AddString ($auflistung, $themes[$i])
    Next
    Else
    $themes = "X"
    EndIf

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

    $tab2 = GUICtrlCreateTabItem("zeit")
    $number_of_timefields = GUICtrlCreateInput("1", 30, 50, 30, 25, $ES_NUMBER)
    GUICtrlCreateUpdown($number_of_timefields)
    $create_timefields = GUICtrlCreateButton("Zeitfelder erstellen", 90, 50, 100, 25)
    GUICtrlSetOnEvent($create_timefields, "timefields")

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

    $tab = GUICtrlCreateTabItem("start")
    $start = GUICtrlCreateButton("start", 50, 30)
    GUICtrlSetOnEvent($start, "start")

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

    GUISetState()

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

    While 1
    Sleep(1000)
    WEnd

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

    Func test()

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

    EndFunc ;==>test

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

    Func timefields()
    GUICtrlSetState($tab2, $GUI_show)
    FileOpen($data2, 2)
    GUISwitch($hauptgui, $tab2)
    $top = 100
    Global $x = GUICtrlRead($number_of_timefields)
    $themes = IniReadSectionNames($data)
    Switch $x
    Case 1 To 9
    For $i = 1 To $x
    $timefield[$i] = GUICtrlCreateDate("", 30, $top, 100, 25, $DTS_TIMEFORMAT)
    $themefield[$i] = GUICtrlCreateCombo(" Theme wählen...", 150, $top, 100, 25)
    For $s = 1 To $themes[0]
    GUICtrlSetData($themefield[$i], $themes[$s])
    ;MsgBox(0, "", $themes[$s])
    Next

    $top = $top + 30
    Next
    Case 10 To 255555555555555
    MsgBox(0, "Achtung!!", "Bitte wähle eine Zahl zwischen 1 und 9 um das Fenster nicht zu sprengen." & @LF & "Wenn du mehr Designs wählen willst solltest du nochmal mit den Programmierer sprechen!")
    Case Else
    MsgBox(0, "Achtung!!", "Schonmal versucht ein negatives Feld zu erstellen? DAS GEHT NICHT!!!")
    EndSwitch
    GUICtrlSetState($create_timefields, $gui_disable)
    GUICtrlSetState($number_of_timefields, $gui_disable)
    $timesave = GUICtrlCreateButton("Zeiten und Themes übernehmen", 300, $top)
    GUICtrlSetOnEvent($timesave, "timesave")
    FileClose($data2)
    GUICtrlCreateTabItem("")

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

    EndFunc ;==>timefields

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

    Func start()
    $y = "25:25:25"
    Global $time_ini = IniReadSectionNames($data2)
    Do
    $time_now = @HOUR & ":" & @MIN & ":" & @SEC
    For $i = 1 To $time_ini[0]
    If $time_now = $time_ini[$i] Then themechange_theme()
    Global $y = $time_ini[$i]
    Next
    Sleep(100)
    Until $y = $time_now
    EndFunc ;==>start

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

    Func timesave()

    For $i = 1 To $x
    $time_to_save = GUICtrlRead($timefield[$i])
    $theme_to_save = GUICtrlRead($themefield[$i])
    IniWrite($data2, $time_to_save, $theme_to_save, $x)
    Next


    EndFunc ;==>timesave

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

    Func themechange_theme()
    $theme = IniReadSection($data2, $y)
    If @error = 0 Then
    ShellExecute($theme[1][0])
    EndIf

    EndFunc ;==>themechange_theme

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

    Func SpecialEvents()

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

    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit

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

    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

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

    Case @GUI_CtrlId = $GUI_EVENT_RESTORE
    EndSelect

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

    EndFunc ;==>SpecialEvents

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

    Func loeschen()
    $themes_delete=IniReadSectionNames($data)
    $listitem = GUICtrlRead($auflistung)
    $nummer = _GUICtrlListBox_FindString ($auflistung, $listitem)
    _GUICtrlListBox_DeleteString ($auflistung, $nummer)
    IniDelete($data, $listitem)
    EndFunc ;==>loeschen

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

    Func durchsuchen()
    $themes = IniReadSectionNames($data)
    _ArrayDisplay($themes)

    $files_chose_theme = FileOpenDialog("Wählen Sie ein Design aus", "C:\", "Windwos Themes(*.msstyles)", 1)
    If Not $files_chose_theme = "" Then
    $confirmation = MsgBox(0x4, "Echt jetzt?", "Willst du diese Theme (" & $files_chose_theme & ") wirklich übernehmen?")
    If $confirmation = 6 Then
    If Not $themes = "X" Then
    For $i = 1 To $themes[0]
    If $themes[$i] = $files_chose_theme Then
    MsgBox(0, "Pustekuchen", "Dieses Theme wurde bereits hinzugefügt!")
    $test = 1
    EndIf
    Next
    EndIf
    If $test <> 1 Then
    _GUICtrlListBox_AddString ($auflistung, $files_chose_theme)
    IniWriteSection($data, $files_chose_theme, "1")
    Else
    _insert()
    EndIf
    Else
    _insert()

    EndIf
    EndIf
    EndFunc ;==>durchsuchen

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

    Func _insert()
    Do

    $test = 0
    $what_now = MsgBox(0x4, "Was nun?", "Willst du eine anderes Theme wählen?")
    If $what_now = 6 Then
    $files_chose_theme = FileOpenDialog("Wählen Sie ein Design aus", "C:\", "Windwos Themes(*.msstyles)", 1)
    If Not $files_chose_theme = "" Then
    $confirmation = MsgBox(0x4, "Echt jetzt?", "Willst du diese Theme (" & $files_chose_theme & ") wirklich übernehmen?")
    If $confirmation = 6 Then
    If Not $themes = "X" Then
    For $i = 1 To $themes[0]
    If $themes[$i] = $files_chose_theme Then
    MsgBox(0, "Pustekuchen", "Dieses Theme wurde bereits hinzugefügt!")
    $confirmation = 7
    $test = 1
    EndIf
    Next
    EndIf
    If $test <> 1 Then
    _GUICtrlListBox_AddString ($auflistung, $files_chose_theme)
    IniWriteSection($data, $files_chose_theme, "1")
    EndIf
    EndIf

    EndIf
    EndIf
    Until $confirmation = 6 Or $what_now = 7
    EndFunc ;==>_insert

    [/autoit]


    </GuiTab.au3></GuiConstantsEx.au3></GuiDateTimePicker.au3></File.au3></guilistbox.au3></guilistview.au3></Date.au3></GuiConstants.au3>

    MfG

    akira2012

    ***---____---Wer RechtSCHRAIBfehler findet der darf Sie behalLTEN!---___---***

  • Würde die INI anders speichern:

    Code
    [ThemeTimes] 
    23:25:25=Theme.name


    und dann
    IniReadSection("filename","ThemeTimes")
    Return Value
    Success: Returns a 2 dimensional array where element[n][0] is the key and element[n][1] is the value.
    Failure: Sets @error=1 if unable to read the section (The INI file may not exist or the section may not exist)

  • Ja das nutzt mir aber doch nichts - Das hat ja noch nichts mit den Zeiten zu tun. Das ist nur um die Themes alle einzulesen. Es geht sich ja um die Tatsache das in der Listbox nur die Dateinamen angezeigt werden und trotzdem durch ein auslesen dieser eine löschung in der ini möglich sein soll wo der Dateiname nur mit dem kompletten Pfad angegeben ist.

    MfG

    akira2012

    ***---____---Wer RechtSCHRAIBfehler findet der darf Sie behalLTEN!---___---***

  • du kannst doch einfach die Sektion einlesen, dann nach dem StrInString (in deinem Fall der Dateiname) suchen dir den Schlüssel zurückgeben lassen und löschen

    • Offizieller Beitrag

    Verwende doch:

    Zitat

    _IniReadSectionToObjDict(Objekt, INI-Pfad, Sektion)
    Liest die angegebene INI-Sektion in das Objekt
    Gibt Anzahl gelesener Paare zurück

    _IniWriteSectionFromObjDict(Objekt, INI-Pfad, Sektion)
    Schreibt die Schlüssel-Wert Paare des Objekts in die angegebene Sektion
    der INI-Datei
    Gibt Anzahl geschriebener Paare zurück

    von hier: UDF-Sammlung: Objekt Dictionary

  • Sorry aber komme nicht damit zurecht - ich bekomm das nichtmal installiert in mein scite - geschweige denn von benutzt Könnte mir mal wer verraten wo ich das hinkopieren muß? habs mit dem include ordner versucht und bin gescheitert


    EDIT: Habe grad mal nachgedacht und ich denke das mit dise Funktion auch nicht weiterhilft da dort doch nur objekte ausgelesen werden und in ini-sectionen gespeichert werden oder umgedreht aber das nutzt mir nichts wenn in der listbox nur die Dateinamen angezeigt werden sollen aber in der ini die Datei + Pfad gespeichert werden soll!

    MfG

    akira2012

    ***---____---Wer RechtSCHRAIBfehler findet der darf Sie behalLTEN!---___---***

    Einmal editiert, zuletzt von akira2012 (21. Februar 2008 um 21:07)

  • Da ich mit den Objektsachen nicht zurecht gekommen bin habe ich mir eine eigene UDF gebastelt. Nur damit tut sich ein neues Problem auf. Die UDF ansich funktioniert tadelos. Nur wenn ich Sie aufrufe um etwas in die Listbox einzutragen schmiert jedesmal AutoIT ab. Ich finde einfach den Fehler nicht. BITTE HELT MIR ICH DREH DURCH!

    Hier der Aufruf:

    Spoiler anzeigen
    [autoit]

    $themes = IniReadSectionNames($data)
    If @error = 0 Then

    For $i = 1 To $themes[0]
    $insert_listbox=_string_cut($themes[$i], "\", "right")
    _GUICtrlListBox_AddString ($auflistung, $insert_listbox)
    Next
    Else
    $themes = "X"
    EndIf

    [/autoit]

    und hier die UDF:

    Spoiler anzeigen
    [autoit]

    func _string_cut($string, $to_string, $side)
    $stringlenght=StringLen($string)
    for $i = 1 to $stringlenght
    Select
    Case $side = "left"
    $newstring=StringLeft($string, $i)
    $test_string=StringInStr ( $newstring, $to_string)
    IF NOT $test_string=0 THEN
    $final_string=Stringleft($newstring, $i-1)
    ExitLoop
    EndIf
    case $side="right"
    $newstring=StringRight($string, $i)
    $test_string=StringInStr ( $newstring, $to_string)
    IF NOT $test_string=0 THEN
    $final_string=Stringright($newstring, $i-1)
    MsgBox(0, "", $final_string)
    ExitLoop
    EndIf
    EndSelect

    Next
    EndFunc

    [/autoit]

    MfG

    akira2012

    ***---____---Wer RechtSCHRAIBfehler findet der darf Sie behalLTEN!---___---***

  • Wieso gibt die nichts zurück? oO
    ist denn $insert_listbox nicht der rückgabewert beim aufruf? Und das begin_update hab ich schon versucht aber autoit stürzt trotzdem ab. Außerdem kann ich sonst auch werte ohne begin_update hinzufügen. Könntest du das mal näher erläutern? Danke schonmal

    MfG

    akira2012

    ***---____---Wer RechtSCHRAIBfehler findet der darf Sie behalLTEN!---___---***

    • Offizieller Beitrag

    Wieso gibt die nichts zurück? oO

    Es gibt in Deiner Funktion kein Return.

    Aber sollte das hier nicht ausreichen?

    [autoit]


    Func _string_cut($string, $lr)
    Local $val, $pos = StringInStr($string, '\', 0 , -1)
    Switch $lr
    Case 'left'
    $val = StringLeft($string, $pos)
    Case 'right'
    $val= StringMid($string, $pos+1)
    EndSwitch
    Return $val
    EndFunc

    [/autoit]