TreeView Farbe von Item und Pfad nachträglich ändern.

  • Hallo,

    ich nutze folgende Funktion um einen Treeview zu erstellen.

    Damit erstelle ich einen TreeView z.B davon: (Edit, gefärbt für gewünschtes Ergebnis)

    Spoiler anzeigen

    Folder 1\

    characters\models\geralt\head\model\eye__geralt_d01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_d01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_d02.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_n01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_n02.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_tattoo_d01.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d01_mark.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d01_mark_tattoo.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d02_mark.xbm

    characters\models\geralt\body\model\body_01_mg__geralt_d01.xbm

    Folder 2\

    characters\models\geralt\head\model\eye__geralt_d01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_d01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_d02.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_n01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_n02.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_tattoo_d01.xbm

    characters\models\geralt\head\model\h_01_mg__geralt_tattoo_d02.xbm

    characters\models\geralt\head\model\h_02_mg__geralt_d01.xbm

    characters\models\geralt\head\model\h_02_mg__geralt_n01.xbm

    characters\models\geralt\head\model\h_03_mg__geralt_d01.xbm

    characters\models\geralt\head\model\h_03_mg__geralt_n01.xbm

    characters\models\geralt\head\model\h_04_mg__geralt_d01.xbm

    characters\models\geralt\head\model\h_04_mg__geralt_n01.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d01_mark.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d01_mark_tattoo.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d02_mark.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_d02_mark_tattoo.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_n01_mark.xbm

    characters\models\geralt\head\model\ep1_mark\h_01_mg__geralt_n02_mark.xbm

    characters\models\geralt\body\model\body_01_mg__geralt_d01.xbm

    characters\models\geralt\body\model\s_01_mg__body_hires_d01.xbm

    Folder 3\

    dlc\dlc6\data\characters\models\main_npc\triss\model\body_01_wa__triss_dlc_d01.xbm

    dlc\dlc6\data\characters\models\main_npc\triss\model\body_01_wa__triss_dlc_s01.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\body_05_wa__yennefer_d01.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\body_05_wa__yennefer_d02.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\glove_01_wa__yennefer_d01.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\scarf_01_wa__yennefer_d01.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\stockings_01_wa__yennefer_d01.xbm

    dlc\dlc4\data\characters\models\main_npc\yennefer\model\yennefer_feathers_d01.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\body_01_wa__ciri_dlc_d01.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\body_01_wa__ciri_dlc_d02.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\body_01_wa__ciri_dlc_d03.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\body_01_wa__ciri_dlc_s01.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\ciri_chainmail_dlc_d01.xbm

    dlc\dlc11\data\characters\models\main_npc\ciri\model\ciri_chainmail_dlc_n01.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_a01.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_a02.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_d01.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_d02.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_hooded.w2mesh

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_hooded.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_n01.xbm

    characters\models\main_npc\yennefer\model\body_01_wa__yennefer_n02.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_a01.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_a02.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_d01.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_d02.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_n01.xbm

    characters\models\main_npc\yennefer\model\dress_01_wa__yennefer_n02.xbm

    characters\models\main_npc\yennefer\model\fur_01_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\fur_01_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\fur_01_wa__yennefer_a01.xbm

    characters\models\main_npc\yennefer\model\fur_01_wa__yennefer_d01.xbm

    characters\models\main_npc\yennefer\model\fur_01_wa__yennefer_n01.xbm

    characters\models\main_npc\yennefer\model\fur_02_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\fur_02_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\fur_03_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\fur_03_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\l_01_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\l_01_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\l_02_wa__yennefer.w2mesh

    characters\models\main_npc\yennefer\model\l_02_wa__yennefer.w2mesh.1.buffer

    characters\models\main_npc\yennefer\model\l_02_wa__yennefer_a01.xbm

    characters\models\main_npc\yennefer\model\l_02_wa__yennefer_d01.xbm

    characters\models\main_npc\yennefer\model\l_02_wa__yennefer_n01.xbm

    characters\models\main_npc\yennefer\model\yennefer__body_d_notcensor.xbm

    characters\models\main_npc\yennefer\model\yennefer__body_n_notcensor.xbm

    characters\models\main_npc\yennefer\h_01_wa__yennefer\eye__yennefer_d01.xbm

    characters\models\main_npc\yennefer\h_01_wa__yennefer\h_01_wa__yennefer_a01.xbm

    characters\models\main_npc\yennefer\h_01_wa__yennefer\h_01_wa__yennefer_b01.xbm

    characters\models\main_npc\yennefer\h_01_wa__yennefer\h_01_wa__yennefer_d01.xbm

    characters\models\main_npc\yennefer\h_01_wa__yennefer\h_01_wa__yennefer_n01.xbm

    characters\models\main_npc\triss\model\body_01_wa__triss_d01.xbm

    characters\models\main_npc\triss\model\body_02_wa__triss_d01.xbm

    characters\models\main_npc\triss\model\body_02_wa__triss_s01.xbm

    characters\models\main_npc\triss\model\body_03_wa__triss.w2mesh

    characters\models\main_npc\triss\model\body_03_wa__triss.w2mesh.1.buffer

    characters\models\main_npc\triss\model\body_03_wa__triss_a01.xbm

    characters\models\main_npc\triss\model\body_03_wa__triss_d01.xbm

    characters\models\main_npc\triss\model\body_03_wa__triss_n01.xbm

    characters\models\main_npc\triss\model\body_03_wa__triss_s01.xbm

    characters\models\main_npc\triss\model\i_03_wa__triss_d01.xbm

    characters\models\main_npc\triss\h_01_wa__triss\h_01_wa__triss_b01.xbm

    characters\models\main_npc\triss\h_01_wa__triss\h_01_wa__triss_d01.xbm

    characters\models\main_npc\triss\h_01_wa__triss\h_01_wa__triss_d02.xbm

    characters\models\main_npc\triss\h_01_wa__triss\h_01_wa__triss_d03.xbm

    characters\models\main_npc\triss\h_01_wa__triss\h_01_wa__triss_n01.xbm


    Jetzt sind 10 Dateinamen doppelt vorhanden. Diese sollen später im Treeview selber dann rot gefärbt werden anstatt grün.

    Das ist die Funktion, womit ich diese Daten herausfinde.

    Das ist das Ergebnis:

    array.PNG

    Diese 20 Stellen sollten dann Rot gefärbt werden, anstatt grün.

    Ich komme seit Sonntag morgen einfach nicht drauf :(

    Einmal editiert, zuletzt von xTcisloVe (27. August 2018 um 19:05)

  • Du kannst Texte innerhalb von Listviews nicht ohne weiteres mehrfarbig machen, nur einfarbig.

    Will ich ja auch nicht, es ist ja auch TreeView, und da kann ich ja jedes einzelne, Item einfärben. Ich kann ja auch immer ein anderes Icon setzen. Und auch die Farbe.

    3 Mal editiert, zuletzt von xTcisloVe (27. August 2018 um 19:40)

  • Und was genau kriegst du an der Färbung nicht hin? GUICtrlSetColor funktioniert ja ohne Probleme. Weißt du nicht wie du erkennen sollst ob sie schon doppelt vorkommen oder wo liegt das Problem?

    Ich will ja wirklich nur die doppelten rot Färben, dazu muss aber ja auch der dazugehörige Tree rot werden, alles andere soll grün sein.

    Ich weiß also wie ich anhand meiner _FindDuplicates Funktion das File rot färbe, dann bleibt aber die dazugehörige Ordnersturktur grün.

    Und StringinStr kann ich da ja nicht nehmen da z.B der Ordner "Models" in allen Ordnern vorkommen kann aber nicht überall rot sein soll.

    Hoffe man versteht was ich meine :D

  • Du musst während du das TreeView aufbaust und die Duplikate raussuchst auch den aktuellen Standpunkt merken um das richtige Item zu färben.

    Mit StringInStr klappt das so einfach nicht.

    Färb sie nicht erst im Nachhinein sondern such die Duplikate raus und während du das Treeview erzeugst färbst du sie gleichzeitig mit indem du prüfst ob der aktuelle Zweig dem Dateipfad entspricht.

    Es ist wesentlich einfacher während der Konstruktion alles zu markieren als im Nachhinein.

  • Du musst während du das TreeView aufbaust und die Duplikate raussuchst auch den aktuellen Standpunkt merken um das richtige Item zu färben.

    Mit StringInStr klappt das so einfach nicht.

    Färb sie nicht erst im Nachhinein sondern such die Duplikate raus und während du das Treeview erzeugst färbst du sie gleichzeitig mit indem du prüfst ob der aktuelle Zweig dem Dateipfad entspricht.

    Es ist wesentlich einfacher während der Konstruktion alles zu markieren als im Nachhinein.

    Keine Ahnung wie ich das machen soll, darum geht es ja.

    Die Funktion baut ja erst alle Ordner auf und dann alle Files.

    Ich wollte einfach den Handle abgreifen mit GUICtrlCreateDummy() aber das ging nur wenn ich jede Datei inklusive Pfad einzeln erstellen würde im Treeview.

    Habe also keinen Plan wie ich das umsetzen soll.

    Edit: Die Duplikate kann ich mir mit _FindDuplicates ja jederzeit holen, darin wäre ja jeder ordner und jede datei die Rot sein muss exakt aufgelistet.
    Ich könnte die Funktion ja auch nur Dateinamen ausgeben lassen, aber dann weiß ich halt nicht wie ich den dazugehörigen Pfad rot färbe.

    Ich kann ja durch die Files loopen und den dazugehörigen tree mit

    _GUICtrlTreeView_FindItem() und _GUICtrlTreeView_GetTree()

    anzeigen lassen.

    Moment vlt klappt das dann mit _GUICtrlTreeView_SetTextColor ?

    Muss ich testen

    Einmal editiert, zuletzt von xTcisloVe (27. August 2018 um 21:07)

  • Speicher dir doch die Struktur des TreeViews beim Erstellen dann ab, du musst lediglich die Create Funktion modifizieren.

    Dann speicherst du die ganzen Unterordner und Zweige in einem Array, Dictionary oder was auch immer und wenn du am Ende die Duplikate durchgehst kannst du währenddessen dein Array, Dictionary, o. ä. iterieren und gleichzeitig färben.

    Du weißt ja was du färben möchtest, nur hast du keine Ahnung wie du an die Objekte kommen sollst.

  • Speicher dir doch die Struktur des TreeViews beim Erstellen dann ab, du musst lediglich die Create Funktion modifizieren.

    Dann speicherst du die ganzen Unterordner und Zweige in einem Array, Dictionary oder was auch immer und wenn du am Ende die Duplikate durchgehst kannst du währenddessen dein Array, Dictionary, o. ä. iterieren und gleichzeitig färben.

    Du weißt ja was du färben möchtest, nur hast du keine Ahnung wie du an die Objekte kommen sollst.

    Das ist ja mein Problem, deswegen der Thread.

    Damit funktioniert es nicht.
    Edit:

    Einmal editiert, zuletzt von xTcisloVe (27. August 2018 um 21:49)

  • Das hier sollte dir helfen: FolderStruct - Ordnerstruktur in Datei speichern / aus Datei erstellen

    Der Link in Post 1 (diesem Thread) passt seit der Forumsumstellung nicht mehr, das ist das Ziel: Anlegen vieler Verzeichnisse und Unterverzeichnisse aus Dateiliste möglich?.

    Hallo,
    vielen dank.

    Ich denke du meinst Redim aus der _FillTreeviewFromFolder

    An sich konnte ich das für mich umsetzen, nur das Ergebnis ist nicht ganz wie gewünscht.

    array.PNG

    Ich komme noch nicht drauf wie ich das richtig anordne, so das die richtigen Files unter den richtigen ordnern sind wie bei Row 7.

    Der kack beschäftigt mich seit Samstag morgen.

    Edit: Ich denke ich muss meine Funktion so umschreiben, das ich jede Datei samt Pfad im Tree erstelle und nicht Ordner für Ordner und dann Datei für Datei.

    2 Mal editiert, zuletzt von xTcisloVe (28. August 2018 um 17:36)

  • Ich habe meine _FindDuplicates Funktion verändert und bin der ganzen Sache wohl einen Schritt näher.


    $aRet_2 =

    Wenn jetzt noch jemand einen Tipp hätte wie ich das auf meinen Tree anwende :P

  • Hallo xTcisloVe

    Ich habe gar nicht vielbeizutragen. Aber nach einem Blick auf deine _FindDuplicates Funktion, meine ich, die wird das ein oder andere Mal abstürzen. Das ist dir bei deinen Tests nur nicht aufgefallen, weil du mit wenigen Dateien testest oder nur am Anfang Dublikate hast.

    In der For Schleife kann $i jeden Indexwert von $aFiles annehmen. Bei einem Treffer greifst du auf den auf $aFolder[$i] zu. In der Annahme, dass du meist mehr Dateien als Ordner hast, solltest du früher oder später auf einen Indexwert zugreifen, den es gar nicht in $aFolder gibt und das Skript zum Abbruch bringen.

    Grüße autoiter

  • Hallo xTcisloVe

    Ich habe gar nicht vielbeizutragen. Aber nach einem Blick auf deine _FindDuplicates Funktion, meine ich, die wird das ein oder andere Mal abstürzen. Das ist dir bei deinen Tests nur nicht aufgefallen, weil du mit wenigen Dateien testest oder nur am Anfang Dublikate hast.

    In der For Schleife kann $i jeden Indexwert von $aFiles annehmen. Bei einem Treffer greifst du auf den auf $aFolder[$i] zu. In der Annahme, dass du meist mehr Dateien als Ordner hast, solltest du früher oder später auf einen Indexwert zugreifen, den es gar nicht in $aFolder gibt und das Skript zum Abbruch bringen.

    Warum?

    1. $aFolder = _FileListToArrayRec($sPath, "*", 1, 1, 0, 1)
    2. $aFiles = _FileListToArrayRec($sPath, "*", 1, 1, 0, 0)

    Die beiden Arrays sind doch exakt gleich, oder irre ich? Der eine ist mit Relativem Pfad und der andere nur mit den Dateien....

    Hab ich das was falsch verstanden?

  • Ah, sorry eine Nebelkerze. Ich habe mich von den Bezeichnungen blenden lassen. Ich dachte der unterschiediche Prameter wäre wirklich der für Datei- bzw. Ordner-Auflistung.

    Weiter viel Erfolg.

    Grüße autoiter

  • Ah, sorry eine Nebelkerze. Ich habe mich von den Bezeichnungen blenden lassen. Ich dachte der unterschiediche Prameter wäre wirklich der für Datei- bzw. Ordner-Auflistung.

    Weiter viel Erfolg.

    Danke dir, bin noch offen für Ratschläge, da ich noch keine Lösung habe.

  • Ich habe die _CreatePath Funktion modifiziert und die Ergebnisse werden schon besser, was mache ich falsch?
    Ich denke auch nicht das die Änderung an sich sonderlich Effizient ist.


    Ergebnis:

    array.PNG

    Ps: Ich gebe 3 Arrays in der FindDuplicates Funktion zurück, da ich nicht weiß welchen ich benutzen soll/kann :D