Frage zur GUI

  • Ich hätte da mal ein paar Fragen (Ideenvorschläge) zu einer GUI... um genauer zu sein zu einem ListView, Code im Spoiler...

    Lange Rede kurzer Sinn... Da ich im Script mit Mysql arbeite, habe ich mal zur Veranschaulichung die Daten "fest eingetragen" und alles was irgendwie mit SQL zu tun hat auskommentiert.. ist zwar unübersichtlicher, zeigt aber dass hier wirklich Sinn hinter steckt :P

    Folgendes hätte ich gerne:

    -Nach dem füllen der Werte in den Listview soll die Spalte entweder an die Länge der Spaltenüberschrift (wenn diese länger ist als der Inhalt darunter) ansonsten an den Inhalt angepasst werden.

    -Zudem soll nach dem Verfallsdatum (nur nach dem Verfallsdatum) sortiert werden, nämlich das kürzere Verfallsdatum oben...

    Ist das so machbar oder muss ich da eine andere Funktion für haben, oder habe ich in den GUI Control Styles einen Punkt überlesen, der mir die Funktion bereit stellt?

    Dann eine weitere Frage:

    Wenn ich den Eintrag mit dem kürzeren Verfallsdatum markiere, soll (beim markieren, also markieren durch klicken) weiterer Code ausgeführt werden... wie bewerkstelligt man das? Braucht es dazu eine ID um den Eintrag in der SQL zu identifizieren? (In der SQL gibts auch ne ID logischerweise, den ich aber nicht mit auslese)

    Spoiler anzeigen

    Vielen Dank im Voraus an alle die für mich mitdenken und helfen (wollen) :thumbup:

  • Hallo Sonderbaar

    -Nach dem füllen der Werte in den Listview soll die Spalte entweder an die Länge der Spaltenüberschrift (wenn diese länger ist als der Inhalt darunter) ansonsten an den Inhalt angepasst werden.

    Schau dir hierzu mal _GUICtrlListView_SetColumnWidth an.

    -Zudem soll nach dem Verfallsdatum (nur nach dem Verfallsdatum) sortiert werden, nämlich das kürzere Verfallsdatum oben...

    Sortieren nach Verfallsdatum, ist natürlich möglich. Jedoch musst du wohl (meines Wissens nach) entweder alle Daten noch mal durch _DateDiff schicken oder du änderst das Zeitformat in yyyymmdd. Das könntest du ja direkt sortieren. Vielleicht solltest du das Datum auch so in deiner DB speichern und zum sortieren verwenden (müsstest es ja nicht anzeigen).

    Wenn ich den Eintrag mit dem kürzeren Verfallsdatum markiere, soll (beim markieren, also markieren durch klicken) weiterer Code ausgeführt werden... wie bewerkstelligt man das? Braucht es dazu eine ID um den Eintrag in der SQL zu identifizieren? (In der SQL gibts auch ne ID logischerweise, den ich aber nicht mit auslese)

    Um das markieren auszuwerten gibt es mehrere Methoden. Schau dir mal _GUICtrlListView_GetSelectedIndices an.

    Entweder du nutzt, wie du selbst meinst die ID direkt (die du ja nicht in der LV anzeigen musst) oder du machst mit den Daten aus der LV einfach eine Abfrage, um den richtigen Eintrag zu identifizieren.

    Grüße autoiter

  • ColumnWidth steht ja schon dort.

    Sortieren würde ich direkt schon über die SQL-Abfrage. Das sollte schneller gehen:

    Stichwort ORDER BY: https://www.w3schools.com/sql/sql_orderby.asp

    Was das auswerten des klicks angeht:

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    und das entsprechend auswerten:

    Wenn du wissen willst, was da noch alles geht schau dir mal das Beispiel unter _GUICtrlListView_Create genauer an. Dort sind alle Messagecodes mit Beispiel, die du abfragen kannst.

    MfG Kanashius

  • Hallo Kanashius, hallo @all

    Was das auswerten des klicks angeht:


    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    Ich habe das mal mit Tastaturbefehlen probiert und finde es schwierig, das richtige Item zu identifizieren - egal ob DOWN oder PGDOWN gedrückt wurde. Bei Seitensprüngen muss man doch erst einmal ermitteln, wie viele Items gerade angezeigt werden, oder?

    Mein aktueller Weg wäre in der Schleife das aktuell markierte Item zu erfragen, was natürlich viel weniger performant ist. Daher wäre ich auch sehr froh, wenn ein Pro erklärt, wie man in der WM_NOTIFY richtig mit den Tatstendrücken umgeht.

    Grüße autoiter

    • Offizieller Beitrag

    Ich habe das mal mit Tastaturbefehlen probiert und finde es schwierig, das richtige Item zu identifizieren - egal ob DOWN oder PGDOWN gedrückt wurde. Bei Seitensprüngen muss man doch erst einmal ermitteln, wie viele Items gerade angezeigt werden, oder?

    Das ist völlig egal. Du fragst den iCode: $LVN_ITEMCHANGED ab und liest aus der Struktur $tagNMLISTVIEW das durch die aktuelle Aktion markierte Item (dessen Index) aus. Wie Kanashius bereits sagte: _GUICtrlListView_Create angucken, da findest du alle Infos.

  • Alles klar. Ich bin ein absoluter Vollpfosten. ^^

    Eigentlich hatte ich es so gemacht (nur $LVN_KEYDOWN). Aber kopieren und einfügen ist für mich offensichtlich nicht so leicht. Ich hatte Index statt Item eingetragen und abgefragt. Da kam dann immer Null heraus. Warum nur.. :rolleyes:

    Grüße autoiter

  • ColumnWidth steht ja schon dort.

    Sortieren würde ich direkt schon über die SQL-Abfrage. Das sollte schneller gehen:

    Stichwort ORDER BY: https://www.w3schools.com/sql/sql_orderby.asp

    Mein Gott, das Leben kann so einfach sein... danke... ich stell mich dann auch in die Reihe der Vollpfosten ;(

    Das mit dem WM_notify muss ich mir noch genauer anschauen, solange lasse ich das Thema noch offen...

    Danke an alle und ein schönes WE

  • Hallo zusammen,

    ich konnte endlich etwas Zeit investieren mit WM_Notify anzuschauen...

    leider habe ich das Problem, dass wenn der WM_Notify den Klick auf eine Zeile mitbekommt zwar die GUI aufgerufen wird, ABER diese nicht befüllt wird... (keine Labels, keine Inputfelder...

    In dem Consolewrite in Zeile 85 spuckt er tatsächlich auch die ID aus... es kommen auch keine Fehler bei der Abfrage...

    könnt ihr das irgendwie so nachvollziehen?

    Spoiler anzeigen

    Ich hoffe ich habe beim berarbeiten des Codes alles erwischt, damit es Reibungslos läuft auch ohne die MySQL im Nacken... (bisher sind 476 Zeilen zusammen gekommen, mit Auswahl der DB ganz am Anfang und so weiter, was auch alles funktioniert bis zum Punkt an dem die GUI aufgebaut wird und sich das Programm weg hängt...

  • Aus der Hilfe zu GUIRegisterMsg():

    Zitat

    Warning: blocking of running user functions which executes window messages with commands such as "MsgBox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!

    Es eignet sich bei sowas einfach eine Boolean-Variable zu benutzen und diese in der Hauptschleife abzufragen. Sobald sich die Variable ändert ruft man dann die Funktion auf.

    AutoIt
    Global $bListViewClicked = False ; BOOLEAN GLOBAL DEKLARIEREN UND AUF FALSE SETZEN!

    2 Mal editiert, zuletzt von Floops (27. September 2017 um 14:39)

  • Ich konnte mir das Script kaum mit ansehen und hab es mal komplett überarbeitet.

    Schau dir das am besten einfach mal an, davon kannst du dir vielleicht den ein oder anderen Trick abschauen ;)

    Bis auf das SQL funktioniert dort auch alles

    MfG Kanashius :)

  • Du hast es echt komplett auf links gedreht ;(

    Da sind auf jedenfall Sachen bei die ich mitnehme...

    Mein Script entsteht auf der Arbeit, immer mal wieder zwischendurch ein Häppchen... aus Zeitgründen alles dann schnell schnell... so dass es niemanden auffällt... :)

    Zu Hause fehlt mir dafür die Zeit ||

    Daher auch das wüste Chaos... X/