Bitnugger: Hmm, also dieses GUIRegisterMsg ist laut Hilfe ja ziemlich mit Vorsicht zu genießen.
Es interferiert mit MsgBox und andere Späße.
Ich poste mal meinen eigenen Code, der bei mir (Win XP) bestens funktioniert.
Ignoriere bitte, dass ich hier nicht alle Eigenschaften des Edits sichereund neu setze. Es ist nur ein Minimalbeispiel.
Macht dieser Code Probleme, unter höheren Windows-Versionen?
AutoIt
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
Global $hGUIParent1 = GUICreate("Parent1", 600, 400)
Global $idTabCtrl
Global $idTabItem1
Global $idTabItem2
Example()
GUIDelete($hGUIParent1)
Func Example()
Local $InhaltInputBox3
Local $idInput3
;--- Buttons kreieren -------------------------------------------------------------------\
$Button1 = GUICtrlCreateButton("Move Inputbox in Tab 2", 350, 10, 200, 50)
$Button2 = GUICtrlCreateButton("Move Inputbox in Tab 1", 350, 70, 200, 50)
$Button3 = GUICtrlCreateButton("Kreiere Input außerhalb der Tabs", 350, 130, 200, 50)
;--- Buttons kreieren -------------------------------------------------------------------/
;--- TabControl kreieren, inklusive eines darin befindlichen Inputfeldes ----------------\
$idTabCtrl = GUICtrlCreateTab(10, 40, 300, 300)
$idTabItem1 = GUICtrlCreateTabItem("tab1")
Local $idInput2 = GUICtrlCreateInput("Ich möchte moven!", 50, 150, 200, 30)
$idTabItem2 = GUICtrlCreateTabItem("tab2")
GUICtrlCreateTabItem("") ;Die Tab-Definition abschließen
;--- TabControl kreieren, inklusive eines darin befindlichen Inputfeldes ----------------/
GUISetState(@SW_SHOW)
;--- Programmschleife -------------------------------------------------------------------\
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE ;# Fenster wurde geschlossen, nun raus hier!
ExitLoop
Case $Button2 ;# Editfeld in Tab Nr. 1 verschieben.
$idInput2 = _MoveToTab2($idInput2, 1)
Case $Button1 ;# Editfeld in Tab Nr. 2 verschieben.
$idInput2 = _MoveToTab2($idInput2, 2)
Case $Button3 ;# Neues Editfeld kreieren, außerhalb des Tabcontrols.
GUICtrlCreateTabItem("") ;# TabControl "deselektieren", um fortan außerhalb dessen neue GUI-Elemente kreieren zu können.
_GUICtrlTab_DeselectAll($hGUIParent1, False)
GUISwitch($hGUIParent1) ;# Das Ziel der kommenden Aktion definieren.
$idInput3 = GUICtrlCreateInput("Ich soll nicht in Tab!", 350, 250, 200, 30)
;ConsoleWrite($idInput3 & @crlf)
EndSwitch
WEnd
;--- Programmschleife -------------------------------------------------------------------/
EndFunc ;==>Example
;############################################################
Func _MoveToTab2($id, $iTabNr)
Local $idNeueID
Local $InhaltInputBox = GUICtrlRead($id) ;# Inhalt des gleich temporär zu löschenden Inputfeldes auslesen.
; Local $aPosInput = ControlGetPos($hGUIParent1, 'Parent1', $id)
Local $aPosInput = ControlGetPos($hGUIParent1, "[ACTIVE]", $id) ;# Postion des Inputfeldes auslesen.
Local $StatusInputBox = GUICtrlGetState($id) ;# Status des Inputfeldes auslesden.
Local $idTmp
GUICtrlDelete($id) ;# Löscht temporär das Editefeld, das eigentlich verschoben werden soll.
If $iTabNr = 1 Then
$idTmp = GUISwitch($hGUIParent1, $idTabItem1) ;# Tab Nr. 2 "answitchen"
ElseIf $iTabNr = 2 then
$idTmp = GUISwitch($hGUIParent1, $idTabItem2) ;# Tab Nr 1 "answitchen"
EndIf
$idNeueID = GUICtrlCreateInput($InhaltInputBox, 1, 1) ;# Kreiert das zuvor temporär gelöschte Editfeld neu, unter identischer ID.
GUICtrlSetPos($idNeueID, $aPosInput[0], $aPosInput[1]) ;# Recycelt die Position des Inputfeldes.
GUICtrlSetState($idNeueID, $StatusInputBox) ;# Recycelt den Status des Inputfeldes.
_GUICtrlTab_SetCurSel($idTabCtrl, $iTabNr - 1) ;# Selektiert den Ziel-Tab
;_GUICtrlTab_ActivateTab($idTabCtrl, $iTabNr - 1) ;# Ebenfalls funktionierende Alternative zu _GUICtrlTab_SetCurSel()
Return($idNeueID)
EndFunc ;==> MoveToTab2
Alles anzeigen