Hi Forum!
Hier wollte ich mal mein kleines Script, einen funktionsbeschränkten Guicreator vorstellen.
Er wäre problemlos zu erweitern, allerdings ging es mir nur ums Prinzip.
Ich weiß, dass es (fast) vollwertige Formdesigner wie Koda bereits gibt,
ich fand nur die Idee ganz witzig, auch mal einen zu erstellen...
Das Design und die Funktionsart habe ich von einem
auf Youtube vorgestellten Formdesigner(hier zu sehen) übernommen, das Script allerdings vollständig alleine erstellt...
Kommentiert habe ich eher wenig, aber ich denke, das Script sollte verständlich sein..
Ich würde einfach gerne eure Meinungen/Verbesserungen/Kritik dazu hören
Spoiler anzeigen
#include <Misc.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <File.au3>
#Include <GuiEdit.au3>
Opt("GUIOnEventMode", 1)
;Deklarationsteil---------------
Global $pathcha = @SCRIPTDIR&"\changeslog.au3"
Global $toolwidth = 200
Global $toolheight = 200
global $inspwidth = 500
Global $inspheight = 50
Global $toolname = "Werkzeuge"
Global $winname
Global $Winpos[4]
Global $newGUI
Global $text
Global $numbercontrol = 0
Global $control[99]
Global $conname[99]
Global $contype[99]
Global $conpos[99][4]
;-------------------------------
;GUIteil------------------------
;ToolGUI------------------------
Global $toolsgui = GUICreate($toolname, $toolwidth, $toolheight, @DesktopWidth/2)
Global $newwinbut = guictrlcreatebutton("Neues Fenster", 0, 0, $toolwidth/2, $toolheight/5)
Global $delwinbut = guictrlcreatebutton("Fenster löschen", $toolwidth/2, 0, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $newinputbut = guictrlcreatebutton("Neuer Input", 0, $toolheight/5, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $newlabelbut = guictrlcreatebutton("Neuer Label", $toolwidth/2, $toolheight/5, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $newbutbut = guictrlcreatebutton("Neuer Button", 0, $toolheight/5*2, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $newradiobut = guictrlcreatebutton("Neuer Radiobutton", $toolwidth/2, $toolheight/5*2, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $undobut = guictrlcreatebutton("Rückgängig", 0, $toolheight/5*3, $toolwidth/2, $toolheight/5)
Global $savebut = guictrlcreatebutton("Als *.au3 speichern", $toolwidth/2, $toolheight/5*3, $toolwidth/2, $toolheight/5)
guictrlsetstate(-1, $GUI_DISABLE)
Global $infobut = GUICtrlCreateButton("Informationen", 0, $toolheight/5*4, $toolwidth/2, $toolheight/5)
Global $helpbut = GUICtrlCreateButton("Hilfe", $toolwidth/2, $toolheight/5*4, $toolwidth/2, $toolheight/5)
guisetstate()
guisetonevent($GUI_EVENT_CLOSE, "_exit")
GUICtrlSetOnEvent($newwinbut, "_testwin")
GUICtrlSetOnEvent($delwinbut, "_delwin")
GUICtrlSetOnEvent($savebut, "_saveau3")
GUICtrlSetOnEvent($newinputbut, "_newinput")
GUICtrlSetOnEvent($newbutbut, "_newbut")
GUICtrlSetOnEvent($newlabelbut, "_newlabel")
GUICtrlSetOnEvent($newradiobut, "_newradio")
GUICtrlSetOnEvent($undobut, "_undo")
GUICtrlSetOnEvent($infobut, "_getinfo")
GUICtrlSetOnEvent($helpbut, "_gethelp")
;-------------------------------
global $inspektorgui = guicreate("Inspektor", $inspwidth, $inspheight, @DESKTOPWIDTH/2-$inspwidth)
Global $changeslist = guictrlcreatelistview("Name|Typ|X-Koord.|Y-Koord.|Breite|Höhe", 0,0, $inspwidth, $inspheight)
Global $item = guictrlcreatelistviewitem(" | | | | | ", -1)
;Global $changebut = GUICtrlCreateButton("Ändern", $inspwidth-100, 0, 100, $inspheight)
guisetstate()
guisetonevent($GUI_EVENT_CLOSE, "_exit")
while 1
if _ispressed(02) then
$cmsg = GUIGetCursorInfo()
if not @error and IsArray($cmsg) Then
if winactive($winname) Then
if $cmsg[4] = 0 Then
GUICtrlSetData($item, $Winname&"|"&"GUI"&"|"&$Winpos[0]&"|"&$winpos[1]&"|"&$Winpos[2]&"|"&$Winpos[3])
EndIf
For $y = 2 to $numbercontrol
if $cmsg[0] > $conpos[$y][0] and $cmsg[0] < $conpos[$y][0]+$conpos[$y][2] and $cmsg[1] > $conpos[$y][1] and $cmsg[1] < $conpos[$y][1]+$conpos[$y][3] Then
GUICtrlSetData($item, $conname[$y]&"|"&$contype[$y]&"|"&$conpos[$y][0]&"|"&$conpos[$y][1]&"|"&$conpos[$y][2]&"|"&$conpos[$y][3])
EndIf
Next
EndIf
EndIf
Do
Until not _ispressed(02)
sleep(40)
EndIf
WEnd
Func _newinput()
_newcontrol(0)
EndFunc
Func _newbut()
_newcontrol(1)
EndFunc
Func _newlabel()
_newcontrol(2)
EndFunc
Func _newradio()
_newcontrol(3)
EndFunc
Func _checkfocus()
EndFunc
Func _gethelp()
MsgBox(0, "Hilfe", "Zum Erstellen eines neuen Fensters einfach auf 'Neues Fenster' drücken."&@CRLF&"Dort den gewünschten Namen eingeben und das Fenster durch Bewegen mit der Maus positionieren. Anschliessend einfach klicken."&@CRLF&@TAB&"ACHTUNG: Nachfolgendes Verschieben hat keinen Effekt mehr auf die festgelegte Position!"&@CRLF&"Die Größe des Fensters durch Bewegen mit der Maus definieren. Anschliessend einfach klicken."&@CRLF&"Erst dann können die vier zur Auswahl stehenden Controls auf die gleiche Weise erstellt werden."&@CRLF&"Mit Rechtsklick auf das jeweilige Control lassen sich die Werte im Inspektor ansehen."&@CRLF&" "&@CRLF&"Wenn das GUI fertig erstellt ist, einfach auf 'Als *.au3 speichern' klicken, und den gewünschten Speicherort/namen eingeben.")
EndFunc
Func _getinfo()
if $winname <> "" Then
$infotext = ""
$infotext = $infotext&"Aktueller GUI-Titel: "&$Winname&@CRLF
$infotext = $infotext&"Anzahl Controls: "&$numbercontrol-1&@CRLF
$infotext = $infotext&@TAB&"Einzelinformationen: "&@CRLF
for $z = 2 to $numbercontrol
$infotext = $infotext&@TAB&@TAB&$z-1&"."&@CRLF
$infotext = $infotext&@TAB&@TAB&"Name: "&$conname[$z]&@CRLF
Switch $contype[$z]
case 0
$infotext = $infotext&@TAB&@TAB&"Typ: "&"Input"&@CRLF
Case 1
$infotext = $infotext&@TAB&@TAB&"Typ: "&"Button"&@CRLF
Case 2
$infotext = $infotext&@TAB&@TAB&"Typ: "&"Label"&@CRLF
Case 3
$infotext = $infotext&@TAB&@TAB&"Typ: "&"Radiobutton"&@CRLF
EndSwitch
$infotext = $infotext&@TAB&@TAB&"Abmessungen: X-Pos.: "&$conpos[$z][0]&" Y-Pos.: "&$conpos[$z][1]&" Länge: "&$conpos[$z][2]&" Höhe: "&$conpos[$z][3]&@CRLF
$infotext = $infotext&@TAB&@TAB&" "&@CRLF
Next
MsgBox(0, "Informationen", $infotext)
Else
MsgBox(0, "Informationen", "Noch kein Fenster erstellt.")
EndIf
EndFunc
Func _testwin()
if $winname <> "" Then
$del = MsgBox(4, "Altes GUI", "Altes GUI überschreiben?")
if $del = 6 then
guidelete($newGUI)
$numbercontrol = 0
_newwin()
EndIf
Else
_newwin()
EndIf
EndFunc
Func _newwin()
$Winname = inputbox("Neues Fenster", "1. Geben sie den Fenster-Namen ein."&@CRLF&"2. Positionieren sie das Fenster."&@CRLF&"3. Verändern sie die Größe des Fensters.")
if $Winname <> "" Then
$newGUI = GUICreate($winname, 150, 150)
guisetstate()
while not _ispressed(01)
$mousepos = mousegetpos()
$winpos = wingetpos($Winname)
winmove($winname, "", $mousepos[0]-150, $mousepos[1]-170)
ToolTip($winpos[0]&"/"&$winpos[1], $mousepos[0], $mousepos[1])
sleep(40)
WEnd
$winpos = wingetpos($Winname)
while _ispressed(01)
WEnd
_MouseTrap($winpos[0]+50, $winpos[1]+10, @Desktopwidth, @Desktopheight)
while not _ispressed(01)
$mousepos = mousegetpos()
$winpos = wingetpos($Winname)
winmove($winname, "",$winpos[0], $winpos[1] , $mousepos[0]-($winpos[0]-20), $mousepos[1]-($winpos[1]-20))
ToolTip($winpos[2]&"/"&$winpos[3]-20, $mousepos[0], $mousepos[1])
sleep(40)
WEnd
_mousetrap()
ToolTip("")
$numbercontrol = 1
$winpos = wingetpos($Winname)
guictrlsetstate($delwinbut, $GUI_ENABLE)
guictrlsetstate($savebut, $GUI_ENABLE)
guictrlsetstate($newinputbut, $GUI_ENABLE)
guictrlsetstate($newlabelbut, $GUI_ENABLE)
guictrlsetstate($newbutbut, $GUI_ENABLE)
guictrlsetstate($newradiobut, $GUI_ENABLE)
Else
_removevar()
EndIf
EndFunc
Func _newcontrol($type)
$numbercontrol += 1
$conname[$numbercontrol] = inputbox("Neues Control", "1. Geben sie den Control-Namen ein."&@CRLF&"2. Positionieren sie das Control."&@CRLF&"3. Verändern sie die Größe des Controls.")
if $conname[$numbercontrol] <> "" Then
$contype[$numbercontrol] = $type
while _ispressed(01)
WEnd
$actpos = wingetpos($Winname)
mousemove($actpos[0]+$winpos[2]/2, $actpos[1]+$actpos[3]/2, 0)
switch $type
Case 0
$control[$numbercontrol] = guictrlcreateinput($conname[$numbercontrol], 0, 0, 100, 30)
Case 1
$control[$numbercontrol] = guictrlcreatebutton($conname[$numbercontrol], 0, 0, 100, 30)
Case 2
$control[$numbercontrol] = guictrlcreatelabel($conname[$numbercontrol], 0, 0, 100, 30)
Case 3
$control[$numbercontrol] = GUICtrlCreateRadio($conname[$numbercontrol], 0, 0, 100, 30)
EndSwitch
_mousetrap($actpos[0]+1, $actpos[1]+30, $actpos[0]+$actpos[2], $actpos[1]+$actpos[3])
While not _ispressed(01)
$mousepos = mousegetpos()
guictrlsetpos($control[$numbercontrol], $mousepos[0]-$actpos[0]-101, $mousepos[1]-$actpos[1]-51)
sleep(40)
WEnd
$tempconpos = controlgetpos($Winname, "", $control[$numbercontrol])
$conpos[$numbercontrol][0] = $tempconpos[0]
$conpos[$numbercontrol][1] = $tempconpos[1]
while _ispressed(01)
WEnd
_mousetrap($conpos[$numbercontrol][0]+$actpos[0]+5, $conpos[$numbercontrol][1]+$actpos[1]+30, $actpos[0]+$actpos[2], $actpos[1]+$actpos[3])
$actpos = wingetpos($Winname)
While not _ispressed(01)
$mousepos = mousegetpos()
guictrlsetpos($control[$numbercontrol], $conpos[$numbercontrol][0], $conpos[$numbercontrol][1], $mousepos[0]-($actpos[0]+$conpos[$numbercontrol][0]), $mousepos[1]-($actpos[1]+$conpos[$numbercontrol][1]+20))
sleep(40)
WEnd
_mousetrap()
$tempconpos = controlgetpos($Winname, "", $control[$numbercontrol])
$conpos[$numbercontrol][2] = $tempconpos[2]
$conpos[$numbercontrol][3] = $tempconpos[3]
Else
$numbercontrol -= 1
EndIf
EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _undo()
if $numbercontrol > 1 Then
guictrldelete($control[$numbercontrol])
$conpos[$numbercontrol][0] = ""
$conpos[$numbercontrol][1] = ""
$conpos[$numbercontrol][2] = ""
$conpos[$numbercontrol][3] = ""
$conname[$numbercontrol] = ""
$contype[$numbercontrol] = ""
$numbercontrol -= 1
Else
MsgBox(0, "Error", "Nichts zu widerrufen!")
EndIf
EndFunc
Func _saveau3()
guisetstate(@SW_HIDE, $toolsGUI)
guisetstate(@SW_HIDE, $newGUI)
$fehler = 0
$path = FileSaveDialog("Speichere *.au3...", @SCRIPTDIR&"\", "Autoit(*.au3)")
if $path <> "" Then
if stringright($path, 4) = ".au3" Then
$newfile = fileopen($path, 10)
if @error then $fehler = 1
Else
$path = $path&".au3"
$newfile = fileopen($path, 10)
if @error then $fehler = 1
EndIf
if not $fehler = 1 Then
Global $genGUI = GUICreate("Erstelle Datei...", 300, 300, -1, $WS_EX_TOPMOST)
$progress = guictrlcreateprogress(0, 20, 300, 50)
GUICtrlCreateLabel("Aktuell: ", 0, 5, 40, 15)
$aktuelllabel = guictrlcreatelabel("", 40, 5, 260, 15)
$edit = guictrlcreateedit("Starte speichern...", 0, 75, 300, 195)
guisetstate()
$text = ""
guictrlsetdata($aktuelllabel, "Erstelle Kopf...")
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Erstelle Kopf...")
$text = $text&"#include <GUIConstantsEx.au3>"&@CRLF
$text = $text&"#include <WindowsConstants.au3>"&@CRLF
guictrlsetdata($progress, 1)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Abgeschlossen!")
guictrlsetdata($aktuelllabel, "Erstelle GUI...")
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Erstelle GUI...")
$text = $text&"$Form = GUICreate('"&$winname&"',"&$winpos[2]&","&$winpos[3]-20&","&$winpos[0]&","&$winpos[1]&")"&@CRLF
guictrlsetdata($progress, 50)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Abgeschlossen!")
guictrlsetdata($aktuelllabel, "Lade GUIControls...")
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Lade GUIControls...")
For $x = 2 to $numbercontrol
switch $contype[$x]
Case 0
$text = $text&"guictrlcreateinput('"&$conname[$x]&"', "&$conpos[$x][0]&", "&$conpos[$x][1]&", "&$conpos[$x][2]&", "&$conpos[$x][3]&")"&@CRLF
Case 1
$text = $text&"guictrlcreatebutton('"&$conname[$x]&"', "&$conpos[$x][0]&", "&$conpos[$x][1]&", "&$conpos[$x][2]&", "&$conpos[$x][3]&")"&@CRLF
Case 2
$text = $text&"guictrlcreatelabel('"&$conname[$x]&"', "&$conpos[$x][0]&", "&$conpos[$x][1]&", "&$conpos[$x][2]&", "&$conpos[$x][3]&")"&@CRLF
Case 3
$text = $text&"GUICtrlCreateRadio('"&$conname[$x]&"', "&$conpos[$x][0]&", "&$conpos[$x][1]&", "&$conpos[$x][2]&", "&$conpos[$x][3]&")"&@CRLF
EndSwitch
Next
$text = $text&"GUISetState(@SW_SHOW)"&@CRLF
$text = $text&" "&@CRLF
guictrlsetdata($progress, 90)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Abgeschlossen!")
guictrlsetdata($aktuelllabel, "Erstelle notwendigen Code...")
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Erstelle notwendigen Code...")
$text = $text&"While 1"&@CRLF
$text = $text&@TAB&"$Msg = guigetmsg()"&@CRLF
$text = $text&@TAB&"Switch $msg"&@CRLF
$text = $text&@TAB&@TAB&"Case $GUI_EVENT_CLOSE"&@CRLF
$text = $text&@TAB&@TAB&@TAB&"exit"&@CRLF
$text = $text&@TAB&"Endswitch"&@CRLF
$text = $text&"WEnd"&@CRLF
guictrlsetdata($progress, 100)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Abgeschlossen!")
guictrlsetdata($progress, 0)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Speichern...")
guictrlsetdata($aktuelllabel, "Speichere...")
FileWrite($newfile, $text)
if not @error Then
guictrlsetdata($progress, 100)
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Datei erfolgreich erstellt!")
guictrlsetdata($aktuelllabel, "Erfolgreich abgeschlossen!")
$readybut = guictrlcreatebutton("Fertig", 250, 270, 50, 30)
GUICtrlSetOnEvent($readybut, "_ready")
Else
MsgBox(0, "Error", "Ein Fehler beim Erstellen der Datei ist aufgetreten.")
guictrlsetdata($aktuelllabel, "Fehlerbedingter Abbruch!")
guictrlsetdata($edit, guictrlread($edit)&@CRLF&"Ein Fehler ist aufgetreten!")
$readybut = guictrlcreatebutton("Fertig", 250, 270, 50, 30)
GUICtrlSetOnEvent($readybut, "_ready")
EndIf
Else
MsgBox(0, "Error", "Ein Fehler beim Erstellen der Datei ist aufgetreten.")
EndIf
Else
guisetstate(@SW_SHOW, $toolsGUI)
guisetstate(@SW_SHOW, $newGUI)
EndIf
Endfunc
Func _ready()
guidelete($genGUI)
guisetstate(@SW_SHOW, $toolsGUI)
guisetstate(@SW_SHOW, $newGUI)
EndFunc
Func _delwin()
$del = MsgBox(4, "Altes GUI", "Altes GUI wirklich löschen?")
if $del = 6 then
guidelete($newGUI)
_removevar()
EndIf
EndFunc
Func _removevar()
$winname = ""
$numbercontrol = 0
guictrlsetdata($item, " | | | | | ")
guictrlsetstate($delwinbut, $GUI_DISABLE)
guictrlsetstate($savebut, $GUI_DISABLE)
guictrlsetstate($newinputbut, $GUI_DISABLE)
guictrlsetstate($newlabelbut, $GUI_DISABLE)
guictrlsetstate($newbutbut, $GUI_DISABLE)
guictrlsetstate($newradiobut, $GUI_DISABLE)
EndFunc
Func _exit()
if $winname <> "" Then
$close = MsgBox(4, "Wirklich beenden?", "Es existiert noch ein neu erstelltes Fenster. Wirklich beenden?")
if $close = 6 Then Exit
Else
Exit
EndIf
EndFunc
MfG, Fresapore
P.S. Das Gui, das beim Erstellen den *.au3 Datei zu sehen ist, war mehr so zum Spaß, weil es toller aussieht