Tab in Tab

  • Hallöchen ;)

    Ich weiß ja, dass in einer Registerkarte nicht noch ein Menü mit Registerkarten erstellt werden kann.
    Habe auch schon versucht Tabs mit etlichen Labels und Styles zu imitieren, doch das Ergebnis sah dementsprechend aus ;)

    Dennoch wollte ich wissen, ob irgendjemand eine Idee oder sogar eine Lösung hat, die Programmsprache auszutricksen und damit mein tagelanges verzwicktes Problem damit zu lösen :)

    In Hoffnung auf eine positive Antwort,
    Elodie

    Einmal editiert, zuletzt von Elodie (6. Juni 2009 um 02:01)

  • Hallo Elodie,

    innerhalb einer GUI kann nur eine Kartenreiterauswahl existieren. Das heisst du müsstest innerhalb deiner Gui eine zweite erstellen, in dieser kannst du dann wieder eine Kartenreiterauswahl erstellen. Auf AutoItScript.com habe ich GuiFrame-UDF gefunden. Damit funktioniert es, allerdings habe ich noch Probleme die "Frames" nach meinen Wünschen anzuordnen und auch beim Resizing klappt es bei mir noch nicht,

    mfg (Auto)Bert

  • innerhalb einer GUI kann nur eine Kartenreiterauswahl existieren. Das heisst du müsstest innerhalb deiner Gui eine zweite erstellen, in dieser kannst du dann wieder eine Kartenreiterauswahl erstellen.


    Ja, genau, das habe ich versucht zu erklären und das ist auch das Problem ^^

    Auf AutoItScript.com habe ich GuiFrame-UDF gefunden. Damit funktioniert es, allerdings habe ich noch Probleme die "Frames" nach meinen Wünschen anzuordnen und auch beim Resizing klappt es bei mir noch nicht

    Danke sehr, genau sowas in der Art habe ich als Problemlösung gesucht ^^
    Auch wenn das Anpassen dann wohl zum neuen Problem wird...

    Falls irgendjemand noch eine Idee hat - bitte posten :)


    Edit: @progandy: Boah, super! Das habe ich seit Tagen gesucht!!! Vielen vielen Dank! :thumbup:
    Ich glaube, ich wende mich bei solchen Problemen lieber gleich an die Profis als tagelang herumzuprobieren ^^

  • Warum kann man eig nur einen karteireiter in einer gui machen?


    Dadurch wird warscheinlich die GUIControl-Verwaltung für die AutoIt-Entwickler einfacher ;) Beim Tabwechsel müssen ja andere GUI-Elemente versteckt oder angezeigt werden.

    Edit: @progandy: Boah, super! Das habe ich seit Tagen gesucht!!! Vielen vielen Dank! :thumbup:


    Du hättest nur eine Suchmaschine nach "tab in tab" autoit befragen müssen :P

  • Du hättest nur eine Suchmaschine nach "tab in tab" autoit befragen müssen


    Hatte ich ja, aber hab in Google nix gefunden ^^

    Uff, irgendwie bin ich derzeit Autoitmüde, denn ich kriege das nicht mal mehr in den Guictrlsetonevent mode umgeschrieben ;( Hätte jemand die Güte und würde sich bitte dazu erbarmen :love:

    Ne Frage zu dem Code hätte ich noch:
    Ich habe fünf tabs, muss ich jetzt für jeden ein eigenes guichild machen, damit das "tab in tab" nicht auf jedem angezeigt wird?

  • Hallo elodie,

    ich hab das TabInTab Beispiel mal auf den OnEvent-Mode umgeschrieben:

    Spoiler anzeigen
    [autoit]

    ^;Original im MsgLoop-Modus gefunden (dank Progandy) auf http://www.autoitscript.com/forum/index.ph…ndpost&p=328240
    ;umgeschrieben auf OnEvent-Modus (Auto)Bert
    ; *** Start added by AutoIt3Wrapper ***
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ; *** End added by AutoIt3Wrapper ***
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; Example of TAB in TAB ctrl
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $main_GUI, $child1, $child2, $main_tab, $ok_button,$cancel_button
    _main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _main()
    ; This window has 2 ok/cancel-buttons
    $main_GUI = GUICreate("TAB in TAB",260,250,-1,-1)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $ok_button = GUICtrlCreateButton("OK",40,220,70,20)
    GUICtrlSetOnEvent(-1, '_End')
    $cancel_button = GUICtrlCreateButton("Cancel",150,220,70,20)
    GUICtrlSetOnEvent(-1, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    ; Create the first child window that is implemented into the main GUI
    $child1 = GUICreate("",230,170,15,35,BitOr($WS_CHILD,$WS_TABSTOP),-1,$main_GUI)
    $child_tab = GUICtrlCreateTab(10,10,210,150)
    $child11tab = GUICtrlCreateTabItem("1")
    $child12tab = GUICtrlCreateTabItem("2")
    GUICtrlCreateTabItem("")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Create the second child window that is implemented into the main GUI
    $child2 = GUICreate("",230,170,15,35,BitOr($WS_CHILD,$WS_TABSTOP),-1,$main_GUI)
    $listview2 = GUICtrlCreateListView("Col1|Col2",10,10,210,150,-1,$WS_EX_CLIENTEDGE)
    GUICtrlCreateListViewItem("ItemLong1|ItemLong12", $listview2)
    GUICtrlCreateListViewItem("ItemLong2|Item22", $listview2)

    [/autoit] [autoit][/autoit] [autoit]

    ; Switch back the main GUI and create the tabs
    GUISwitch($main_GUI)
    $main_tab = GUICtrlCreateTab(10,10,240,200)
    GUICtrlSetOnEvent(-1, '_MainTab')
    $child1tab = GUICtrlCreateTabItem("Child1")
    $child2tab = GUICtrlCreateTabItem("Child2")
    $child3tab = GUICtrlCreateTabItem("Child3")
    $listview3 = GUICtrlCreateListView("Noch|eine|LV",15,35,210,150,-1,$WS_EX_CLIENTEDGE)
    GUICtrlCreateListViewItem("Spalte1.1|Spalte1.2|Spalte1.3", $listview3)
    GUICtrlCreateListViewItem("Spalte2.1|Spalte2.2|Spalte2.3", $listview3)

    GUICtrlCreateTabItem("")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    While 1
    Sleep(125)
    WEnd
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    GUIDelete($child1)
    GUIDelete($child2)
    GUIDelete($main_GUI)
    Exit
    EndFunc ;==>_End

    [/autoit] [autoit][/autoit] [autoit]

    Func _MainTab()
    Switch GUICtrlRead($main_tab)
    Case 0
    GUISetState(@SW_HIDE,$child2)
    GUISetState(@SW_SHOW,$child1)

    Case 1
    GUISetState(@SW_HIDE,$child1)
    GUISetState(@SW_SHOW,$child2)
    case Else
    GUISetState(@SW_HIDE,$child1)
    GUISetState(@SW_HIDE,$child2)
    EndSwitch
    EndFunc

    [/autoit]


    ich hab das Beispiel noch um einen Tab in der MainGui erweitert und füge auch dort eine Listview ein, diese verhält sich ganz normal, dazu musst du die Func _MainTab evtl. an deine Bedürfnisse anpassen,

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (3. Juni 2009 um 17:44)

  • Hallo Elodie,

    wow, großartig, danke! :thumbup:
    Das "child2" braucht man also gar nicht *delete* das hatte mich unter anderem so verwirrt ^^

    Wenn du nur auf (in) einem Reiter eine 2. Kartenreiterauswahl erstellen willst ist $Child2 unnötig, das ich mit den GuiDelete's in der Func _end verwirrt habe tut mir leid, soweit ich weiss räumt AutoIt mit Exit sowieso auf, kannst dir also diese Zeilen sparen. An der Optik musst du noch etwas arbeiten, ich hab nur auf die schnelle in den OnEvent-Mode umgeschrieben,

    mfg (Auto)Bert

  • achso, danke sehr :) Mh, als ich nämlich mal ein Gui fenster deletet habe, wurde das Fenster bei mir komplett schwarz 8|

    Mh, und wie kriege ich es noch hin, dass nur im zweiten Tab die untertabs erstellt werden? Derzeit werden sie ja auf dem ersten Tab angezeit :S
    Tut mir leid, wenn ich mich dumm anstelle ^^

  • Hallo elodie,

    dazu musst du einfach in der Func _MainTab das gewünschte ein- und das andere ausblenden:

    [autoit]

    Func _MainTab()
    Switch GUICtrlRead($main_tab)
    Case 0
    GUISetState(@SW_HIDE,$child1)
    GUISetState(@SW_SHOW,$child2)

    Case 1
    GUISetState(@SW_HIDE,$child2)
    GUISetState(@SW_SHOW,$child1)
    case Else
    GUISetState(@SW_HIDE,$child1)
    GUISetState(@SW_HIDE,$child2)
    EndSwitch
    EndFunc

    [/autoit]


    und damit auch beim Start und nicht nur beim Wechsel das richtige gezeigt wird, musst du das GuiSetState nach dem Erstellen von $Child1 mit all seinen Steuerelementen löschen und nach dem Erzeugen von $Child2 eines einfügen:

    [autoit]

    ; Create the first child window that is implemented into the main GUI
    $child1 = GUICreate("", 230, 170, 15, 35, BitOR($WS_CHILD, $WS_TABSTOP), -1, $main_GUI)
    $child_tab = GUICtrlCreateTab(10, 10, 210, 150)
    $child11tab = GUICtrlCreateTabItem("1")
    $child12tab = GUICtrlCreateTabItem("2")
    GUICtrlCreateTabItem("")

    [/autoit][autoit][/autoit][autoit]

    ; Create the second child window that is implemented into the main GUI
    $child2 = GUICreate("", 230, 170, 15, 35, BitOR($WS_CHILD, $WS_TABSTOP), -1, $main_GUI)
    $listview2 = GUICtrlCreateListView("Col1|Col2", 10, 10, 210, 150, -1, $WS_EX_CLIENTEDGE)
    GUICtrlCreateListViewItem("ItemLong1|ItemLong12", $listview2)
    GUICtrlCreateListViewItem("ItemLong2|Item22", $listview2)
    GUISetState()

    [/autoit]


    das war alles, ich hoffe du hast das Schema verstanden,

    mfg (Auto)Bert

  • Hallo elodie,

    Zitat

    Oh man, klar, gerade fallen mir die Schuppen von den Augen
    Ja, jetzt ist alles klar, herzlichen Dank für den Code und auch für die Geduld


    Da ich etwas ähnliches suchte und ich auch lieber im OnEventModus programmiere hätte ich dieses Beispiel sowieso darauf umgestellt,

    mfg (Auto)Bert

  • Hallo elodie,
    ich galube dass liegt daran, dass es dafür mehr Beispiele gibt. Ich habe noch etwas an TabInTab ausprobiert zwecks Resizing. Hat für das Beispiel zwar mit 2 Childs für 3 Reiter auf der MainGui geklappt, bin mir aber sicher mit 3 Childs wäre es einfacher zu überblicken.

    Spoiler anzeigen
    [autoit]

    ;Original im MsgLoop-Modus gefunden (dank Progandy) auf http://www.autoitscript.com/forum/index.ph…ndpost&p=328240
    ;umgeschrieben auf OnEvent-Modus (Auto)Bert
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; Example of TAB in TAB ctrl
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $main_GUI, $child1, $child2, $main_tab, $ok_button, $cancel_button
    _main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _main()
    ; This window has 2 ok/cancel-buttons
    $main_GUI = GUICreate("TAB in TAB", 260, 250, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $ok_button = GUICtrlCreateButton("OK", 40, 200, 70, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUICtrlSetOnEvent(-1, '_End')
    $cancel_button = GUICtrlCreateButton("Cancel", 150, 200, 70, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUICtrlSetOnEvent(-1, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    ; Create the first child window that is implemented into the main GUI
    $child1 = GUICreate("", 230, 170, 15, 35, BitOR($WS_CHILD, $WS_TABSTOP), -1, $main_GUI)
    $child_tab = GUICtrlCreateTab(2, 5, 225, 165)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    $child11tab = GUICtrlCreateTabItem("1")
    $child12tab = GUICtrlCreateTabItem("2")
    GUICtrlCreateTabItem("")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Create the second child window that is implemented into the main GUI
    $child2 = GUICreate("", 230, 170, 15, 35, BitOR($WS_CHILD, $WS_TABSTOP), -1, $main_GUI)
    $listview2 = GUICtrlCreateListView("Col1|Col2", 2, 5, 225, 165, -1, $WS_EX_CLIENTEDGE)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUICtrlCreateListViewItem("ItemLong1|ItemLong12", $listview2)
    GUICtrlCreateListViewItem("ItemLong2|Item22", $listview2)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Switch back the main GUI and create the tabs
    GUISwitch($main_GUI)
    $main_tab = GUICtrlCreateTab(10, 10, 240, 180)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUICtrlSetOnEvent(-1, '_MainTab')
    $child1tab = GUICtrlCreateTabItem("Child1")
    $child2tab = GUICtrlCreateTabItem("Child2")
    $child3tab = GUICtrlCreateTabItem("Child3")
    $listview3 = GUICtrlCreateListView("Noch|eine|LV", 17, 39, 223, 138, -1, $WS_EX_CLIENTEDGE)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    GUICtrlCreateListViewItem("Spalte1.1|Spalte1.2|Spalte1.3", $listview3)
    GUICtrlCreateListViewItem("Spalte2.1|Spalte2.2|Spalte2.3", $listview3)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateTabItem("")

    GUIRegisterMsg($WM_SIZE, 'WM_SIZE')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    While 1
    Sleep(125)
    WEnd
    EndFunc ;==>_main

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    GUIDelete($child1)
    GUIDelete($child2)
    GUIDelete($main_GUI)
    Exit
    EndFunc ;==>_End

    [/autoit] [autoit][/autoit] [autoit]

    Func _MainTab()
    Switch GUICtrlRead($main_tab)
    Case 0
    GUISetState(@SW_HIDE, $child1)
    GUISetState(@SW_SHOW, $child2)

    [/autoit] [autoit][/autoit] [autoit]

    Case 1
    GUISetState(@SW_HIDE, $child2)
    GUISetState(@SW_SHOW, $child1)
    Case Else
    GUISetState(@SW_HIDE, $child1)
    GUISetState(@SW_HIDE, $child2)
    EndSwitch
    EndFunc ;==>_MainTab

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_SIZE($hWnd, $iMsg, $iWParam, $iLParam)
    $aMGPos = WinGetClientSize ($main_GUI)
    Winmove($child1,"",15,35,+$aMGPos[0]-30,+$aMGPos[1]-80)
    Winmove($child2,"",15,35,+$aMGPos[0]-30,+$aMGPos[1]-80)
    EndFunc

    [/autoit]

    Edit: Und hier auch noch das 2. Beispiel mit 2. Tabs nebeneinander:

    Spoiler anzeigen
    [autoit]

    ;Original im MsgLoop-Modus gefunden (dank Progandy) auf http://www.autoitscript.com/forum/index.ph…ndpost&p=328240
    ;umgeschrieben auf OnEvent-Modus und Rseizing eingebaut (Auto)Bert
    ; *** Start added by AutoIt3Wrapper ***
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ; *** End added by AutoIt3Wrapper ***
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; Example of multiple tabs in the same GUI
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $main_GUI, $child1, $child2, $main_tab, $child_tab, $ok_button, $cancel_button
    _main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _main()
    ; The main GUI window has the 2 ok/cancel-buttons and two child GUIs
    $main_GUI = GUICreate("Multiple TABs",520,250,-1,-1, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX));BitOr($GUI_SS_DEFAULT_GUI,$WS_CLIPSIBLINGS))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $ok_button = GUICtrlCreateButton("OK",40,200,70,20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUICtrlSetOnEvent(-1, '_End')
    $cancel_button = GUICtrlCreateButton("Cancel",150,200,70,20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUICtrlSetOnEvent(-1, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Creates the first child GUI window as a child of main GUI
    $child1 = GUICreate("",230,170,15,15,BitOr($WS_CHILD,$WS_TABSTOP),-1,$main_GUI)
    $child_tab = GUICtrlCreateTab(10,10,210,150)
    GUICtrlSetOnEvent(-1, '_AnyTab')
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    $child11tab = GUICtrlCreateTabItem("Child1_1")
    $child12tab = GUICtrlCreateTabItem("Child1_2")
    GUICtrlCreateTabItem("")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Creates the second gui window as a child of main GUI
    $child2 = GUICreate("",230,170,250,15,BitOr($WS_CHILD,$WS_TABSTOP),-1,$main_GUI)

    [/autoit] [autoit][/autoit] [autoit]

    ; Create second TAB control and its the tabs
    $main_tab = GUICtrlCreateTab(10,10,220,150)
    GUICtrlSetOnEvent(-1, '_AnyTab')
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    $child1tab = GUICtrlCreateTabItem("Main_1")
    $child2tab = GUICtrlCreateTabItem("Main_2")
    GUICtrlCreateTabItem("")
    GUICtrlSetState($child1tab,$GUI_SHOW)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUISwitch($main_GUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_SIZE, 'WM_SIZE')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    While 1
    Sleep(125)
    WEnd
    EndFunc ;==>_main

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    GUIDelete($child1)
    GUIDelete($child2)
    GUIDelete($main_GUI)
    Exit
    EndFunc ;==>_End

    [/autoit] [autoit][/autoit] [autoit]

    Func _AnyTab()
    Switch @GUI_CtrlId
    Case $main_tab
    MsgBox(0,"Event from $main_tab","",10,$main_GUI)
    Case $child_tab
    MsgBox(0,"Event from $child_tab","",10,$main_GUI)
    EndSwitch
    EndFunc ;==>_MainTab

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_SIZE($hWnd, $iMsg, $iWParam, $iLParam)
    $aMGPos = WinGetClientSize ($main_GUI)
    Winmove($child1,"",15,35,+$aMGPos[0]/2-30,+$aMGPos[1]-80)
    Winmove($child2,"",$aMGPos[0]/2+15,35,+$aMGPos[0]/2-30,+$aMGPos[1]-80)
    EndFunc

    [/autoit]


    so jetzt habe ich genug mit Childs gespielt, hinzugekommen ist die Möglichkeit es in größenveränderlichen Fenstern einzusetzen,

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (4. Juni 2009 um 01:58)

  • Danke :)

    Also, bei mir hat's schon ohne diesen Code getan :D bei mir wird nämlich das Fenster auch um einiges größer und da hatte ich mit meinem Tab in Tab System keine Probleme ^^ sitzt alles perfekt.

  • Ja, richtig... ^^ normalerweise setze ich ja hinter jedes Guictrlcreate wenigstens ein GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP) aber da habe ich's weggelassen und alles sitzt tipptopp, wie es soll. ;)