Guis Buggen in einander

  • Guten Morgen zusammen,


    Ich habe das Problem, das bei mir ab und zu zwei GUIs aus einem Skript in einander buggen. das sieht dan so aus:


    eigentlich sollte es so aussehen:



    die Zweite GUI sollte am anfang eigentlich versteckt sein, wesshalb ich sie auch am Anfang geziehlt verstecke mit dem Befehlt:



    Code
    GUISetState(@SW_HIDE, $hNewError)

    da ich mir nicht sicher bin, ob es sinnvoll ist die 1000 zeilen code die das gesamte Programm hat, erstmal nur der teil in dem die zweite GUI erstellt wird:


    vielen Dank schon mal

    Gruß

    Flo

  • Habe keine Ahnung in diese Himmelsrichtung, aber im engl. Wiki gibt es ein Tutorial dazu: https://www.autoitscript.com/wiki/Managing_Multiple_GUIs

  • _Metro_CreateButton

    Ich kenne die Funktion nicht, vermute aber mal in der Richtung den Fehler.


    Wenn das Erstellen von Control in eine Funktion ausgelagert wird, die selbst das Handle des Fensters anfordert, für das sie aktiv werden soll (ist ja sinnvoll), muss gewährleistet werden dass in der Funktion Folgendes zu finden ist:

    AutoIt
    Func _CreateCtrl($hGui,.....)
        Local $hOld = GuiSwitch($hGui)
        ...
        ...
        GuiSwitch($hOld)
    EndFunc

    Nur so ist gewährleistet, dass die Control auch sicher auf dem gewünschten Fenster erstellt werden.

  • Ich kenne die Funktion nicht, vermute aber mal in der Richtung den Fehler.

    Nur so ist gewährleistet, dass die Control auch sicher auf dem gewünschten Fenster erstellt werden.

    Dem kann ich mich nur anschliessen, denn möglicherweise hat der Autor der verwendeten UDF (Metro Gui?) leicht geschludert. Wenn der Autor bekannt solltest du also Kontakt mit ihm aufnehmen. Da du ja auch in https://www.autoitscript.com/f…-two-guis-bugging-to-one/ suchst ein kleines :thumbdown:


    mfg (auto)Bert

  • hi,


    Danke für die hilfe.


    Ich hab vergessen, zu erwähnen, das ich die UDF verwende. Eure Vermutung, das dort GuiSwitch( fehlt ist richtig. es müsste doch ausreichen, wenn ich das selbst in meinem Code mache richtig?GrußFlo

  • es müsste doch ausreichen, wenn ich das selbst in meinem Code mache richtig?

    Ja, vor dem Aufruf der UDF-Funktion und danach zurück. Ob der Fehler darin begründet liegt ist nur eine Vermutung, aber du kannst zumindest weiter eingrenzen.

    Was natürlich auch sein kann:

    Du verwendest für deine Ctrl x und y und für Breite u. Höhe nimmst du die Default-Werte. DAS ist immer eine schlechte Idee, da du dann keine Ahnung hast, welche Dimensionen deine Ctrl verwenden und ob sie nicht auch über den Fensterrand hinausragen.

  • Ich werde es so bald ich kann ausprobieren.


    Die _Metro_CreateGUI weicht etwas von der GUICreate ab:


  • Ich glaube du rufst eine gui in der funktion gui auf.


    Ich habe dir mal ein kleines beispiel erstellt wie ich das mache um bei großen Projekten etwas die Übersicht zu wahren.


    Vielleicht hilft dir das.


  • MojoeB : Dieser "Mixed Mode" erfordert Konzentration und Disziplin. Manche Profi's meinen deshalb nur für Sie und Ihresgleichen Farben geschmückten zu Erlauben. Von mir jedenfalls ein :thumbup: . Wenn du jetzt noch Profis wie BugFix , Oscar oder Andy dazu bringst das Beispiel aufzuHübschen hast du SchlagArtig eine ganze Reihe: :thumbup::thumbup::thumbup:    :thumbup:  :thumbup::thumbup::thumbup:


    mfg (auto)Bert

  • das Beispiel aufzuHübschen

    ;) Was stellst du dir darunter vor?


    Es ist ein Bsp. zu einer konkreten Konstellation, somit nicht direkt für eine allgemeingültige UDF nutzbar.

    Aber was am Inhalt verbessert werden kann:

    - Array-Funktionen sind nicht nötig. Die Anzahl der Elemente sind bekannt, das Array kann somit mit erforderlicher Zahl deklariert und per Indexierung belegt werden.

    - Speichern der Ctrl-Namen ist nicht erforderlich, kann bei Bedarf über die ID abgefragt werden (s. hier: GuiCtrlInfo.au3)

    - Ich würde z.B. ein gemeinsames 2D-Array für hWnd und ID führen: [[hWnd_1,ID_1], [hWnd_1,ID_2],..,[hWnd_1,ID_n],[hWnd_2,ID_1], [hWnd_2,ID_2],..,[hWnd_2,ID_n]] , aber das ist Geschmackssache

  • Moin,


    Dein Codeschnipsel ist leider nicht wirklich hilfreich.


    Die _Metro_Create-Funktionen arbeiten wie die GUICtrlCreate-Funktionen mit dem 'aktuellen' GUI-Fenster. Deshalb gibt es auch kein internes GUISwitch(). Wenn ein Fensterhandle gebraucht wird, wird das mit einer internen Funktion geholt:

    AutoIt
    Func GetCurrentGUI() ;Thanks @binhnx
        Local $dummyCtrl = GUICtrlCreateLabel("", 0, 0, 0, 0)
        Local $hCurrent = _WinAPI_GetParent(GUICtrlGetHandle($dummyCtrl))
        GUICtrlDelete($dummyCtrl)
        Return $hCurrent
    EndFunc   ;==>GetCurrentGUI

    Wenn also normale oder auch Metro-Controls im falschen Fenster landen. kann das nur daran liegen, dass sich zwischen dem Erstellen des Zielfensters und dem Hinzufügen von Controls das 'aktuelle' Fenster geändert hat. Das geht allerdings nur mit einem GUISwitch(), GUICreate() und vielleicht auch (sollte jedenfalls) GUIDelete(). Ich halte das deshalb für einen Designfehler.

  • - Array-Funktionen sind nicht nötig. Die Anzahl der Elemente sind bekannt, das Array kann somit mit erforderlicher Zahl deklariert und per Indexierung belegt werden.

    - Speichern der Ctrl-Namen ist nicht erforderlich, kann bei Bedarf über die ID abgefragt werden (s. hier: GuiCtrlInfo.au3)

    - Ich würde z.B. ein gemeinsames 2D-Array für hWnd und ID führen: [[hWnd_1,ID_1], [hWnd_1,ID_2],..,[hWnd_1,ID_n],[hWnd_2,ID_1], [hWnd_2,ID_2],..,[hWnd_2,ID_n]] , aber das ist Geschmackssache



    Hey Bugfix :) habs mir mal GuiCtrlInfo.au3 grad angesehen ich glaub das wird mir für die Zukunft eine menge zeit sparen :):thumbup:



    Dieser "Mixed Mode" erfordert Konzentration und Disziplin.

    JA das hab ich gemerkt :D, danke für :thumbup:

  • Hallo Floooooo24,


    hast du mal versucht die $ParentGUI anzugeben?


    _Metro_CreateGUI($Title, $Width, $Height[, $Left = -1[, $Top = -1[, $AllowResize = False[, $ParentGUI = ""]]]])



    ; #FUNCTION# ====================================================================================================================

    ; Name ..........: _Metro_CreateGUI

    ; Description ...: Creates a modern borderless GUI with the colors of the selected theme.

    ; Syntax ........: _Metro_CreateGUI($Title, $Width, $Height[, $Left = -1[, $Top = -1[, $AllowResize = False[, $ParentGUI = ""]]]])

    ; Parameters ....: $Title - Title of the window

    ; $Width - Width

    ; $Height - Height

    ; $Left - [optional] Window pos X. Default is -1.

    ; $Top - [optional] Window pos Y. Default is -1.

    ; $AllowResize - [optional] True/False. Default is False. ;Enables resizing + drag move for the gui.

    ; $ParentGUI - [optional] Handle to the parent gui. Default is "".

    ; Return values .: Handle to the created gui

    ; Example .......: _Metro_CreateGUI("Example", 500, 300, -1, -1, True)

    ; ===============================================================================================================================


    Benutze selbst immer mal die _Metro_CreateGUI, habe aber bisher keine 2 GUI's in einem Script benötigt.


    Gruß gmmg

  • Guten Tag zusammen,


    Danke für eure ganze Hilfen. Die $ParentGUI habe ich ergänz, aber ich glaube tatsächlich, dass das Problem wo danders liegt:


    Ich habe einen Dbugger in das Programm eingebunden, welcher wohl ein paar Probleme macht, zumindest in einem anderen skript, bei dem ich durch zufall drauf gekommen bin.

    Dort sind beim verwenden von GUICtrlSetGraphic() immer wieder Programmzeilen nicht richtig ausgeführt worden.


    hier fehlt zum Beispiel ein Bezier und eine Line, welche dann durch das schließen der Form ersetzt wurde.


    Erst als ich den Debugger am Anfang nicht stoppen lies gab es keine Probleme mehr.


    Kennt ihr einen guten Debugger, der nicht solche probleme hat?


    Gruß Flo