OK-Button erkennen

  • Leider gleich noch eine Frage:

    Ich habe ein Programm wo ich viele Optionen (Checkbox) habe.

    Die Optionen habe ich in verschiedene Fenster aufgeteilt um es für den Anwender etwas übersichtlicher zu machen.

    Da die Optionen-Fenster aber immer gleich ausschauen habe ich mir gedacht dass ich eine Funktion für alle Fenster mache.

    Meine Funktion funktioniert ja eigentlich, jetzt kommt wieder das aber:

    Ich habe einen Close- und OK-Button.

    Wie erkenne ich beim OK-Button welche Optionen angezeigt wurden?

    Natürlich habe ich wieder ein Beispiel:


    Es geht mir da um die Funktion OKOptionsButton() ganz am Ende.

    Gebt mir bitte mal einen Tip wie ich das lösen kann.

    Vermutlich gibts da ja aber auch eine ganz andere (einfachere?) Lösung.

    Danke, schon mal im vorraus.

    • Offizieller Beitrag

    Das Problem ist, dass Du bei jedem Klick auf einen der Optionsbuttons ein neues Fenster erstellst, mit lokalen Variablen (der zweite Fehler).

    Man könnte zwar rückwärts vom Ok-Button wieder das Parentfenster ermitteln und dort dann die Checkboxen, aber das ändert nichts daran, dass Du Dir ein Speicherleck schaffst, durch das ständige neu erstellen von den Fenstern.

    Besser ist es die drei Optionenfenster am Anfang (global) zu erstellen und die IDs der Checkboxen in ein 2D-Array oder drei Einzelarrays speichern.

    So lässt sich beim Klick auf "ok" leicht abfragen, welche Checkboxen gesetzt sind.

  • Ist das Problem mit dem Speicherleck wirklich so gravierend?

    Ich finde die Erstellung aller Fenster am Programmstart und dann mit SHOW und HIDE irgendwie nicht sehr elegand?

    Ich habe nämlich jetzt für das gemeinsame Optionsfenter eine Lösung gefunden:


    Funktioniert sehr gut.

    Alle Optionen werden bei OK ausgelesen und bei erneutem Aufruf sind die Optionen dementsprechend wieder gesetzt.

    Aber wenn das mit dem Speicherleck so grosse Probleme bereitet muss ich das wohl doch anders machen.

  • Ist das Problem mit dem Speicherleck wirklich so gravierend?

    Ich finde die Erstellung aller Fenster am Programmstart und dann mit SHOW und HIDE irgendwie nicht sehr elegand?

    Nein, vom technischen Standpunkt her ist das heutzutage irrelevant aber es wird dir später das Genick brechen wenn plötzlich die Controls auf alte GUIs referenziert werden die nicht mehr existieren.

    Wenn du trotzdem immer die Fenster neu erstellen willst solltest du auch die Fenster löschen wenn du sie neu erstellst, dann hast du das Problem nicht mehr.

    Jedoch gehen dann sämtliche Eingaben verloren wenn du das Fenster wieder hervorholst und du musst sie erneut reinschreiben, deshalb werden grundsätzlich Fenster erzeugt und bei Bedarf versteckt oder angezeigt.

    • Offizieller Beitrag

    Ich finde die Erstellung aller Fenster am Programmstart und dann mit SHOW und HIDE irgendwie nicht sehr elegand?

    Glaub mir, es ist die eleganteste Variante überhaupt. Denn elegant hat auch was mit Effizienz zu tun. Abgesehen davon, dass du mit deiner Variante dein Skript früher oder später crashst, musst du alle anzuzeigenden Elemente ständig neu erstellen. Das frisst Zeit und Speicher - wie kann das elegant sein?

  • Je nach Fall kann man es sich auch sparen mehrere verschiedene aber sehr gleichartige Fenster zu erstellen.

    Hab dein Script zwar nur überflogen, aber mein Eindruck war, dass deine Optionen Fenster sich kaum unterscheiden. Da wäre es auch eine möglichkeit nur mit unterschiedlichen Control-Gruppen zu arbeiten, welche je nach gewünschter "Otionsseite" ein- oder ausgebelendet werden.

  • Naja, das es für das Optionen-Anzeige-Fenster noch viele (bessere) Lösungen gibt (Control-Gruppen, Tab-Control...) möchte ich gar nicht bestreiten.

    Mir ging es ja eigentlich eher darum, wie man aus dem @GUI_WinHandle die enthaltenen Objekte in dem Fenster ermitteln kann, um dann Status, Texte, usw. abzufragen.

    Falls das jemand weiß, ich wäre sehr interessiert daran (ohne dass ich vorher die Obiekt-IDs alle speichern muss).


    BTW: In meinem letztem Skript habe ich natürlich noch einen Fehler in Zeile 103

    Statt

    AutoIt
    GUISetState(@SW_HIDE,@GUI_WinHandle)

    muß es natürlich

    AutoIt
    GUIDelete(@GUI_WinHandle)

    heißen.

    Sonst entstehen wirklich Speicher-Leaks.

    Habe inzwischen zu Multiple GUIs diese Seite gefunden

    https://www.autoitscript.com/wiki/Managing_Multiple_GUIs

    • Offizieller Beitrag

    Mir ging es ja eigentlich eher darum, wie man aus dem @GUI_WinHandle die enthaltenen Objekte in dem Fenster ermitteln kann, um dann Status, Texte, usw. abzufragen.

    Falls das jemand weiß, ich wäre sehr interessiert daran (ohne dass ich vorher die Obiekt-IDs alle speichern muss).

    Buttons oder generell alle Control-Elemente sind unter Windows einfach nur Child-Fenster.

    Hat man das Handle vom Hauptfenster kann man sich alle "Kinder" auflisten lassen: