Anfänger hat Problem mit _GUIImageList

  • Hy, habe ein Problem beim einfügen von Icons in ein ListView Objekt.
    Lese über eine Function Daten aus einer Ini ein und übergebe sie in das
    ListView Objekt, klappt alles hervorragen (bestimmt für Profis zu
    umständlich gelöst, aber nachsicht bitte, bin Anfänger). Nun wollte
    ich auch gern die dazugehörigen Icons mit einfügen, klappt auch zum
    Teil, allerdings wird immer das selbe Icon (vom ersten Eintrag) eingefügt.
    kann sich mal bitte jemand meine Funktion anschauen und mir verraten wo
    der Fehler liegen könnte?
    PS: soll ein Programmstarter werden (mehrere Kategorien = mehrere Ini´s)
    INI-Aufbau:
    [Firefox]
    Bezeichnung=Firefox 3.0.8
    RunExe=FirefoxPortable.exe
    Ordner=FirefoxPortable

    usw.

    [autoit]


    Func _Ini_einlesen ()
    $Lese_Sections_Namen = IniReadSectionNames ($Welche_Ini_einlesen)
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Keine INI Datei vorhanden ?")
    Else
    $Eintrag = 0
    $Ansicht_Liste_Icons = _GUIImageList_Create(32, 32, 5)
    For $Zaehler = 1 To $Lese_Sections_Namen[0]
    $Ini_Bezeichnung = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Bezeichnung", "1")
    _GUICtrlListView_AddItem($Ansicht_Liste, $Ini_Bezeichnung, 0)
    $Ini_RunExe = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "RunExe", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_RunExe, 1)
    $Ini_Ordner = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Ordner", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_Ordner, 2)
    _GUIImageList_AddIcon($Ansicht_Liste_Icons, @ScriptDir & "\Portable-Apps\" & $Ini_Ordner & "\" & $Ini_RunExe, 0, True)
    $Eintrag = $Eintrag + 1
    Next
    _GUICtrlListView_SetImageList($Ansicht_Liste, $Ansicht_Liste_Icons, 1)
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Diggidie (27. April 2009 um 01:51)

  • Hallo Diggidie,

    die Func müsste so

    Spoiler anzeigen
    [autoit]

    Func _Ini_einlesen()
    $Lese_Sections_Namen = IniReadSectionNames ($Welche_Ini_einlesen)
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Keine INI Datei vorhanden ?")
    Else
    $Eintrag = 0
    $Ansicht_Liste_Icons = _GUIImageList_Create(32, 32, 5, 0, $Anzahl_Sections_Namen)
    For $Zaehler = 1 To $Lese_Sections_Namen[0]
    $Ini_Bezeichnung = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Bezeichnung", "1")
    _GUICtrlListView_AddItem($Ansicht_Liste, $Ini_Bezeichnung, $Zaehler-1);<---- hier war der Fehler
    $Ini_RunExe = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "RunExe", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_RunExe, 1)
    $Ini_Ordner = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Ordner", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_Ordner, 2)
    _GUIImageList_AddIcon($Ansicht_Liste_Icons, @ScriptDir & "\Portable-Apps\" & $Ini_Ordner & "\" & $Ini_RunExe, 0, True)
    $Eintrag = $Eintrag + 1
    Next
    _GUICtrlListView_SetImageList($Ansicht_Liste, $Ansicht_Liste_Icons, 1)
    EndIf
    EndFunc

    [/autoit]

    eigentlich funktionieren, wenn nicht erweitere das gepostete Skript so, dass man es ohne Fehlermeldungen starten kann, dann schau ichs mir nochmal an.

    Edit1: Skript korrigiert

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (27. April 2009 um 03:34)

  • Hallo AutoBert

    Hab mal das wichtigste zusammenkopiert

    [autoit]


    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <Constants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    $Gui_Hauptfenster = GUICreate ("PORTABLE-Startmenu", 406, 573, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    $Ansicht_Liste = GUICtrlCreateListView ("", 9, 75, 250, 460, $WS_DLGFRAME, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    $Ansicht_Liste_Handle = GUICtrlGetHandle($Ansicht_Liste)
    GUICtrlSetState (-1, $GUI_ONTOP)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 0, "Beschreibung", 150)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 1, "RunExe", 50)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 2, "Ordner", 30)

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

    $Welche_Ini_einlesen = @ScriptDir & "\Portable-Apps\Portable-Apps-Menu-Data\Internet.ini"
    _Ini_einlesen ()
    GUISetState ()
    While 1
    Sleep(10)
    WEnd

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

    Func _Ini_einlesen ()
    $Lese_Sections_Namen = IniReadSectionNames ($Welche_Ini_einlesen)
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Keine INI Datei vorhanden ?")
    Else
    $Eintrag = 0
    $Ansicht_Liste_Icons = _GUIImageList_Create(32, 32, 5)
    For $Zaehler = 1 To $Lese_Sections_Namen[0]
    $Ini_Bezeichnung = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Bezeichnung", "1")
    _GUICtrlListView_AddItem($Ansicht_Liste, $Ini_Bezeichnung, 0)
    $Ini_RunExe = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "RunExe", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_RunExe, 1)
    $Ini_Ordner = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Ordner", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_Ordner, 2)
    _GUIImageList_AddIcon($Ansicht_Liste_Icons, @ScriptDir & "\Portable-Apps\" & $Ini_Ordner & "\" & $Ini_RunExe, 0, True)
    $Eintrag = $Eintrag + 1
    Next
    _GUICtrlListView_SetImageList($Ansicht_Liste, $Ansicht_Liste_Icons, 1)
    EndIf
    EndFunc

    [/autoit]

    Möchte nochmal erwähnen, das soweit alles klappt, bis auf die Icons

    wenn zum beispiel die Einträge Firefox und Thunderbird ausgegeben werden
    erscheint bei Firefox das richtige Icon aber bei Thunderbird und allen weiteren
    Einträgen wird auch das Icon von Firefox angezeigt.

    Habe intensiv die Hilfe studiert und bin auch der Meinung das der Aufbau richtig ist.

  • Hier nochmal angepasst, weil ich ja nicht davon ausgehen kann das jeder die Programme besitzt
    Hier die INI für das script (test.ini ins scriptdir legen)

    [Notepad]
    Bezeichnung=Notepad
    RunExe=notepad.exe
    Ordner=system32

    [freecellx]
    Bezeichnung=FreeCell
    RunExe=freecell.exe
    Ordner=system32

    Es wird nur das noepad-icon angezeigt

    [autoit]


    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <Constants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

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

    $Gui_Hauptfenster = GUICreate ("PORTABLE-Startmenu", 406, 573, -1, -1, $WS_POPUP, $WS_EX_TOOLWINDOW)
    $Ansicht_Liste = GUICtrlCreateListView ("", 9, 75, 250, 460, $WS_DLGFRAME, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    $Ansicht_Liste_Handle = GUICtrlGetHandle($Ansicht_Liste)
    GUICtrlSetState (-1, $GUI_ONTOP)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 0, "Beschreibung", 150)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 1, "RunExe", 50)
    _GUICtrlListView_InsertColumn($Ansicht_Liste, 2, "Ordner", 30)

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

    $Welche_Ini_einlesen = @ScriptDir & "\test.ini"
    _Ini_einlesen ()
    GUISetState ()
    While 1
    Sleep(10)
    WEnd

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

    Func _Ini_einlesen ()
    $Lese_Sections_Namen = IniReadSectionNames ($Welche_Ini_einlesen)
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Keine INI Datei vorhanden ?")
    Else
    $Eintrag = 0
    $Ansicht_Liste_Icons = _GUIImageList_Create(32, 32, 5)
    For $Zaehler = 1 To $Lese_Sections_Namen[0]
    $Ini_Bezeichnung = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Bezeichnung", "1")
    _GUICtrlListView_AddItem($Ansicht_Liste, $Ini_Bezeichnung, 0)
    $Ini_RunExe = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "RunExe", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_RunExe, 1)
    $Ini_Ordner = IniRead ($Welche_Ini_einlesen, $Lese_Sections_Namen[$Zaehler], "Ordner", "1")
    _GUICtrlListView_AddSubItem($Ansicht_Liste, $Eintrag, $Ini_Ordner, 2)
    _GUIImageList_AddIcon($Ansicht_Liste_Icons, @WindowsDir & "\" & $Ini_Ordner & "\" & $Ini_RunExe, 0, True)
    $Eintrag = $Eintrag + 1
    Next
    _GUICtrlListView_SetImageList($Ansicht_Liste, $Ansicht_Liste_Icons, 1)
    EndIf
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo Diggidie,

    2. Versuch der Fehler liegt in der Zeile in der du das Item erstellst:

    [autoit]

    _GUICtrlListView_AddItem($Ansicht_Liste, $Ini_Bezeichnung, $Zaehler-1)

    [/autoit]


    Hier hattest du immer 0 zugewiesen was ja dem 1. Eintrag entspricht. Ich kann es leider nicht selbst testen, da mir die INI datei fehlt (ich hab zwar PortableApps, kann aber keine Internet.ini finden).

    mfg (Auto)Bert

  • Danke AutoBert, hat geklappt, SUPER.
    Aber ich muß gestehen, das ich das warum nicht verstehe,
    dachte das die 0 die zuteilung für die erste spalte wäre.

    Danke nochmal

  • Hallo Diggidie,

    darum klappt es

    hab mich bei meinem 1. Versuch ja auch blamiert, na ja habs dann nochmal in der Hilfe nachgelesen (wer lesen kann ist im Vorteil ;) )

    Hab gesehen das es um Portable-Apps geht, hab ich auch installiert, kannst mir bei Gelegenheit ja dein fertiges Ergebnis vorstellen

    mfg (Auto)Bert

  • lesen kann ich auch schon :rofl:
    Hab noch teilweise so meine Probleme mit den Parametern, aber das wird schon noch.
    Bin halt blutiger Anfänger und stehe dazu ;)
    Bevor ich die Idee mit den Icons hatte, wurde ja auch alles korrekt angezeigt.

    Werde in nächster Zeit bestimmt noch öfter Hilfe in anspruch nehmen müssen.

    Kann Dir aber gern in nächster Zeit mal ein Zwischenergebnis zukommen lassen,
    wenn nicht allzuviel bei meinen Ideen schiefgeht.

    Wünsche allen erstmal eine Gute Nacht.