Alle Controls auf einmal löschen

  • Hallo,

    ich habe eine frage, ich möchte bei einer GUI gerne alle darauf befindlichen Controls auf einmal löschen.
    Mit GUICtrlDelete() kann man ja nur ein Control löschen und bei so 20 Controls wirds dann schon lang. Geht das nicht anders?

    mfg
    hauke96

  • du kannst alle COntrols in ein Array packen und mit einer Schleife (For) arbeiten oder in Kauf nehmen, das die GUI kurz icht zu sehen ist, wenn du GUIDelete benutzt.

    Wenn du aber mit einem DLLCall usw. EnumChildWindows benutzt (du brauchst auch die Autoit DLLCallBack.. Funktionen), kannst du auch ohne Array undAusbelendung der GUI alle Controls zerstören

  • AutoIt bringt die Praktische Funktion GUICtrlCreateDummy() mit.

    Damit erstellst du ganz zu beginn einen Dummy (z.B. $Dummy1)
    Und ganz am Ende wenn du alles löschen willst noch einen (z.B. $Dummy2)

    Damit kann man schnell und Effektiv Alles mögliche an GuiControls löschen.
    Man braucht dazu nichtmal jedem Control eine Variable zuweisen, damit man sie löschen kann.

    Zum Test hier mal eben schnell gebastelt.

    Beim Drücken von Return wird alles zwischen den Dummys gelöscht (Dummys incl).

    [autoit]

    #include <Misc.au3>

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

    Global $hGUI = GUICreate('', 400,400)

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

    Global $Dummy1 = GUICtrlCreateDummy()

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

    For $i = 0 To 100 Step 1
    GUICtrlCreateButton(Random(100,999, 1), Random(0, 350, 1), Random(0, 350, 1), Random(20, 50, 1), Random(20,50,1))
    Next

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

    Global $Dummy2 = GUICtrlCreateDummy()

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

    GUISetState(@SW_SHOW)

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

    While GUIGetMsg() <> -3 And Sleep(20)
    If _IsPressed('0D') Then _LoescheAlles()
    WEnd

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

    Func _LoescheAlles()
    For $i = $Dummy1 To $Dummy2 Step 1
    GUICtrlDelete($i)
    Next
    EndFunc

    [/autoit]

    lg
    Mars(i)

  • Ich hab dir mal ein Beispiel zur letzten und besten Möglichkeite gemacht:

    Spoiler anzeigen
    [autoit]

    #include <winapi.au3>

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

    $gui=GUICreate("")
    GUICtrlCreateButton("",0,0,100,25)
    GUICtrlCreateButton("",0,25,100,25)
    GUISetState()

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

    Sleep(1000)
    _DeleteAllControls($gui)

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

    While GUIGetMsg()<>-3
    Sleep(10)
    WEnd

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

    Func _DeleteAllControls($gui)
    Local $cb=DllCallbackRegister("__ProcDelete","bool","hwnd;lparam")
    DllCall("user32.dll","bool","EnumChildWindows","hwnd",$gui,"ptr",DllCallbackGetPtr($cb),"lparam",0)
    DllCallbackFree($cb)
    _WinAPI_RedrawWindow($gui)
    EndFunc

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

    Func __ProcDelete($hwnd,$lparam)
    _WinAPI_PostMessage($hwnd,0x82,0,0) ;WM_NCDESTROY
    Return True
    EndFunc

    [/autoit]

    EDIT: Die Dummys erscheinen mir einfacher ^^

  • Hmm interessante Variante mit den dummys. Das kann man auch prima zum aus und einblenden von controls verwenden wenn man diese nicht in ein array speichern will um sie ggf durch einen besser identifizierbaren variablenamen ansprechen zu können. Gefällt mir, hätte ich auch schon das ein oder andere mal brauchen können.