Den Background einzelner ListView Elemente ändern

  • Hallo zusammen,

    ich bin gerade dabei ein Skript zu schreiben, welches zwei Listboxen miteinander vergleicht und ausschließlich die Einträge, die im jeweils anderen fehlen farblich hervorheben sollen. Allerdings kann ich keinen Weg finden, dies umzusetzen und das Internet hilft mir auch nicht weiter, da scheinbar jeder Listview statt Listbox verwendet. Listview ist allerdings keine Alternative.

    Hier ein Snippet zu dem Problem:

    Code
    For $i = UBound($aListeLinks) - 1 To 1 Step - 1
        If _ArraySearch($aListeRechts, $aListeLinks[$i]) < 0 Then
            GUICtrlSetBkColor(_GUICtrlListBox_SetCurSel($aListeLinks, $i), "0x663366")
        EndIf
    Next

    Ich habe mehrere Wege versucht.. So wie hier oben, dann mit selectrange und selectstring.

    Die Farbe ist einfach irgendeine Farbe, die wird noch geändert :)

    Ich hoffe, es findet sich jemand, der mir helfen kann.

    Vielen Dank und LG,

    der Robert

  • Das kann so nicht hinhauen.

    ListBoxen lassen sich nicht Zeile für Zeile unterschiedlich färben (nicht ohne weiteres), und deshalb wird oftmals auf ListView (zumindest in AutoIt) ausgewichen.

    GUICtrlSetBkColor erwartet eine ControlID aber du übergibst den Rückgabewert von _GUICtrlListBox_SetCurSel welches nur True oder False zurückgibt, also kann das so nicht funktionieren.

    Wieso sind denn ListViews für dich keine Alternative? Was spricht denn dagegen?

  • Ich weiß leider nicht mehr, warum es keine Alternative war, aber ich hatte listbox seinerzeit (vor 2-3 Jahren als das ganze Programm geschrieben wurde) nehmen müssen, weil irgendwas mit Listview nicht ging.

    War es evtl das Kontextmenü, das sich mit rechtsklick öffnen lassen können soll? Ich weiß es nicht mehr..

    Hier mal die ganze Funktion. Die Listbox wird in einer anderen Funktion mit Einträgen befüllt.

    Spoiler anzeigen
  • War es evtl das Kontextmenü, das sich mit rechtsklick öffnen lassen können soll? Ich weiß es nicht mehr..

    Du kannst ein Kontextmenu auf eine ListView setzen, das ist kein Problem.

    Es ist trotzdem ohne weiteres nicht möglich (nur über Gdi+ und das in Controls hinzukriegen ist in AutoIt wirklich keine schöne Sache, wie in C#, da kriegt man alles schon bereitgestellt).

    Das ummünzen von ListBox auf ListView dauert keine Stunde, statt GUICtrlSetData verwendet man halt GUICtrlCreateListViewItem.

  • Wenn es sonst keine Möglichkeit gibt, einzelnen Zellen zu färben, bleibt mir ohnehin nichts anderes übrig als auf Listview zu wechseln. Nur wie kann ich in der ListView einzelne Einträge färben wenn diese schon in der Liste vorhanden sind?

    Geht das überhaupt?

  • DasIch,

    wir hatten das Thema gerade ausgiebig im Thread:

    ListView füllen und ProgressBar

    Der geschätzte Bitnugger hat dort im Posting Nr. 9 dieses Juwel verlinkt:

    https://www.autoitscript.com/forum/topic/18…ws-udf-version/

    Scrolle dort mal ein gutes Stück herunter und bestaune die Beispiele!

    Schier grenzenlose Freiheit, oder? Und schnell!

    Bitnugger hat in Posting Nr. 18 auch ein direkt lauffähiges Script gepostet (nur ein Pfad bei "Include" muss eventuell angepasst werden).

    Ich code, also bin ich!

  • Ich verstehe leider kein Wort von dem was dort steht. Ich will einfach nur ausgewählte Zellen umfärben. Brauche ich da wirklich eine komplette UDF dafür?

    Sowas wie _GUICtrlListViewItem_SetBKColor($listview[$index], $color).

    Das Problem ist, dass die ListViewItems alle dynamisch erzeugt werden. Wie kann ich auf einzelne Handles dieser items zugreifen?

    Sie werden so erzeugt :

    Spoiler anzeigen
    Code
    local $hWo[UBound($aGroupSearch)]
    For $i = 1 To UBound($aGroupSearch) - 1
        $hWo[$i] = GUICtrlCreateListViewItem(_AD_FQDNToSamAccountName($aGroupSearch[$i]), $Grp_lstGroupsLeftUser)
    Next
    _Compare(0, $hWo)

    Dann sollen einzelne Zellen, nachdem eine Prüfung ob sie in der anderen ListView fehlen, gefärbt werden:

    Code
    For $i = 1 To UBound($aListeLinks) - 1
        If _ArraySearch($aListeRechts, $aListeLinks[$i]) < 0 Then
            _GUICtrlListView_SetBkColor($hWo[$i], "red")
        EndIf
    Next

    Die UDF die du verlinkt hast, ist zwar sehr gut und stark, aber doch "etwas" zu umständlich einzubauen. Oder ich weiß einfach nur nicht, wie.

  • Die UDF die du verlinkt hast, ist zwar sehr gut und stark, aber doch "etwas" zu umständlich einzubauen. Oder ich weiß einfach nur nicht, wie.

    Falls noch nicht geschehen, erstellst du ein Verzeichnis für deine eigenen Includes, z.B. Autoit3_MyIncludes. Damit die darin enthaltenen Includes gefunden werden, musst du es in der SciTE-Config (Ctrl+1) bei User Include Folder eintragen.

    Nun entpackst du das Archiv ListViewColorsFonts.7z in ein Verzeichnis mit Namen ListViewColorsFonts.

    Als letzte Aktion kopierst du alle Dateien aus dem Verzeichnis ..\ListViewColorsFonts\UDFs\ in das Verzeichnis ..\Autoit3_MyIncludes\ und startest SciTE dann neu.

    Um die UDF dann zu benutzen, musst du in deinem Fall lediglich drei Zeilen an richtiger Stelle einfügen... hier mal ein Beispiel:

  • Grüß' dich bitnugger,

    vielen Dank für deine super Erklärung! Leider funktioniert es jedoch nicht :( Error ist 2, aber warum, weiß ich leider nicht. Der Farbcode kann ja schlecht falsch sein. Hier der Code:

    Spoiler anzeigen

    Hast du eine Idee?

    LG,

    der Robert

    P.S.: Entschuldige die verspätete Antwort, aber ich bin nur sporadisch zuhause am Rechner :)

    Nachtrag:

    Hier noch wie $Grp_lstGroupsLeftUser erstellt wird für den Fall dass irgendein Parameter nicht unterstützt wird von deiner UDF.

    Code
    $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410, BitOR($gui_ss_default_list, $ws_hscroll, $lbs_extendedsel))

    4 Mal editiert, zuletzt von DasIch (22. November 2018 um 15:35)

  • Error ist 2, aber warum, weiß ich leider nicht.

    ; Return values .: Failure - Returns -1 and sets @error:

    ; 1 - This function requires that $fColorsFonts includes 1/2/4

    ; 2 - Listview not found

    ; 3 - Invalid listview item

    ; 4 - Invalid listview subitem

    ; 5 - Too many color parameters

    ; 6 - Invalid color value

    Der Fehler sagt also, dass das Listview nicht gefunden wurde...

    Syntax ........: ListViewColorsFonts_SetItemColors( $idListView, $iItem, $iSubItem = -1, $iBackColor = 0, $iForeColor = 0, $iBackSelect = 0, $iForeSelect = 0, $iBackUnfocus = 0, $iForeUnfocus = 0 )

    Von der Syntax her scheint aber alles ok zu sein... deshalb denke ich, liegt er Fehler bei den Styles, die du beim Erstellen des Listviews verwendest.

    $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410, BitOR($gui_ss_default_list, $ws_hscroll, $lbs_extendedsel))

    $GUI_SS_DEFAULT_LIST und $LBS_EXTENDEDSEL (Allows multiple items to be selected by using the SHIFT key and the mouse or special key combinations.) sind Styles für eine ListBox, aber nicht für ein Listview!

    $WS_HSCROLL (Creates a window that has a horizontal scroll bar.) würde ich auch weglassen, denn die ScrollBar erscheint automatisch, wenn die Einträge nicht passen.

    ; Control default styles (Listview)

    Global Const $GUI_SS_DEFAULT_LISTVIEW = BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL) ; $LVS_SINGLESEL willst du nicht, also lässt du $GUI_SS_DEFAULT_LISTVIEW weg und nimmst nur $LVS_SHOWSELALWAYS, falls gewünscht.

    Analog passend und richtig wäre demnach:

    $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410, $LVS_SHOWSELALWAYS)

    oder...

    $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410, BitOr($LVS_SHOWSELALWAYS, $WS_HSCROLL))

    Versuche es mal damit und gib Bescheid, ob es nun klappt...

  • Hallo nochmal und lieben Dank erneut für deine hilfreiche Antwort.

    Leider behebt es das Problem nicht, da nun seltsamerweise keine Einträge in der Listview erstellt werden. Es läuft kurz durch als würde es die Liste befüllen, diese bleibt jedoch leer. Dass der Durchlauf dennoch abgeschlossen wurde, sehe ich wenn ich die MsgBox anzeigen lasse. Zudem werden auch die HiddenLabels befüllt, die ich zur Kontrolle mit eingebaut habe.

    Ich kriege auch noch immer den Error 2, seltsamerweise

    Hier nochmal der Code:

    Spoiler anzeigen
  • Leider behebt es das Problem nicht, da nun seltsamerweise keine Einträge in der Listview erstellt werden. Es läuft kurz durch als würde es die Liste befüllen, diese bleibt jedoch leer.

    Ich kriege auch noch immer den Error 2, seltsamerweise

    Du musst schon etwas genauer werden... Error 2... von welcher Funktion?

    Prüfe doch einfach mal nach jedem Funktionsaufruf, was für einen Rückgabewert du bekommst und lasse ihn dir mit ConsoleWrite anzeigen.

    Bsp.:

    Code
    $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410)
    ; oder...
    ;~ $Grp_lstGroupsLeftUser = GUICtrlCreateListView("", 16, 160, 361, 410, $LVS_SHOWSELALWAYS)
    ConsoleWrite('$Grp_lstGroupsLeftUser = ' & $Grp_lstGroupsLeftUser & @CRLF)
    
    
    ; usw...

    Falls das auch nicht hilft, dann gib doch einfach mal deinen kompletten Codes raus, damit man dir ohne Glaskugel helfen kann... kannst ihn mir ja als PM schicken, wenn er nicht im Forum landen soll.

  • Hallo nochmal,

    der Errorcode kam von deiner Funktion. wie oben ja auch festgestellt, kann er die Liste wohl nicht finden.

    Ich habe den Code mal separiert und lauffähig hier reingeschrieben. Zwar mit anderen Quelldaten (Datenschutz und so), aber das Fehlerbild ist "zum Glück" das gleiche.

    Spoiler anzeigen

    Ich danke dir vielmals, dass du dir so viel Mühe gibst mir zu helfen, das ist nicht selbstverständlich!

    LG,

    der Robert

  • 3 Mal editiert, zuletzt von Bitnugger (22. November 2018 um 20:06)

  • Moment mal.. Quasi alles was ich hätte machen müssen wäre am Anfang eine Überschrift zu setzen?!

    Wow, man sieht manchmal den Wald vor lauter Bäumen nicht :Face:

    Aber deine Art Fehler auszugeben gefällt mir. Das werde ich mal so frech wie ich bin künftig übernehmen.

    DANKE DANKE DANKE! :klatschen:

    Nachtrag: Das Problem mit der Erkennung was fehlt gibt es im Originalscript nicht, daher lasse ich das mal so stehen.

    Einmal editiert, zuletzt von DasIch (22. November 2018 um 20:07)

  • DasIch 22. November 2018 um 20:05

    Hat das Label von [ offen ] auf [ gelöst ] geändert.
  • Habe oben im Script noch ein paar Fehler korrigiert...

    Moment mal.. Quasi alles was ich hätte machen müssen wäre am Anfang eine Überschrift zu setzen?!

    Ja... und bei ListViewColorsFonts_SetItemColors() eine Spalte (SubItem) angeben, die/dass dann auch existiert - oder -1, um die ganze Zeile zu färben!

    Local $listview = ListViewColorsFonts_SetItemColors($Grp_lstGroupsLeftUser, $i, -1, 0xFF0000) ; set red back colors for the entire item in row $i

    2 Mal editiert, zuletzt von Bitnugger (22. November 2018 um 20:19)

  • Habe oben im Script noch ein paar Fehler korrigiert...

    Ja... und bei ListViewColorsFonts_SetItemColors() eine Spalte (SubItem) angeben, dass dann auch existiert!

    Stimmt.

    Nichtsdestotrotz geht es jetzt und genau dafür ist das Forum da.

    Danke dir vielmals für deine Geduld und Hilfe!