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
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
hm naja, also gibts sowas eher nciht, weil mit DLLs brauchst du mir nicht kommen, da versteht ich nichts.^^
nun gut, dann halt mit GUIDelete().
danke für die Hilfe.
mfg
hauke96
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
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
Func _LoescheAlles()
For $i = $Dummy1 To $Dummy2 Step 1
GUICtrlDelete($i)
Next
EndFunc
lg
Mars(i)
Ich hab dir mal ein Beispiel zur letzten und besten Möglichkeite gemacht:
#include <winapi.au3>
[/autoit] [autoit][/autoit] [autoit]$gui=GUICreate("")
GUICtrlCreateButton("",0,0,100,25)
GUICtrlCreateButton("",0,25,100,25)
GUISetState()
Sleep(1000)
_DeleteAllControls($gui)
While GUIGetMsg()<>-3
Sleep(10)
WEnd
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
Func __ProcDelete($hwnd,$lparam)
_WinAPI_PostMessage($hwnd,0x82,0,0) ;WM_NCDESTROY
Return True
EndFunc
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.
Für meine kenntnisse ist das noch zu hoch, ich begnüge mich erst mal mit GUIDelete()^^