GUICtrlCreateTab hinterher elemente in tabitem einfügen

  • Hallo liebe AutoIT-Gemeinde,

    ich stehe vor folgenden Problem:
    Hab eine GUI mit mehreren TabItems in denen man ohne Probleme hin- und her-switchen kann wobei jedes TabItem logischerweise etwas andere dar stellt.
    In einem TabItem möchte ich nun erst nach drücken eines Buttons bestimmte Elemente ERSTELLEN.
    Wenn ich diese nun in der While-Schleife über ein Case generiere, so erscheinen Bilder erst mal gar nicht, Labels schon.
    Minimiert man das Fenster nun und macht es wieder groß oder verschiebt man die GUI so, dass die fehlenden Bilder außerhalb des Monitors sind und sie dann wieder in den sichtbaren Bereich verschiebt so werden die Bilder angezeigt.
    Leider ist es auch so wenn ich andere TabItems aufrufe, so sind nun diese späteren erstellten Elemente in ALLEN TabItems zu sehen...
    Klar weil AutoIt ja nicht weiß, dass die Elemente ins erste TabItem gehören..

    Wie kann ich mir da helfen?

    LG Inferior

    EDIT:

    Hier ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEX.au3>

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

    $Main = GUICreate("test", 500, 300)
    GUICtrlCreateTab(0, 0, 500, 250)
    GUICtrlCreateTabItem("Tab 1")
    $button1 = GUICtrlCreateButton("button1", 50, 50, 150, 25)
    GUICtrlCreateTabItem("Tab 2")
    GUICtrlCreateTabItem("Tab 3")
    GUICtrlCreateTabItem("")

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

    GUISetState()

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

    While 1
    $Main = GUIGetMsg()
    Switch $Main
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button1
    GUICtrlCreateLabel("label1", 100, 100, 30, 16)
    EndSwitch
    WEnd

    [/autoit]

    wie kann ich also label1 so erstellen das es nur im tab 1 angezeigt wird?

    3 Mal editiert, zuletzt von Inferior (14. August 2011 um 18:24)

  • Die Frage ist doch, warum du die Elemente erst später erstellst. Wäre es nicht vielleicht auch möglich alle zu beginn zu erstellen und mit sichtbarkeit/unsichtbarkeit zu arbeiten?

    [autoit]


    guictrlsetstate()

    [/autoit]
  • hmm das hab ich mir schon gedacht das diese antwort kommt.. es geht nun mal nich anders, da es eine hand voll elemente sind die durch eine vorschleife erstellt werden. wie viele elemente es sind ist immer unterschiedlich und werden durch UBound und das entsprechende Array bestimmt.
    das mit dem
    guictrlsetstate()

    wuerden in dem einfachen Beispiel gehen aber nicht in meinem komplexem script
    bei den labels koennte ich dann auch guictrlsetdata() verwenden wenn ich es zurvor ohne schrift erstellt habe...

    jemand ne loesung wo hinterher elemente einfuegen kann die nur in einem tabitem zu sehn sind?

  • Hallo autoBert,

    Quelle: aus Bemerkungen zu GuiSwitch in der dt. Hilfe Schau dir dort auch das Beispiel an.

    mfg autoBert

    das hab ich in meinem Beispiel doch getan ;)
    zudem löst es ja mein problem nicht.
    hab mir aber jetzt schon selbst geholfen.

    hab alle labels und icons auf einen haufen erstellt und mit guictrlsetstate() auf unsichtbar gemacht
    wenn ich nun via combo etwas auswähle werden nur die icons und labels sichtbar gemacht die ich brauch.
    mit hilfe von guictrlsetdata() werden die labels richtig beschriftet und mit
    guictrlsetpos() werden sie an die richtige position gebracht
    bevor ich nun mit der combo etwas anderes auswähle werden erst wieder alle labels und icons unsichbar gemacht und dann wiederum alles sichtbar was ich für das ausgewählte element in der combo benötige
    ist zwar umständlich aber es funktioniert..

    ich dachte nur es gibt da etwas einfacheres(?)

    LG Inferior

    • Offizieller Beitrag

    Das scheint ein Fehler(?) im MessageLoop-Modus zu sein. Im OnEventMode funktioniert es:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    $Main = GUICreate("test", 500, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUICtrlCreateTab(0, 0, 500, 250)
    $tab1 = GUICtrlCreateTabItem("Tab 1")
    $button1 = GUICtrlCreateButton("button1", 50, 50, 150, 25)
    GUICtrlSetOnEvent(-1, '_Create')
    $tab2 = GUICtrlCreateTabItem("Tab 2")
    $tab3 = GUICtrlCreateTabItem("Tab 3")
    GUICtrlCreateTabItem("")

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

    GUISetState()
    While Sleep(1000)
    WEnd

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

    Func _End()
    Exit
    EndFunc

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

    Func _Create()
    GUISwitch($Main, $tab1)
    GUICtrlCreateLabel("label1", 100, 100, 30, 16)
    GUICtrlCreateTabItem("")
    EndFunc

    [/autoit]
  • Dies fnktioniert auch im MsgLoop-Modus. Aber natürlich nur wenn man auch GuiSwitch und das abschliessende GUICtrlCreateTabItem("") in seinem Skript benutzt.

    das hab ich in meinem Beispiel doch getan ;)
    zudem löst es ja mein problem nicht.

    was der TE zwar bejaht es aber trotzdem nicht getan hat. Dass es funktioniert siehe:

    Spoiler anzeigen

    [autoit]#include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    $Main = GUICreate("test", 500, 300)
    GUICtrlCreateTab(0, 0, 500, 250)
    $tab1 = GUICtrlCreateTabItem("Tab 1")
    $button1 = GUICtrlCreateButton("button1", 50, 50, 150, 25)
    $tab2 = GUICtrlCreateTabItem("Tab 2")
    $tab3 = GUICtrlCreateTabItem("Tab 3")
    GUICtrlCreateTabItem("")

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button1
    GUISwitch($Main, $tab1)
    GUICtrlCreateLabel("label1", 100, 100, 30, 16)
    GUICtrlCreateTabItem("")
    EndSwitch
    WEnd]/autoit]

    mfg autoBert

  • Ahja nun kapier ich auch warum es sowohl bei Oscar als auch bei mir im msgloop modus nicht funktionierte. Im Beispielscript aus Posting1 ist ein gravierender Fehler:

    [autoit]


    #include <GUIConstantsEX.au3>

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

    $Main = GUICreate("test", 500, 300)
    ;....

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

    While 1
    $Main = GUIGetMsg() ; GUI Controlid überschrieben... hier muss natürlich eine andere Variable verwendet werden, oder wie autobert die variable ganz weglassen und stattdessen rechts von switch die funktion aufrufen
    Switch $Main
    ;...
    EndSwitch
    WEnd

    [/autoit]

    Hatte gestern ewig rumgespielt weil ich nicht glauben konnte, dass das im msgloop Modus nicht gehen soll.

  • Ahja nun kapier ich auch warum es sowohl bei Oscar als auch bei mir im msgloop modus nicht funktionierte. Im Beispielscript aus Posting1 ist ein gravierender Fehler:

    Diesen Bug zusätzlich zu den fehlenden Zeiten habe ich auch nicht gesehen.

    mfg autoBert

  • Hallo,

    vielen dank für eure Unterstützung. ich verstehe nur noch noch nicht was es für einen unterschied macht wenn ich

    [autoit]

    $Main = GUIGetMsg()

    [/autoit]


    schreibe.. hatte damit noch nie probleme..

    lg Inferior

  • Es macht immer dann Probleme wenn deine GUI oder irgendein anderes Control unter diesem Variablennamen gespeichert wird und du später auf das Control zugreifen willst.
    Sobald du das erstemal das Ergebnis von guigetmsg darin speicherst hast du keinen Zugriff mehr auf das Control das zuvor darin gespeichert war.

    Im hiesigen Beispiel also dann wenn du guiswitch() benutzt. Hier brauchst du zwingend die Controlid der GUI, hast du die überschrieben kann guiswitch nicht funktionieren.

    Ums anders auszudrücken:
    Variablennamen darf man nicht für verschiedene Dinge verwenden, zumindestens dann nicht wenn du die gespeicherten Daten noch benötigst.