Treeview Icons einzeln ändern

  • Hallo zusammen,


    ich habe eine GUI erstellt, welche einen Ordner via TreeView darstellt. In dem Ordner sind ausschließlich .txt-Dateien. Die TreeView Einträge sollen jedoch unterschiedliche Icons erhalten. Momentan erhalten alle gelisteten Items dasselbe Icon von mir über den folgenden Befehl:


    AutoIt
    1. _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 134)


    Hier sicherheitshalber die Funktion einmal im ganzen:



    Ich habe nun versucht, über eine IF-Then Abfrage den Items unterschiedliche Icons zuzuweisen was leider fehlschlägt :(


    Eigentlich soll das Tool schauen, das in den Textdateien ein bestimmter Wert vorkommt um anschließend diese Datei durch ein entsprechendes Icon besser hervorzuheben.


    Ich habe also die oben stehende Funktion wie folgt geändert, jedoch ohne Erfolg:



    Für mich sollte also folgendes passieren: Findet mein Programm in der Textdatei in Zeile 5 den Wert 4, so soll das Icon 134 verwendet werden, andernfalls soll Icon 77 verwendet werden. Sollte eigentlich nicht so schwer sein, ich beiss mir aber die Zähne dran aus :(


    Jemand ne kleine Idee für mich?

    LG

  • hast du mal geprüft ob die Schleifen auch angesprungen werde? Sprich erfüllt sich die Bedingung auch?

    Schau mal die Hilfefunktion zu _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem an


    Gruß


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

  • $read_reservierung = FileReadLine(StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\'),5)
    If $read_reservierung = 4 then

    Ich kenne den Inhalt deiner Textdatei nicht, aber wenn die erste Zeile keinen Fehler ergibt,

    kann die zweite Zeile niemals ein positives Ergebnis bringen.

  • Hier muss ich doch mal etwas Kritik üben.

    mirko2002 : Du bist seit 2011 hier angemeldet und dann kannst Du Dein Problem nicht mal mit einem funktionierenden Beispiel beschreiben (nicht jeder hat die Lust, daraus erstmal ein Beispielscript zu basteln)?

    Außerdem verwendest Du hier eine fremde UDF (Meine! Nicht dass ich etwas dagegen habe, aber Du solltest sie auch komplett mitgeben: _CreateDirectoryRecursive fehlt).

    Der Inhalt der Textdatei ist für das Problem auch nicht ganz unwichtig. Wenn Du also ein funktionierendes Beispiel schreiben würdest, bei dem man das Problem nachvollziehen kann, dann würdest Du sicher auch kompetente Hilfe bekommen.

  • Velleicht sollte man - den Hilfesuchenden hier im Forum mal einen Generaltipp zur Fehlersuche geben!

    msgbox, msgbox, msgbox..............msgbox


    Da werden If Schleifen, case Bedingungen usw. eingebaut - jeder wundert sich warum ..."es nicht funktioniert".... aber keiner kommt auf die Idee mal auf die billig Art zu testen ob sich die Bedingungen auch erfüllen. Anstelle großartigen Code zusammenzupasten, dessen Funktion dann bezweifelt wird, mal eine schnöde msgbox einbauen - und nachsehen ob sich die Abfragen auch erfüllen (können). Danach kann mann dann über die Funktion als solches sprechen. Auch sollte man, anhand der Beispiele in der Hilfe, probieren ob die Funktion kann was man erwartet.


    Erst wenn man einen Aufruf "nackt" verstanden hat - baut man das ganze zu komplexen Code zusammen.


    Und ja Oscar hat recht - Problembeschreibung in ganzen, verständlichen Sätzen ist hilfreich. Jeder versteht, dass das manchmal nicht auf den ersten "Anlauf" funktioniert, Man setzt manches als bekannt voraus, was sich dem Aussenstehenden nicht erschließt, aber ein Minimum an Verständlichkeit sollte es schon geben!


    Gruß


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

  • Da werden If Schleifen, case Bedingungen usw. eingebaut - jeder wundert sich warum ..."es nicht funktioniert".... aber keiner kommt auf die Idee mal auf die billig Art zu testen ob sich die Bedingungen auch erfüllen. Anstelle großartigen Code zusammenzupasten, dessen Funktion dann bezweifelt wird, mal eine schnöde msgbox einbauen - und nachsehen ob sich die Abfragen auch erfüllen (können). Danach kann mann dann über die Funktion als solches sprechen. Auch sollte man, anhand der Beispiele in der Hilfe, probieren ob die Funktion kann was man erwartet.

    Ist in Ordnung, aber für die meisten Fälle ist ConsoleWrite wohl eher der way-to-go.

    In der Konsole werden die Ergebnisse schön zusammengetragen und man muss sie sich nicht merken.


    MsgBox ist gut, wenn man das Script an bestimmten Stellen wirklich unterbrechen möchte und es nicht weiter interpretiert werden soll (bis zum Buttonclick).

  • Ja der Buttenclick gibt so wunderbar Zeit zum Nachdenken...... Irgendwie denke ich wohl zu segmentiert.


    Gruß


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

  • Hallo zusammen,


    erstmal vielen Dank für Eure Antworten.


    @Peter - die Hilfe hat mir leider nicht weitergeholfen (oder ich versteh's nicht).


    Tuxedo - also die Abfrage funktioniert schon. Er liest in der vorgegebenen Datei die 5. Zeile aus und dort soll halt entweder 1 oder 4 drin stehen. Das kann er auch wunderbar prüfen. Nur das ändern der Icons macht er dann nicht.


    Oscar - bitte entschuldige. Ich ging davon aus, dass das obige Skript eigentlich alles aussagt... ich poste mal das komplette Skript, dann kann man das ganze nachvollziehen. Lediglich der Pfad muss dann angepasst werden, worauf der TreeView zugreifen soll.



    Die Funktion _ScriptRestart() könnt ihr zum testen rausnehmen... dafür wäre eine extra UDF notwendig.


    Im Prinzip geht es immer nur darum, dass bei Erstellung eines Tickets immer in Zeile 5 der Textdatei der Wert 4 oder 1 steht. Was anderes wird dort nie stehen, denn in dieser Zeile speichere ich ab, ob im Ticket die Checkbox für eine Reservierung aktiviert war oder nicht. In der TreeView Ansicht möchte ich also nun auf anhieb sehen, welche Tickets als Reserierung laufen und welche normal sind, daher möchte ich hier unterschiedliche Icons verwenden damit es optisch raussticht.


    Mit meinem If-Then bin ich ja ins leere gelaufen, bin da aber halt auch kein Profi drin :(

  • Oh ihr habt in der zwischenzeit weiter geantwortet :)


    Mit Msg-boxen arbeite ich permanent - um genau den Zweck zu erfüllen den den beschreibst, Peter. ConsoleWrite bin ich kein Fan von - ich mach das lieber auch per msgbox. Aber es hilft mir hier in dem Fall nicht weiter...

  • An dieser Stelle erst mal ein kleiner Hinweis zum Grundsätzlichen:

    Du packst die Marktdaten, ebenso wie die Abteilungen in den Code. Das bedeutet: Jede noch so kleine Änderung an den Daten---> neu Compilieren. Ich würde solche Angaben in eine Ini auslagern. Dort kann man bequem ändern.


    Im Telefonfeld sollte man ev. auf Zahlen und Trenner prüfen. Aber nicht alles zulassen. Das verhindert flüchtige Fehleingaben. Also z.B +49-1234-4711-4711 läßt also +- und Ziffern von 0 bis Neun zu. Mehr braucht man nicht.


    Gruß


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von Peter S. Taler ()

  • Dein Code ist nicht leicht zu lesen und ohne Beispieldaten nur schwer nachzuvollziehen, aber ich denke, Du hast Deine Abfrage an der falschen Stelle (und mit falschen Daten) gemacht.

    Versuch's mal so:

  • Naja Beispieldaten kannst Du ja selber erstellen indem du in der GUI einfach ein Fake-Ticket erstellst....

    Ich habe nur reale Kundendaten hier die ich unmöglich weitergeben kann :)


    Wie gesagt, die Daten werden ja durch das Programm selber generiert und in die entsprechenden txt-Dateien geschrieben.


    Ich teste mal deinen Code aus und versuche zu verstehen was da passiert... melde mich nachher nochmal zurück :)

  • Das hier ist mit einem minimalbeispiel gemeint:

    Und das funktioniert bei mir ohne Probleme :)

    Schau dir das mal durch, vielleicht findest du dann den Fehler in deinem Script :).

    (Oft findet man den Fehler selbst, wenn man ein solches Minimalbeispiel baut.)


    MfG Kanashius.

  • Oscar

    Habe deinen Code mal getestet.... funktioniert auch exakt wie gewünscht :)


    Versuche noch im Detail zu verstehen wo mein Fehler war bzw was Dein Code im Unterschied bewirkt.


    Btw - Du erwähntest schwere Lesbarkeit meines Codes. Hast Du Tipps was ich anders machen sollte?


    Ich sortiere im Code immer erst die Erstellung der Gui und deren Inhalte, anschließend die Funktionen. Die GUI Elemente hab ich noch keinen schönen Weg gefunden wie man diese lesbar gut einrücken kann, wie ich es in den Funktionen tue...

  • Was Dir Kanashius gezeigt hat - ist genau die richtige Vorgehensweise. Die Grundfunktion zu verstehen. sihe dazu auch #5!

    Leider kann mann Dein Problem nicht so richtig nachvollziehen. Ich habe das auch schon probiert.


    1) Kommentiere Deinen Code. Schreib an Aufrufen, Funktionen dazu was sie machen und weshalb sie etwas machen.

    2) Declariere Pfade zu Dateien, Ausgaben usw. nicht irgendwo im Code sondern zu Begin. Besser noch in die Ini auslagern.

    3) Versuche eine Gebrauchsanleitung zu Beginn des Codes zu schreiben oder in eine ini.

    4) Besonders an IF THEN ELSE niemals vergessen im Klartext dazu schreiben was warum wozu!

    5) Sprechende Variablen

    6) Verschachtle die Abfragen nicht zu tief. Als Beispiel:

    TXT Datei aufrufen - auslesen - kann man in eine Funktion packen. Ini einlesen --> in Funktion packen. So entstehen kleinere Code Teile die man leichter zu etwas ganzem zusammensetzen kann.



    Was nutzt Beispielcode wenn man um zu Helfen 200 Zeilen Code "nachprogramieren" muss um ihn zu verstehen?


    Versuche doch mal festzustellen warum etwas an welcher Stelle nicht funktioniert.

    Teste den Code nicht als ganzes - sondern nur Teile davon!!!!!!

    Schreib den Code, der aus den TXT Files die "Erkenner" extrahiert. Dann die Geschchte mit den Icons anhängen. Wenn dieses Teilsegment funktioniert bau es an der Stelle ins Script ein, wo Du vorher nur eine MSG box hattest, die als Platzhalter diente. Das mag ein wenig umständlich klingen, funktioniert aber besonders für Menschen, wie mich. Ich bin kein Informatiker - sondern "Codezusammensetzer" aus Notwendigkeit und manchmal auch aus Leidenschaft :)


    Hauser baut man auch nicht auf einmal - sondern Stockwerk für Stockwerk.


    Bitte an alle Programmprofis. Bitte nicht schlagen. Das sind gutgemeinte Ratschläge, die mir bei meinen Projekten immer geholfen haben, Mancher kann es besser - aber der ist ja oft auch "Profi".


    Gruß aus einer frisch verschneiten Winterlandschaft


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

  • Hallo Peter,


    danke für die ausführliche "heransgehensweise"... manchmal verliere ich mich selber im Code und entferne öfter meine Kommentare aus dem Code da ich denke, später brauche ich diese nicht mehr... ich versuche meinen Code auf so wenig Zeilen wie möglich zu schröpfen und dabei fallen unter anderem auch oft Comments mit zum Opfer :(


    Obwohl ich eigentlich alle von dir oben angesprochen Punkte kenne, nutze ich diese Weise jedoch zu selten. Da muss ich noch etwas an meiner Arbeit feilschen :)


    Auf jeden Fall vielen Dank für die tolle Unterstützung hier... so kann ich mit meinem Skript weitermachen. Die Telefonnummernprüfung habe ich übrigens auch schon drin was du vorher bereits erwähntest....


    :) :) :)

  • Ich schreibe von Projekt zu Projekt mehr Kommentare - da es mich immer wieder erschreckt, dass ich Code, den ich vor 12 Wochen geschrieben habe - nicht mehr (sofort) verstehe.


    Ich habe festgestellt, dass man sich oftmals fragt warum man etwas macht. Nicht sosehr was macht die Funktion - sondern weshalb wird diese aufgerufen - was bezweckt man damit.


    Dem Script ist es egal ob es 200 Zeilen länger oder kürzer ist :)


    Gruß


    Peter

    Hinweise auf Suchmaschienen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

  • Btw - Du erwähntest schwere Lesbarkeit meines Codes. Hast Du Tipps was ich anders machen sollte?

    Peter hat diverse Dinge bereits genannt. Und Kommentare auf keinen Fall löschen. Wenn Du nach ein paar Monaten Deinen Code nochmal ansiehst, wirst Du über jede Kommentarzeile froh sein.

    "Best coding practices" ist auch immer zu empfehlen. Zusätzlich kann man Regionen verwenden, um zusammengehörige Teile besser lesbar zu machen. Ich habe mal den Anfang von Deinem Script etwas bearbeitet (das sieht hier im Forum nicht so gut aus, musst Du in SciTE anschauen):

    Wenn Du SciTE benutzt, ist Tidy (STRG & T) auch gut geeignet, um Code-Einrückungen zu automatisieren.

  • Alles klar....


    auch das mit den Regionen war mir bereits bekannt... zwischendurch habe ich es schon genutzt... ich sollte es nur mal dauerhaft umsetzen....


    *asche auf mein Haupt*



    Danke Euch allen :)