1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. JBO

Beiträge von JBO

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 22. Dezember 2021 um 11:01
    Zitat von Moombas

    Du blendest den alten Tab "nur aus" müsstest ihn doch aber "Zerstören" und beim nächsten mal anhand der neuen Daten neu erstellen oder bin ich da gerade komplett auf dem Holzweg?

    Ehm, verstehe ich das dann richtig, dass ich die GUI quasi komplett neu aufbauen muss? Weil dann brauch ich ja nur das GUICreate machen, damit etwas vorhanden ist, aber die Lables und Buttons kann ich dann in das Case schieben, wenn ich das ja eh neu aufbauen muss!?

    Zitat von Moombas

    Und mal ganz nebenbei, in deinem Beispiel sind alle "Local" gesetzten Variablen "Global", da sie nicht in einer Funktion gekapselt sind.

    also kann ich alle Variablen auf "Local" ändern? Weil ich die Variablen eigentlich an die Funktionen übergebe?

    Zitat von Moombas

    Ich selber tendiere auch dazu, Werte mit "Const" zu deklarieren, wo sich der Wert nicht mehr ändert (nur mal so am Rande). Das wäre bei den GUI-ID's der Fall.

    Ah ok, das kann ich noch ändern.

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 22. Dezember 2021 um 08:36
    Zitat von BugFix

    Dem Manne kann geholfen werden:

    Online Help

    Beachte den advanced mode.

    :D Danke!!! Funktioniert soweit. Allerdings bleibt das Problem, dass der Inhalt der Tabs nicht anzeigt wird. Wie gesagt, wenn ich die Tabs mehrmals erstellen lasse, dann fängt das GUI an zu flackern, wobei man sieht, dass er sehr wohl den Inhalt aufbaut, aber sofort wieder löscht/überschreibt. Woran kann das liegen, bzw. wie verhindere ich das?

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 21. Dezember 2021 um 16:21

    Da ich gleich off muss, hier nur kurz die Beschreibung, was ich machen möchte. Um ein PAP kann ich mich später kümmern, wenn es dann noch unklar sein sollte:

    Also, ich habe eine Liste (TreeView), die durchsuche ich nach einem bestimmten Schlagwort. Ist dieses in einem der Items (Level 2) vorhanden, soll das Level0-Item in einem Array abgespeichert werden, dazu soll noch ein Teil der Bezeichnung in einem 2. Eintrag im Array gespeichert werden (1. Dimension).

    Da das Programm, was ich mit diesen Informationen füttern möchte, mit zu vielen Einträgen nicht klar kommt und sich dabei verhaspelt, habe ich den Array zerlegt und "Packete". Die Packetgröße soll man über die Einstellungen im Programm bestimmen sollen (2. Dimension) und die Anzahl der Packete ergibt sich aus der Länge der Liste (3. Dimension).

    Nachdem das Array erstellt und aufgeteilt wurde, soll man in einem GUI das Packet, was einem auch angezeigt wird mit Inhalt, auswählen, um es dann abarbeiten zu lassen. Damit man als Anwender die Übersicht behält, wollte ich Tabs nehmen. Dann muss man sich nur noch den Tab merken, den man als letztes bearbeitet hat. Es können dabei nur sehr wenige Tabs oder sehr viele Tabs entstehen, je nach länge der Liste eben. Damit das ganze auch Übersichtlich bleibt, ist eine Listview ungeeignet, weil das dann das GUI-Fenster sprengen würde.

    Ich dachte, ich bräuchte noch in jedem Tab einen Button, über den ich den aktuellen Tab abarbeiten lassen kann. Wenn es eine Möglichkeit gibt, den ausgewählten Tab festzustellen, brauch ich ja nur noch einen Button unter den Tabs im GUI, aber das weiß ich nicht, ob oder wie das geht.

    So, ich hoffe, dass das jetzt etwas Licht ins Dunkle gebracht hat ;)

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 21. Dezember 2021 um 14:34
    Zitat von BugFix

    Es reicht hier sogar ein 1D-Array!

    Nein, leider nicht, bzw. würde es die ganze Sache komplizierter machen, da ich in dem Array erst ein Handle stehen habe und dann einen String (PatientenID). Ich könnte zwar mit For-Schleifen das alles abzählen und aufbauen lassen, aber ich muss später wissen, welches "Packet" zum Beariten ausgewählt wurde. Dann müsste ich ja wieder mit einer For-Schleife abzählen.


    Zitat von BugFix

    Wenn du z.B. 500 Einträge hast, erstellst du einfach das Array nachdem alle anderen GUI-Elemente erstellt sind, wie folgt:

    Die restlichen GUI-Einträge werden ja anhand der Größe des Arrays erstellt. Das Array kann <100, aber auch >1000 Einträge haben, das kann ich nicht hardcoden.

    Jede Liste/jedes Tab bzw. jedes Pack soll noch einen Button bekommen, den ich dann auslesen kann.

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 21. Dezember 2021 um 14:16

    Sooo, ich hab jetzt mal mein Programm überarbeitet und ein allein lauffähiges Script erstellt, allerdings so, wie ich es gerne hätte, mit Tabs:

    C
    #include <AutoItConstants.au3>
    #include <ButtonConstants.au3>
    #include <ColorConstants.au3>
    #include <EditConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIButton.au3>
    #include <GuiEdit.au3>
    #include <GuiMenu.au3>
    #include <GuiTreeView.au3>
    #include <GUIListBox.au3>
    #include <GUIListView.au3>
    #include <GUITab.au3>
    #include <GuiRichEdit.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <String.au3>
    #include <WinAPIFiles.au3>
    #include "HEEE-include.au3"
    
    AutoItSetOption( "WinTitleMatchMode", 3 ) ;Titel müssen immer exakt übereinstimmen
    
    ;Variabeln
    Global $sStudyName = "Studie 3"
    Global $hHEEE
    Global $iPackageSize = 10
    Global $ahExports[3][10][2]
    For $i = 0 to UBound($ahExports, 1) -1
       For $j = 0 to UBound($ahExports, 2) -1
          $ahExports[$i][$j][0] = Random(0, 1000000, 1)
          $ahExports[$i][$j][1] = Chr(Random(65, 90, 1))
       Next
    Next
    ; Programmfenster erstellen
    ; FrameGUI mit Menüzeile:
    Local $hGUI = GUICreate( "Beispiel", 600, 417, Default, Default, Default, BitOR($WS_EX_COMPOSITED,$GUI_WS_EX_PARENTDRAG) )
    $FileMenu = GUICtrlCreateMenu( "File" )
       $FileExit = GUICtrlCreateMenuItem( "Exit"&@TAB&"Ctrl+X", $FileMenu )
    $ExportMenu = GUICtrlCreateMenu( "Export" )
       $ExportRawExport = GUICtrlCreateMenuItem( "Raw Export"&@TAB&"Ctrl+R", $ExportMenu )
    GUISetState( @SW_SHOW )
    
    ; Hauptfenster
    Local $hMainGUI = GUICreate( "", 600, 400, 0, 0, BitOR($WS_CHILD, $WS_VISIBLE), Default, $hGUI)
    Local $Label = GUICtrlCreateLabel( "", 10, 10, 200, 23 )
    GUICtrlSetFont( -1, 12, 400, 0, "Calibri" )
    Local $idStudieList = GUICtrlCreateList( "", 10, 43, 250, 344 )
    Local $idExportAllBtn = GUICtrlCreateButton("Export all", 515, 2, 75, 25)
    Local $idRAWExportBtn = GUICtrlCreateButton( "Raw-Export", 270, 215, 75, 25 )
    Local $idExitBtn = GUICtrlCreateButton( "Exit", 270, 365, 75, 25 )
    Local $idMsgBox = _GUICtrlRichEdit_Create( $hMainGUI, "Messages and Errors", 355, 30, 235, 360, BitOR( $ES_READONLY, $ES_MULTILINE ) )
    GUISetState( @SW_SHOW )
    
    ; RAW-Export
    Local $hRAWExportGUI = GUICreate( "", 600, 400, 0, 0, BitOR( $WS_CHILD, $WS_VISIBLE ), Default, $hGUI)
    GUICtrlCreateLabel( "RAW-Export", 10, 10, 200, 23)
    GUICtrlSetFont( -1, 12, 400, 0, "Calibri" )
    Local $idAmount = GUICtrlCreateLabel( "", 10, 40, 200, 40 )
    Local $hRAWExportTab = GUICtrlCreateTab( 10, 80, 580, 280 )
    GUICtrlCreateTabItem( "" )
    Local $idCancelRAWExportBtn = GUICtrlCreateButton( "Cancel", 270, 365, 75, 25 )
    
    Global $aStudyList[] = [5, "Studie 1", "Studie 2", "Studie 3", "Studie 4", "Studie 5" ]
    GUICtrlSetData( $Label, "There are " & $aStudyList[0] & " Studies installed:" )
    
    while 1
       $sMsg = GUIGetMsg()
       Switch $sMsg
          Case $GUI_EVENT_CLOSE, $idExitBtn, $FileExit
             ExitLoop
          Case $ExportRawExport, $idRAWExportBtn
             If UBound( $ahExports ) == 0 Then
                UpdateEditField( $idMsgBox, "Please create export first", True )
             Else
                ConsoleWrite( $sMsg )
                Local $aTabs[ UBound( $ahExports, 1 ) ][ 10 ]
                $x = 20
                $y = 110
    ;~             For $i = 1 To UBound( $ahExports, 1 )
    ;~                For $j = 1 To UBound( $ahExports, 2 )
    ;~                   GUICtrlCreateEdit( $ahExports[ $i -1 ][ $j -1 ][ 1 ], $x, $y + $j * 20, 80, 20, $ES_READONLY )
    ;~                Next
    ;~                $aTabs[ $i -1 ] = GUICtrlCreateButton( "Export", $x, $y + UBound( $ahExports, 2 ) * 20 + 20 )
    ;~                $x = $x + $y + 10
    ;~             Next
                GUISwitch( $hRAWExportGUI )
                GUICtrlSetData( $idAmount, "There are " & UBound( $ahExports, 1 ) & " Packages." & @LF & "Please choose one or select ""export all""" )
                For $i = 0 To UBound( $ahExports, 1 ) -1
                   GUISwitch( $hRAWExportGUI );, $aTabs[ $i ][ 0 ] )
                   $aTabs[ $i ][ 0 ] = GUICtrlCreateTabItem( "Pack No. " & $i +1 )
                   For $j = 1 To UBound( $ahExports, 2 ) -1
                      $aTabs[ $i ][ $j ] = GUICtrlCreateEdit( $ahExports[ $i ][ $j ][ 1 ], $x, $y + $j * 20, 80, 20, $ES_READONLY )
                   Next
                   $aTabs[ $i ][ 1 ] = GUICtrlCreateButton( "Export", $x +20, $y + UBound( $ahExports, 2 ) * 20 + 20 )
                   GUICtrlCreateTabItem("")
                   GUISwitch( $hRAWExportGUI )
                Next
                GUISetState( @SW_HIDE, $hMainGUI )
                GUISetState( @SW_SHOW, $hRAWExportGUI )
                ConsoleWrite( $sMsg )
                For $i = 0 To UBound( $aTabs ) -1
                   If $sMsg = $aTabs[ $i ][ 0 ] Then
                      ConsoleWrite( @LF )
                      For $j = 0 To UBound( $ahExports, 2 ) -1
                         ConsoleWrite( $j+1 & ' ' & $ahExports[ $aTabs[ $i ] ][ $j ][ 1 ] & @LF )
                      Next
                      ConsoleWrite( @LF )
                   EndIf
                Next
                ;For $i = 0 To UBound( $ahExports, $UBOUND_ROWS ) -1
                ;   Export( "Raw", $hWndLeft, $hWndRight, $hHeyex, $ahExports[ $i ] )
                ;Next
             EndIf
          Case $idExportAllBtn
             ConsoleWrite( @LF )
             For $i = 0 To UBound( $ahExports, 1 ) -1
                For $j = 0 To UBound( $ahExports, 2 ) -1
                   ConsoleWrite( $j+1 & ' ' & $ahExports[ $i ][ $j ][ 1 ] & @LF )
                Next
                ConsoleWrite( @LF )
             Next
          Case $idCancelRAWExportBtn
             GUISetState( @SW_HIDE, $hRAWExportGUI )
             GUISetState( @SW_SHOW, $hMainGUI )
       EndSwitch
    WEnd
    GUIDelete($hMainGUI)
    Alles anzeigen

    Sorry für die vielen Includes, aber die hab ich jetzt nicht auch noch gefiltert ;)

    Das Problem ist, dass mir beim ersten Aufruf des Menüpunkts "RAW-Export" zwar die Tabs angezeigt werden, aber die Edit-Felder nicht. Wenn ich allerdings das GUI 3 mal aufrufe, dann fängt es an zu flackern und man sieht, dass er die Felder aufbaut. Offenbar werden sie aufgebaut, aber durch das Neuerstellen des nächsten Tabs, wird das wieder gelöscht.

    Wenn ich das GUI so umbaue, dass die auskommentierten Zeilen aktiv sind und die Tab-Erstellung auskommentiert, dann funktioniert der Aufbau.

    Achja und wie kann ich die erstellten Buttons abfragen? Das funktioniert leider auch nicht, da ich nicht weiß, wie ich das machen soll.

    VG

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 20. Dezember 2021 um 20:08

    Hallo Moombas

    $aTabs hab ich noch nicht ausprobiert, aber $ahExports ist gefüllt, wie es soll, es kommt auch aus der Funktion richtig an.

    $aTabs muss ich morgen mal ausprobieren.

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 20. Dezember 2021 um 13:00

    So, ich hab nochmal ein wenig umgebaut. Mittlerweile hab ich (aus Testzwecken) das GUI erst erstellt:

    Code
    Local $hRAWExportGUI = GUICreate( "", 600, 400, 0, 0, $WS_CHILD, Default, $hGUI)
    GUICtrlCreateLabel( "RAW-Export", 10, 10, 200, 23)
    GUICtrlSetFont( -1, 12, 400, 0, "Calibri" )
    Local $idAmount = GUICtrlCreateLabel( "", 10, 40, 200, 40 )
    Local $idExportAllBtn = GUICtrlCreateButton("Export all", 515, 10, 75, 25)
    Local $idCancelRAWExportBtn = GUICtrlCreateButton( "Cancel", 270, 365, 75, 25 )

    und in der While-Schleife wird das GUI noch ergänzt:

    Code
           Case $ExportRawExport
             If $sStudyName = "" Then
                UpdateEditField( $idMsgBox, "Please load a study first", True )
             ElseIf UBound( $ahExports ) == 0 Then
                   UpdateEditField( $idMsgBox, "Please create export first", True )
                Else
                   Local $aTabs[ UBound( $ahExports, 1 ) ]
                   For $i = 0 To UBound( $ahExports, 1 ) -1
                      For $j = 0 To UBound( $ahExports, 2 ) -1
                         GUICtrlCreateEdit( $ahExports[ $i ][ $j ][ 1 ], 20, 80 + $j * 20 )
                      Next
                      $aTabs[ $i ] = GUICtrlCreateButton( "Export", 40, 80 + UBound( $ahExports, 2 ) * 20 )
                   Next
                   GUISetState( @SW_HIDE, $hMainGUI )
                   GUISetState( @SW_SHOW, $hRAWExportGUI )
             EndIf
    Alles anzeigen

    Blöderweise bleibt das GUI unverändert. Da wird kein weiteres Element hinzugefügt.

    Weiß jemand, was ich da falsch mache?

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 20. Dezember 2021 um 09:57

    OK, da ich schon ein paar Aufrufe hatte, aber mir bis jetzt wohl niemand dabei helfen konnte bzw. ich mich vlt. auch umständlich ausgedrückt habe, hier eine alternative Frage:

    Ich habe eine Liste mit "ID" und "Name", die sehr lang sein kann. Darum habe ich sie in Pakete aufgeteilt. Die Paketgröße soll variabel sein, als Beispiel nehm ich mal eine Größe von 10. Also habe ich eine variable Anzahl an Paketen von jeweils 10 Einträgen mit "ID und "Name", also einen 3D-Array. Dessen Inhalt möchte ich jetzt in meinem GUI darstellen mit einem Button, mit dem ich die Liste abarbeiten kann, bzw. z. B. an ConsoleWrite schicken könnte. (ich will es nicht an ConsoleWrite schicken, aber der Einfachheit halber sagen wir mal das ^^)

    Hat jemand eine idee, wie ich das am besten darstellen kann, damit es schön übersichtlich ist und man sich leicht merken kann, welches Paket bereits abgearbeitet ist?

    VG

  • Tab-Menü über Schleife erstellen lassen

    • JBO
    • 20. Dezember 2021 um 09:03

    Hallo zusammen!

    Ich hänge mal wieder an einem Problem fest, und zwar möchte ich ein Tab-Menü über eine Schleife erstellen und füllen lassen. Das Tab-Menü wird auch ganz normal erstellt und angezeigt, allerdings deren Inhalte nicht. In den Tabs sollen nur Edit-Felder mit einem Inhalt erscheinen. Die Tabs dienen quasi nur zur Information. Im Klartext sieht das Ganze so aus:

    Code
    ; RAW-Export
    Local $hRAWExportGUI = GUICreate( "", 600, 400, 0, 0, $WS_CHILD, Default, $hGUI)
    GUICtrlCreateLabel( "RAW-Export", 10, 10, 200, 23)
    GUICtrlSetFont( -1, 12, 400, 0, "Calibri" )
    Local $idAmount = GUICtrlCreateLabel( "", 10, 40, 200, 40 )
    Local $idExportAllBtn = GUICtrlCreateButton("Export all", 515, 10, 75, 25)
    Local $hRAWExportTab = GUICtrlCreateTab( 10, 80, 580, 280 )
    GUICtrlCreateTabItem( "" )
    Local $idCancelRAWExportBtn = GUICtrlCreateButton( "Cancel", 270, 365, 75, 25 )

    zuerst wird das GUI dazu erstellt. Im Laufe des Programms wird ein Array gefüllt, der dann die Inhalte für das weitere Erstellen der Tabs nötig ist:

    Code
          Case $ExportRawExport
             If $sStudyName = "" Then
                UpdateEditField( $idMsgBox, "Please load a study first", True )
             ElseIf UBound( $ahExports ) == 0 Then
                   UpdateEditField( $idMsgBox, "Please create export first", True )
                Else
                   Local $aTabs[ UBound( $ahExports, 1 )][ UBound( $ahExports, 2 ) ]
                   GUICtrlSetData( $idAmount, "There are " & UBound( $ahExports, 1 ) & " Packages." & @LF & "Please choose one or select ""All""" )
                   For $i = 0 To UBound( $ahExports, 1 ) -1
                      GUISwitch( $hRAWExportGUI, $aTabs[ $i ][ 0 ] )
                      $aTabs[ $i ][ 0 ] = GUICtrlCreateTabItem( "Pack No. " & $i+1 )
                      For $j = 0 To UBound( $ahExports, 2 ) -1
                         $aTabs[ $i ][ $j ] = GUICtrlCreateEdit( $ahExports[ $i ][ $j ][ 1 ], 20, 80 + $j * 20 )
                      Next
                      GUICtrlCreateTabItem("")
                      GUISwitch( $hRAWExportGUI )
                   Next
                   GUISetState( @SW_HIDE, $hMainGUI )
                   GUISetState( @SW_SHOW, $hRAWExportGUI )
             EndIf
    Alles anzeigen

    Wie gesagt, die Tabs bleiben leider leer. Wenn ich das GUI mehrfach aufrufe (Menüpunkt wieder auswähle), dann fängt er irgendwann an zu flackern, dabei sieht man, dass er sehr wohl was in die Tabs rein schreibt, aber es verschwindet sofort wieder.

    Kann mir jemand helfen und sagen, woran das liegt, bzw. was ich da falsch mache? Und wie kann ich verhindern, dass man beim erneuten anklicken des Menüpunkts die GUI nicht wieder neu aufruft?

    VG

  • Maps erstellen und verwalten

    • JBO
    • 20. Dezember 2021 um 08:52

    ok danke an alle!!

    Ich bin jetzt auf Array umgestiegen.

  • Deaktivierung Tastatur beim einlesen eines Strings via RFID-Leser

    • JBO
    • 16. Dezember 2021 um 09:28

    Hallo,

    kannst du vlt. vor dem Einlesen der Zahlen einen ConsoleRead machen, dessen Input du in die Zwischenablage umlenkst und nach dem Scannen den Inhalt der Zwischenablage wieder ausliest? Oder beißt sich das mit dem Scanvorgang?

  • Maps erstellen und verwalten

    • JBO
    • 16. Dezember 2021 um 09:11

    Hallo Zusammen!

    Um Variablen über eine For-Schleife füllen und prüfen zu können, aber dennoch recht verständliche Variablennamen zu haben, wollte ich mir eine Map mit Variablen erstellen. Dazu soll eine Ini-Datei ausgelesen werden und deren Inhalt in der Map gespeichert werden. Blöderweise komm ich gar nicht erst zu dem Punkt, in dem ich die Map füllen kann, da mir AutoIt schon bei der Zeile:

    Local $mVariables[]

    Die Fehlermeldung: "(45) : ==> Variable subscript badly formatted." ausgibt und er meckert die schließende ] an.

    Offenbar denkt er, dass es ein Array sein soll.

    Daher meine Frage: Wie definiere ich eine Map richtig bzw. muss ich vlt. dafür eine bestimmte Datei includen, damit er versteht, dass es sich um eine Map handelt?

    VG

  • GUI mit Unterfenster erstellen

    • JBO
    • 15. Dezember 2021 um 13:52
    Zitat von BugFix

    Hier mal ein Bsp.:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    Global $hGui = GUICreate('Main', 400, 300, -1, -1, Default, BitOR($WS_EX_COMPOSITED,$GUI_WS_EX_PARENTDRAG) )
    Global $mnu = GUICtrlCreateMenu('Menü')
    Global $mnuProp = GUICtrlCreateMenuItem('Properties', $mnu)
    
    ;~ Global $hProp = GUICreate('Properties', 200, 200, 10, 10, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_MDICHILD, $hGui)
    Global $hProp = GUICreate('Properties', 200, 200, 10, 10, BitOR($WS_POPUP,$WS_THICKFRAME), $WS_EX_MDICHILD , $hGui)
    GUICtrlCreateLabel('TEST', 10, 10)
    Global $btEscape = GUICtrlCreateButton('Abbrechen', 10, 170, 80, 20)
    Global $btAccept = GUICtrlCreateButton('Übernahme', 110, 170, 80, 20)
    
    GUISetState(@SW_SHOW, $hGui)
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $mnuProp
                GUISetState(@SW_SHOW, $hProp)
            Case $btAccept
                MsgBox(0, 'Properties', 'Änderungen übernommen')
                GUISetState(@SW_HIDE, $hProp)
            Case $btEscape
                GUISetState(@SW_HIDE, $hProp)
        EndSwitch
    WEnd
    Alles anzeigen

    Ah! Vielen Dank! Ich hab das jetzt für ein "About-Fenster" mal übernommen, weil ich wohl die Properties so anzeigen lassen möchte, wie in meinem Beispiel. Letzten Endes sieht es dann so aus:

    C
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiRichEdit.au3>
    #include <ColorConstants.au3>
    
    Global $g_hGUI, $g_hGUI1, $g_idButton1, $g_idButton2, $g_hGUI2, $g_idMsgButton, $FileMenu, $OpenGUI1, $OpenGUI2
    
    example()
    
    Func example()
       $g_hGUI = GUICreate("GUI", 200, 217, 100, 100, Default, BitOR($WS_EX_COMPOSITED,$GUI_WS_EX_PARENTDRAG))
       $Menu1 = GUICtrlCreateMenu( "GUI" )
          $OpenGUI1 = GUICtrlCreateMenuItem( "Open GUI1", $Menu1 )
          GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
          $OpenGUI2 = GUICtrlCreateMenuItem( "Open GUI2", $Menu1 )
       $Menu2 = GUICtrlCreateMenu( "Help" )
          $About = GUICtrlCreateMenuItem( "About", $Menu2 )
       GUISetState(@SW_SHOW)
    
       ;GUI1
       $g_hGUI1 = GUICreate("GUI 1", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       $g_idMsgButton = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
       $g_idButton1 = GUICtrlCreateButton("Show GUI 2", 10, 60, 80, 30)
       GUISetState(@SW_SHOW)
    
       ;GUI2
       $g_hGUI2 = GUICreate("GUI 2", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       $g_idButton2 = GUICtrlCreateButton("Show GUI 1", 10, 10, 80, 30)
       GUISetState(@SW_HIDE)
    
       ;About
       $g_hAbout = GUICreate("About", 100, 100, 10, 10, BitOR($WS_POPUP,$WS_THICKFRAME), $WS_EX_MDICHILD , $g_hGui)
       $idAboutBox = _GUICtrlRichEdit_Create( $g_hAbout, "About", 0, 0, 100, 70, BitOR( $ES_READONLY, $ES_MULTILINE ) )
       _GUICtrlRichEdit_SetCharColor( $idAboutBox, _WinAPI_SwitchColor( $COLOR_RED ) )
       _GUICtrlRichEdit_AppendText( $idAboutBox, @CRLF & "Hallo Welt" )
       Global $btOK = GUICtrlCreateButton('OK', 10, 75, 80, 20)
    
       Local $aMsg
    
       While 1
            $aMsg = GUIGetMsg(1) ; Use advanced parameter to get array
            If Not IsHWnd($aMsg[1]) Then ContinueLoop ; preventing subsequent lines from processing when nothing happens
    
            Switch $aMsg[1] ; check which GUI sent the message
                Case $g_hGUI
                   Switch $aMsg[0]
                      Case $GUI_EVENT_CLOSE ; If we get the CLOSE message from this GUI: $g_hGUI1 ...
                            ExitLoop ;  ... exit the loop and thus exit the program
                      Case $OpenGUI1
                            GUISetState(@SW_HIDE, $g_hGUI2)
                            GUISetState(@SW_SHOW, $g_hGUI1)
                            GUICtrlSetState($OpenGUI2, $GUI_ENABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
                      Case $OpenGUI2
                            GUISetState(@SW_HIDE, $g_hGUI1)
                            GUISetState(@SW_SHOW, $g_hGUI2)
                            GUICtrlSetState($OpenGUI2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_ENABLE)
                      Case $About
                            GUISetState(@SW_SHOW, $g_hAbout)
                   EndSwitch
                Case $g_hGUI1
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI1
                         Case $g_idMsgButton
                            MsgBox($MB_OK, "MsgBox 1", "Test from GUI 1")
                         Case $g_idButton1
                            GUISetState(@SW_HIDE, $g_hGUI1)
                            GUISetState(@SW_SHOW, $g_hGUI2)
                            GUICtrlSetState($OpenGUI2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_ENABLE)
                    EndSwitch
                Case $g_hGUI2
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI2
                    Case $g_idButton2
                         GUISetState(@SW_HIDE, $g_hGUI2)
                         GUISetState(@SW_SHOW, $g_hGUI1)
                         GUICtrlSetState($OpenGUI2, $GUI_ENABLE)
                         GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
                   EndSwitch
                Case $g_hAbout
                      If $aMsg[0] = $btOK Then GUISetState(@SW_HIDE, $g_hAbout)
            EndSwitch
        WEnd
    EndFunc   ;==>example
    Alles anzeigen

    Jetzt muss ich das nur noch auf mein Projekt übertragen :)

  • GUI mit Unterfenster erstellen

    • JBO
    • 15. Dezember 2021 um 12:33
    C
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    
    Global $g_hGUI, $g_hGUI1, $g_idButton1, $g_idButton2, $g_hGUI2, $g_idMsgButton, $FileMenu, $OpenGUI1, $OpenGUI2
    
    example()
    
    Func example()
       $g_hGUI = GUICreate("GUI", 200, 217, 100, 100)
       $FileMenu = GUICtrlCreateMenu( "GUI" )
          $OpenGUI1 = GUICtrlCreateMenuItem( "Open GUI1", $FileMenu )
          GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
          $OpenGUI2 = GUICtrlCreateMenuItem( "Open GUI2", $FileMenu )
       GUISetState(@SW_SHOW)
    
       ;GUI1
       $g_hGUI1 = GUICreate("GUI 1", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       $g_idMsgButton = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
       $g_idButton1 = GUICtrlCreateButton("Show GUI 2", 10, 60, 80, 30)
       GUISetState(@SW_SHOW)
    
       ;GUI2
       $g_hGUI2 = GUICreate("GUI 2", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       $g_idButton2 = GUICtrlCreateButton("Show GUI 1", 10, 10, 80, 30)
       GUISetState(@SW_HIDE)
    
       Local $aMsg
    
       While 1
            $aMsg = GUIGetMsg(1) ; Use advanced parameter to get array
            If Not IsHWnd($aMsg[1]) Then ContinueLoop ; preventing subsequent lines from processing when nothing happens
    
            Switch $aMsg[1] ; check which GUI sent the message
                Case $g_hGUI
                   Switch $aMsg[0]
                      Case $GUI_EVENT_CLOSE ; If we get the CLOSE message from this GUI: $g_hGUI1 ...
                            ExitLoop ;  ... exit the loop and thus exit the program
                      Case $OpenGUI1
                            GUISetState(@SW_HIDE, $g_hGUI2)
                            GUISetState(@SW_SHOW, $g_hGUI1)
                            GUICtrlSetState($OpenGUI2, $GUI_ENABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
                      Case $OpenGUI2
                            GUISetState(@SW_HIDE, $g_hGUI1)
                            GUISetState(@SW_SHOW, $g_hGUI2)
                            GUICtrlSetState($OpenGUI2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_ENABLE)
                   EndSwitch
                Case $g_hGUI1
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI1
                         Case $g_idMsgButton
                            MsgBox($MB_OK, "MsgBox 1", "Test from GUI 1")
                         Case $g_idButton1
                            GUISetState(@SW_HIDE, $g_hGUI1)
                            GUISetState(@SW_SHOW, $g_hGUI2)
                            GUICtrlSetState($OpenGUI2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_ENABLE)
                    EndSwitch
                Case $g_hGUI2
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI2
                    Case $g_idButton2
                         GUISetState(@SW_HIDE, $g_hGUI2)
                         GUISetState(@SW_SHOW, $g_hGUI1)
                         GUICtrlSetState($OpenGUI2, $GUI_ENABLE)
                         GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
                    EndSwitch
            EndSwitch
        WEnd
    EndFunc   ;==>example
    Alles anzeigen

    So sieht's jetzt bei mir aus, und ich finde es sieht gut aus :)

    BugFix Das mit "Popup" hab ich nicht verstanden, da weiß ich nicht, wie AutoIt reagiert. Kannst Du mir da weiter helfen, oder vlt. mein Script darauf umbauen (wenn es kein großer Akt ist)?

  • GUI mit Unterfenster erstellen

    • JBO
    • 15. Dezember 2021 um 12:04
    Zitat von BugFix

    GUI während der Laufzeit ständig Erstellen und Löschen ist nicht sinnvoll. Einmalig Erstellen und mit @SW_SHOW/@SW_HIDE die Anzeige steuern.

    OK, aber wie unterscheidet AutoIt, zu welchem GUI eine Variable/ein Element gehört? Einfach nur anhand der Reihenfolge, oder muss ich den Buttons, etc. noch sagen, zu welchem GUI sie gehören?

  • GUI mit Unterfenster erstellen

    • JBO
    • 15. Dezember 2021 um 09:54
    Zitat von Moombas

    Das müsste doch mit folgendem gehen:

    Code
    GUICtrlSetState($g_idButton1, $GUI_HIDE)

    Habe damit aber selber noch nicht mit rumgespielt.

    Die Frage ist, je nach dem was du vor hast, ob es da nicht einfacher wäre mit einer 3. GUI zu arbeiten (vom Programmieraufwand).

    OK, danke, werde ich mal ausprobieren. Meine Idee war sonst, drei GUIs zu machen, eins was nur die Menüzeile enthält, eins was direkt beim Start angezeigt wird und ein, was das zweite verschwinden lässt und dann angezeigt wird. Wenn man wieder zurück geht, wird das dritte versteckt und das zweite wieder angezeigt.

  • GUI mit Unterfenster erstellen

    • JBO
    • 15. Dezember 2021 um 09:22

    AAALSO, ich bin jetzt schon mal so weit, dass das Menü so funktioniert, wie ich mir das vorstelle, nur wird mir beim Wechsel auf GUI2 das GUI1 immernoch angezeigt. Ich würde allerdings gerne haben, dass ich ein neues leeres Fenster/GUI mit meiner Menüzeile bekomme. Kann ich vlt. die Buttons etc. aus dem ersten GUI verstecken bzw. ausblenden lassen, damit ich da neue Buttons etc. drüber legen kann?

    Hier das Beispiel, wie weit ich bis jetzt bin (Button2 und Button 3 machen das selbe, wie das Menü):

    C
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    
    Global $g_hGUI1, $g_idButton1, $g_idButton2, $g_hGUI2, $g_idButton3, $FileMenu, $OpenGUI1, $OpenGUI2
    
    example()
    
    Func example()
        gui1()
        Local $aMsg
    
        While 1
            $aMsg = GUIGetMsg(1) ; Use advanced parameter to get array
            If Not IsHWnd($aMsg[1]) Then ContinueLoop ; preventing subsequent lines from processing when nothing happens
    
            Switch $aMsg[1] ; check which GUI sent the message
                Case $g_hGUI1
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI1
                         Case $GUI_EVENT_CLOSE ; If we get the CLOSE message from this GUI: $g_hGUI1 ...
                            ExitLoop ;  ... exit the loop and thus exit the program
                         Case $g_idButton1
                            MsgBox($MB_OK, "MsgBox 1", "Test from GUI 1")
                         Case $g_idButton2, $OpenGUI2
                            GUICtrlSetState($g_idButton2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI2, $GUI_DISABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_ENABLE)
                            gui2()
                         Case $OpenGUI1
                            GUIDelete($g_hGUI2)
                            GUICtrlSetState($OpenGUI2, $GUI_ENABLE)
                            GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
                    EndSwitch
                Case $g_hGUI2
                    Switch $aMsg[0] ; Now check for the messages for $g_hGUI2
                         Case $g_idButton3
                            GUIDelete($g_hGUI2) ; ... just delete the GUI ...
                            GUICtrlSetState($g_idButton2, $GUI_ENABLE) ; ... enable button (previously disabled)
                    EndSwitch
            EndSwitch
        WEnd
    
    EndFunc   ;==>example
    
    Func gui1()
        $g_hGUI1 = GUICreate("GUI 1", 200, 200, 100, 100)
        $FileMenu = GUICtrlCreateMenu( "GUI" )
          $OpenGUI1 = GUICtrlCreateMenuItem( "Open GUI1", $FileMenu )
          GUICtrlSetState($OpenGUI1, $GUI_DISABLE)
          $OpenGUI2 = GUICtrlCreateMenuItem( "Open GUI2", $FileMenu )
        $g_idButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
        $g_idButton2 = GUICtrlCreateButton("Show GUI 2", 10, 60, 80, 30)
        GUISetState()
    EndFunc   ;==>gui1
    
    Func gui2()
        $g_hGUI2 = GUICreate("GUI 2", 200, 200, 100, 100, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI1)
        $g_idButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
        GUISetState()
    EndFunc   ;==>gui2
    Alles anzeigen
  • GUI mit Unterfenster erstellen

    • JBO
    • 14. Dezember 2021 um 14:08

    Hallo Zusammen!

    Ich habe mir ein GUI für mein Programm gebaut, was wie auf dem Bild ausszieht.

    GUI.png

    Als Code sieht das ganze wie folg aus:

    Code
    Local $hMainGUI = GUICreate( $sTitle & '-Exporter', 600, 417 )
    $FileMenu = GUICtrlCreateMenu( "File" )
       $FileOpenExport = GUICtrlCreateMenuItem( "Open Export"&@TAB&"Ctrl+O", $FileMenu )
       $FileCreateExport = GUICtrlCreateMenuItem( "Create Export"&@TAB&"Ctrl+C", $FileMenu )
       $FileDeleteExport = GUICtrlCreateMenuItem( "Delete Export"&@TAB&"Ctrl+D", $FileMenu )
       $FileExit = GUICtrlCreateMenuItem( "Exit"&@TAB&"Ctrl+X", $FileMenu )
    $ExportMenu = GUICtrlCreateMenu( "Export" )
       $ExportRawExport = GUICtrlCreateMenuItem( "Raw Export"&@TAB&"Ctrl+R", $ExportMenu )
       $ExportXMLExport = GUICtrlCreateMenuItem( "XML Export"&@TAB&"Ctrl+M", $ExportMenu )
    $EditMenu = GUICtrlCreateMenu( "Edit" )
       $EditHEEEINI = GUICtrlCreateMenuItem( "HEE-E.INI", $EditMenu )
       $EditHRAViewerINI = GUICtrlCreateMenuItem( "hraviewer.ini", $EditMenu )
       If Not IsAdmin() Then GUICtrlSetState( $EditHRAViewerINI, $GUI_DISABLE )
    $PropertiesMenu = GUICtrlCreateMenu( "Properties" )
       $HEEEProperties = GUICtrlCreateMenuItem( "HEEE Properties", $PropertiesMenu )
    $HelpMenu = GUICtrlCreateMenu( "Help" )
       $About = GUICtrlCreateMenuItem( "Under Construcktion", $HelpMenu )
    Dim $Form1_AccelTable[10][2] = [["^f", $FileMenu],["^o", $FileOpenExport],["^c", $FileCreateExport],["^d", $FileDeleteExport],["^x", $FileExit],["^r", $ExportRawExport],["^m", $ExportXMLExport],["^e", $EditMenu],["^p", $PropertiesMenu],["^h", $HelpMenu]]
    GUISetAccelerators($Form1_AccelTable)
    
    ; Hauptfenster
    Local $Label = GUICtrlCreateLabel( "", 10, 10, 200, 23 )
    GUICtrlSetFont( -1, 12, 400, 0, "Calibri" )
    Local $idStudieList = GUICtrlCreateList( "", 10, 43, 250, 344 )
    Local $idCreateExport = GUICtrlCreateButton( "Create Export", 270, 295, 75, 25 )
    Local $idLoadStudy = GUICtrlCreateButton( "Load Study", 270, 330, 75, 25 )
    Local $idExitBtn = GUICtrlCreateButton( "Exit", 270, 365, 75, 25 )
    Local $idMsgBox = _GUICtrlRichEdit_Create( $hMainGUI, "Messages and Errors", 355, 30, 235, 360, BitOR( $ES_READONLY, $ES_MULTILINE ) )
    Alles anzeigen

    Jetzt möchte ich, wenn man auf "Properties" klickt, dass sich ein neues Fenster (GUI), aber ohne das Pulldown-Menü, über mein aktuelles Fenster (GUI) legt. Ich weiß, dass es mit Child und Parent irgendwie funktionieren muss, aber ich weiß nicht was ich genau machen muss. Bei mir kommt nur Unsinn raus. Entweder verschwindet das Hauptfenster komplett, oder das 2. GUI wird sofort bei Programmstart angezeigt und sobald ich die Maus über das GUI schiebe, verschwindet das 2. Child-GUI.

    Ich möchte einfach über die Menüzeile zwischen den GUI's hin und her schalten können. Am liebsten im Quellcode alles schon mal vorbereiten, aber über das Switch von der Menüzeile nur die Ansicht von Hidden auf Show umstellen, wenn das so einfach geht!?

    VG

  • SysTabControl32 auslesen und ansteuern

    • JBO
    • 6. Dezember 2021 um 09:15
    Zitat von MojoeB

    ich verstehe nicht ganz was du vor hast, möchtest du jede Galerie einmal anklicken ?

    die Galerien haben doch immer die selbe Größe oder?

    Nur eine Idee vielleicht in einem gewählten Bereich die Pixel checken lassen ob diese Weiß sind wie der Hintergrund, oder es eine Abweichung gibt, wenn Abweichung erkannt dann klick drauf/oder in in die Mitte des erkannten Pixels.

    Hallo,

    ich möchte auf jede Galerie einen Rechtsklick ausführen lassen. Allerdings könnten da auch so viele Galerien drin sein, dass ich einen Scrollbalken bekomme und die Galerien mehr, als nur diesen einen Bildschirm voll habe. Darum würde ich gerne ermitteln lassen, wieviele Galerien vorhanden sind, die ich dann über deren Index oder den Handle anspreche um dann einen Rechtsklick darauf ausführen lassen kann. Leider steht die Funktion, die ich brauche, nur über Rechtsklick zur Verfügung -.-

  • SysTabControl32 auslesen und ansteuern

    • JBO
    • 3. Dezember 2021 um 09:21

    Hallo zusammen!

    Ich hab folgendes Problem: Ich möchte das Fenster auf beigefügtem Bild (Links und Rechts) auslesen, was leider nicht funktioniert. Das AutoIt-Tool sagt mir, dass es sich um einen SysTab32 handelt. Damit ist allerdings wohl nur der äußerste Rahmen gemeint. In dem Tab befinden sich Bildergalerien, die man noch anklicken kann. Ich würde aber gerne jede Galerie bzw. jeden Eintrag in der Liste ansteuern können. Außerdem müsste ich natürlich wissen, wieviele Galerien in der Ansicht sind, da das immer wieder anders ist. Über die ID kann ich die Bereiche ansprechen, aber den Inhalt bekomm ich nicht vernünftig angesteuert.

    Kann ich irgendwie herauskriegen, was das für ein Unterfenster in dem Tab ist, damit ich weiß, wo ich nachgucken kann, um die richtigen Funktionen zu nutzen? Ich hab es mit ListView versucht, aber das funktioniert nicht zuverlässig, wenn ich dann die Items anspringen möchte. (ich muss einen Rechtsklick auf die Items ausführen und einen Punkt im Kontextmenü anklicken, da es über das Fenstermenü den Punkt, den ich brauche, nicht gibt -.-)

    VGExport.png

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™