Untermenüs aufrufen

  • Mal wieder lange gesucht und nicht gefunden:

    Ich baue mir mit GuiCreate und GUICtrlCreateCombo ein Menüfenster auf. Jetzt suche ich eine Möglichkeit, dass sich bei Klick auf einen der definierten Buttons ein neues Fenster öffnet, wo ich weitere Unterpunkte unterbringen kann z.B. mit GUICtrlCreateCombo. Nach dem Schließen soll dann wieder das erste Menü aktiv sein.

  • Ich baue mir mit GuiCreate und GUICtrlCreateCombo ein Menüfenster auf.

    Wäre GUICtrlCreateMenu nicht möglicherweise geeigneter um sich ein Menüsystem aufzubauen ?

    Poste bitte mal Deinen Code, den Du bereits erstellt hast.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Das wären grob geschätzt knapp 8.000 Zeilen 8)

    Aber so sieht eines der Menüs aus, aufgebaut mit $hGUI2 = GUICreate(...) und $idButtonMessageIntern = GUICtrlCreateButton(...) und ca. 70 $aCheckboxes[$i] = GUICtrlCreateRadio(...).

    Ich suche jetzt eine Möglichkeit, dass beim Klick auf einen der Buttons ein Fenster mit einem Untermenü aufgeht, das über dem vorhandenen liegt und ähnlich aussieht, nur kleiner.

    Wenn das mit GUICtrlCreateMenu besser geht, bräuchte ich mal ein kleines Beispiel. Die aus der AutoIt-Hilfe sehen anders aus.


  • Also ehrlich gesagt, kann ich nur raten, was du willst.

    Hier mal meine Vermutung:


    Du hast sehr viele Menüpunkte, die du zur Auswahl benötigst.


    Dazu verwendet man Untermenüs. Wenn ich deinen Screenshot richtig interpretiere, beginnen viele Menüpunkte mit demselben Buchstaben - danach kannst du gruppieren.

    Hier mal ein simples Bsp.



    EDIT:


    Ich habe mal noch eine Array-Variante erstellt. Der Vorteil liegt hier in einer übersichtlicheren Gestaltung und mit wachsender Anzahl an Menüpunkten wird im Vergleich der Schreibaufwand geringer, da die Erstellung in einer Schleife abläuft. Du kannst auch die Anzahl der Menüs und deren Item jederzeit gut anpassen. Wäre auch außerhalb des Programms machbar, wenn du die Daten aus einer Ini- oder Konfigurationsdatei lädst.

  • Neuer Versuch, es ist kein Menü im eigentlichen Sinne:

    es handelt sich um ein Gui-Fenster mit Buttons und wenn ich einen davon klicke soll ein zusätzliches (Sub-)Gui-Fenster darüber aufgehen mit neuen Buttons.

    Also ist die Frage, ob man in einer Gui eine weitere Gui definieren kann.

  • Ja, kann man.

    Es muss aber im Skript definiert sein, welche Möglichkeiten bestehen und was bei welcher Auswahl passiert. Ein "Baukasten" für den Anwender aus beliebigen Ctrl ist nicht möglich. Du müsstest hier also schon mal sehr konkret sagen Was und Wie passieren soll.

    Aber warum versteifst du dich auf diese Lösung? Evtl. X-Y-Problem? Du hast ein Problem und meinst X sei die richtige Lösung und versuchst mit großem Aufwand das umzusetzen und übersiehst, dass Y zu einem besseren Ergebnis führen kann.

    Bis jetzt sehe ich nichts, was gegen die Menüvariante spricht.

  • soll ein zusätzliches (Sub-)Gui-Fenster darüber aufgehen mit neuen Buttons.

    Ich habe mal ein minimales Muster erstellt, mit dem du zur Laufzeit Gui erstellen kannst und darauf Button und Label. Ist ohne jede Fehlerabfrage. Kannst du dann beliebig um andere Ctrl und Parameter erweitern.



    EDIT

    Ein "Baukasten" für den Anwender aus beliebigen Ctrl ist nicht möglich.

    Das hat weiterhin Bestand, auch wenn das hier im ersten Moment nach Baukasten ausschaut. Was nicht enthalten ist - müsstest du noch definieren - was denn bei Klick auf die neu erstellten Button passiert. Dazu musst du bereits im Vorfeld alle möglichen Funktionen erstellen und kannst diese dann ja auch zum Zuordnen in einer Combo bereitstellen. (EDIT: Habe ich im Bsp. noch ergänzt.) Dann hast du fast eine eierlegende Wollmilchsau. :rofl:

  • Ja, kann man.

    Aber warum versteifst du dich auf diese Lösung? Evtl. X-Y-Problem? Du hast ein Problem und meinst X sei die richtige Lösung und versuchst mit großem Aufwand das umzusetzen und übersiehst, dass Y zu einem besseren Ergebnis führen kann.

    Bis jetzt sehe ich nichts, was gegen die Menüvariante spricht.

    Danke für die Hilfe. Dein Script ist wesentlich kann mehr als ich im Moment brauche und ist aber super für künftige Entwicklungen, also tatsächlich eine Wollmilchsau ;)


    Gegen die Menüvariante spricht, dass mein Programm fertig ist und das Umstellen mit Sicherheit mehr Aufwand wäre. Es liest neben anderen Funktionen automatisch aus einer csv-Datei für alle möglichen Webzugänge die URL, die XPathe und die Anmeldedaten und setzt diese in Ctrls/Buttons auf einer Seite um. Alle Zugänge sind komfortabel permanent zu sehen und erscheinen nicht erst als Untermenü beim Anklicken. Das ist alles fertig und funktioniert vollautomatisch. Für einen neuen Zugang muss ich nur in der csv 2-7 Werte eintragen und sofort ist mein "Menü" entsprechend erweitert. Klick darauf - angemeldet.


    Da das inzwischen sehr viele Zugänge sind, habe ich ein paar Buttons dabei, bei denen aus Platzgründen nicht direkt eine Seite aufgerufen werden soll, sondern nur eine Unterauswahl angezeigt wird.


    Beispiel WDR: damit mir WDR1 WDR2 WDR3 WDR4 WDR5 nicht so viel Platz wegnehmen, ist meine Idee, bei Klick auf WDR einfach ein neues kleines Fenster zu öffnen über dem aktuellen Fenster mit 5 Buttons für die 5 WDR. Wenn man einen von denen anklickt, soll die URL WDRx geöffnet und der Abspielbutton geklickt werden, das zu Programmieren beherrsche ich.


    Gesucht nur: ich befinde mich in der While-Schleife einer Gui, möchte bei einem Klick auf einen bestimmten Button eine neue Gui öffnen, dort etwas anklicken können und danach wieder in der Endlosschleife der ersten Gui weitermachen. Also geschachtelte Gui's erzeugen.


    Mein Problem ist ausschließlich das Öffnen der neuen Gui on top der alten und das Beenden der Gui und der Rücksprung in die alte Gui nach Ausführen eines Befehls (oder Esc), den Rest habe ich im Griff. Bei meinen bisherigen Versuchen war nach Schließen der neuen Gui die alte tot, ist aber vermutlich nur ein Befehl der mir fehlt.

  • Mein Problem ist ausschließlich das Öffnen der neuen Gui on top der alten und das Beenden der Gui und der Rücksprung in die alte Gui nach Ausführen eines Befehls (oder Esc), den Rest habe ich im Griff. Bei meinen bisherigen Versuchen war nach Schließen der neuen Gui die alte tot, ist aber vermutlich nur ein Befehl der mir fehlt.

    Achso, also wesentlich einfacher, als ich dachte.


    Alle GUI sind im Voraus zu erstellen. Bei Bedarf (Buttonklick) wird die jeweilige GUI mit GUISetState(@SW_SHOW, $hwndGuiSub) angezeigt. Da die GUI und somit deren Ctrl im Vorfeld definiert sind, können auch alle Ctrl in derselben Schleife abgefragt werden.

    Wichtig ist nur, dass beim Schliessen der Sub-GUI NICHT der Befehl Exit ausgeführt wird, sondern GUISetState(@SW_HIDE, $hwndGuiSub) ( s. Zeilen #56 bis #63 in meinem Skript )

  • Beispiel WDR: damit mir WDR1 WDR2 WDR3 WDR4 WDR5 nicht so viel Platz wegnehmen, ist meine Idee, bei Klick auf WDR einfach ein neues kleines Fenster zu öffnen über dem aktuellen Fenster mit 5 Buttons für die 5 WDR.

    Ich habe mal ein Bsp. mit Popup-Child-Windows erstellt. Das entspricht wohl dem, was du möchtest:


    EDIT

    Ich habe noch angepasst, dass die Sub-Gui auch genau an dem Button platziert werden, der sie öffnet.




  • Achso, also wesentlich einfacher, als ich dachte.


    Alle GUI sind im Voraus zu erstellen. Bei Bedarf (Buttonklick) wird die jeweilige GUI mit GUISetState(@SW_SHOW, $hwndGuiSub) angezeigt. Da die GUI und somit deren Ctrl im Vorfeld definiert sind, können auch alle Ctrl in derselben Schleife abgefragt werden.

    Wichtig ist nur, dass beim Schliessen der Sub-GUI NICHT der Befehl Exit ausgeführt wird, sondern GUISetState(@SW_HIDE, $hwndGuiSub) ( s. Zeilen #56 bis #63 in meinem Skript )

    Das war mein Problem: ich habe die 2. Gui innerhalb der ersten definiert und dann mit einer eigenen Schleife. So wurde sie z.B. beim 2. Aufruf noch mal neu deklariert ... Und den Befehl GUISetState() hatte ich auch noch nicht gefunden, stattdessen habe ich GUIClose() versucht :S

    Speziell, dass das Ganze in einer Schleife laufen kann, hilft enorm weiter, auch an anderer Stelle. Da habe ich extra 2 parallele GUIs definiert, die fast, aber nicht ganz, dasselbe machen. Mit ein wenig Überlegung kann ich das vielleicht in eine Schleife packen :)

    Über ...$WS_EX_MDICHILD, $hGuiMain... bleibt das Sub vermutlich an der Position des Aufrufbuttons hängen? Das wäre mein nächstes Problem gewesen: der User verschiebt das Urmenü und wenn das Sub dann fest irgendwo positioniert wäre, dann hängt es evtl. irgendwo in der Ferne anstatt da wo es soll.

    Vielen Dank, das ist eine Super-Hilfe - teste ich heute Abend!


    Gleich noch zwei Fragen:

    kann man einen Button bei GUICtrlCreateButton( ) über eine Textvariable definieren, also statt

    $idButtonSophos = GUICtrlCreateButton("Sophos", 8, 20, 60, 30, $BS_MULTILINE)

    so was in der Art wie

    $sName = "Sophos"    

    $idButton & $sName = GUICtrlCreateButton($sName, 8, 20, 60, 30, $BS_MULTILINE)

    Geht vermutlich nicht oder doch?


    kann man ein Submenü auch an einen Button

    $aCheckboxes[$i] = GUICtrlCreateRadio("&" & $aVersichererListe[$i], ...)

    hängen, wenn man die Nummer oder den Namen kennt?

    Bei diesen dynamisch aufgebauten Ctrls (aus der csv-Datei) könnte ich nämlich auch nur dynamisch feststellen, wo ein bestimmter Button gerade liegt, da durch die Änderung der csv auch die neue Pos. vom Button bestimmt wird. An den Rändern meiner Oberfläche sitzen die Ctrls über GUICtrlCreateButton's und in der Mitte die dynamischen.

  • Könnte man machen (schau dir mal Assign und Eval an), ist aber nicht unbedingt zu empfehlen.

    "Sprechende" Variablen lassen sich dann besser über ein "Scripting.Dictionary" definieren.

    Grundsätzlich kann man das (meine Empfehlung) aber mit Arrays absolut dynamisch lösen.

    kann man ein Submenü auch an einen Button

    $aCheckboxes[$i] = GUICtrlCreateRadio("&" & $aVersichererListe[$i], ...)

    hängen, wenn man die Nummer oder den Namen kennt?

    Wenn du mit Submenü jetzt die Sub-Gui meinst: ja. Ob das Event von einem Button, Radiobutton oder einer Checkbox ausgelöst wird ist völlig egal. Selbst ein Klick auf ein Label könnte dafür genutzt werden.


    Kannst ja mal probieren. Aber bevor du dein Mammutskript umbaust, melde dich bei Problemen, vielleicht auch mit einer abgespeckten Version, die dein System verdeutlicht.



    EDIT

    Was jetzt eigentlich total außen vor geblieben ist: Für dynamische Daten gibt es ja auch dynamische Control: Listbox, Listview, Treeview, Tab, TreeviewTab.

    Das erleichtert deutlich die Verarbeitung einer großen Anzahl von Daten.

  • Bei diesen dynamisch aufgebauten Ctrls (aus der csv-Datei) könnte ich nämlich auch nur dynamisch feststellen, wo ein bestimmter Button gerade liegt, da durch die Änderung der csv auch die neue Pos. vom Button bestimmt wird.

    Ich habe dir jetzt mal ein Bsp. erstellt, wie du aus einer csv-Datei abhängig von der Anzahl der Einträge Button erstellst und diese abfragst.

    Neue Einträge in der csv werden so vollautomatisch berücksichtigt.

    Du kannst natürlich auch Checkboxen verwenden, wenn dir das mehr gefällt. Allerdings entspräche das nicht deren Bestimmung und du müsstest diese nach der Aktion jedes mal deaktivieren.


  • Ich hätte vorher fragen sollen, das hätte mir sicher viele Stunden erspart :thumbup:

    Das Programm ist größtenteils fertig und manche Funktionen habe ich ähnlich eingebaut. So lese ich z.B. aus einer csv die Ctrls, URLs, XPathe für die Felder User, Passwort und Anmeldebutton, Sprungmarken für evtl. Weiterverarbeitung in Functions und aus einer anderen verschlüsselten csv die Credentials für die Anmeldungen. Das ist incl. der Liste der User und der für den einzelnen User erlaubten Ctrls und ggf. userspezifischen Credentials alles dynamisch.

    Aber: das Programm hat sich immer weiter ebenfalls zu einer eierlegenden Wollmilchsau entwickelt, so dass es eine User und eine Administrator-Oberfläche gibt z.B. mit Anzeige, wer gerade wo angemeldet ist und automatisches Wählen von Telefonnummern, ToDo-Liste, Aufruf von häufig genutzten Programmen, Abfangen von Klicks auf Links in Mails oder wenn man irgendwo in Windows mit "Kopieren" einen Link kopiert, Prüfung ob dazu eine Anmeldung erforderlich ist, wenn ja Anmeldung und dann Aufruf des Links. So habe ich nach und nach alles eingebaut, was mir irgendwie sinnvoll erschien - aber vermutlich mit wesentlich mehr Code als tatsächlich erforderlich. Jetzt optimiere ich und muss auch Platz schaffen und dazu die Sub-GUs.

    "Dynamische Controls: Listbox, Listview, Treeview, Tab, TreeviewTab" muss ich mir mal anschauen.