Es mag vielleicht schon 10000 verschiedene Variationen geben, allerdings haben die meisten meinen Ansprüchen nicht genügt, deshalb präsentiere ich hier meine Variante(die selbst meinen Ansprüchen noch nicht genügt ). Man kann alle Texte des GUI und selbstverständlich auch die Belegung der Buttons wechseln. Das Prinzip beruht darauf, dass man Kategorien erstellen kann und diese mit einzelnen Aktionen belegen kann, sprich meinetwegen eine Kategorie Mathematik mit den Aktionen "Rechner starten, Excel aufrufen" oder sonst einer Aktion, die man vorher in der Form eines AutoIt-Codes eingeben kann.
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.1.1 (beta)
Author: myName
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=c:\program files (x86)\autoit3\scite\koda\forms\schule.kxf
Global $sIniPath = @ScriptDir & "\Settings.ini", $aiTaskbar, $iWidth, $iHeight, $iLeft, $iTop, $Form1, $Form2, $sForm1, $sForm2, $sGroup1, $sGroup2, $sGroup3, $sGroup4, $sGroup5, _
$sCombo1, $sCombo2, $sCombo3, $sButton1, $sButton2, $sButton3, $sButton4, $sButton5, $Input1, $Input2, $List1, $Button1, $Button2, $Button3, $Button4, $Button5, _
$Edit1, $Combo1, $Combo2, $Combo3, $ahButtons
INIT()
Func INIT()
Dim $aiTaskbar = WinGetPos("[CLASS:Shell_TrayWnd]")
Dim $aiWArea = _GetWorkingArea()
Dim $iWidth = 179, $iHeight = ((@DesktopHeight-@DesktopHeight) + $aiWArea[3]) - $aiTaskbar[3], $iLeft = @DesktopWidth - $iWidth, $iTop = 0, _
$sForm1 = IniRead($sIniPath, "Settings", "sForm1", ""), $sForm2 = IniRead($sIniPath, "Settings", "sForm2", "Einstellungen"), _
$sGroup1 = IniRead($sIniPath, "Settings", "sGroup1", "Modus auswählen"), $sGroup2 = IniRead($sIniPath, "Settings", "sGroup2", "Aktionen"), _
$sGroup3 = IniRead($sIniPath, "Settings", "sGroup3", "Modi"), $sGroup4 = IniRead($sIniPath, "Settings", "sGroup4", "Aktionen"), _
$sGroup5 = IniRead($sIniPath, "Settings", "sGroup5", "Beschriftung"), _
$sCombo1 = IniRead($sIniPath, "Settings", "sCombo1", "Neuen Modus erstellen!"), $sCombo2 = IniRead($sIniPath, "Settings", "sCombo2", ""), _
$sCombo3 = "sForm1|sForm2|Group1|Group2|Group3|Group4|Group5|Button1|Button2|Button3|Button4|Button5", _
$sButton1 = IniRead($sIniPath, "Settings", "sButton1", "Einstellungen"), $sButton2 = IniRead($sIniPath, "Settings", "sButton2", "hinzufügen"), _
$sButton3 = IniRead($sIniPath, "Settings", "sButton2", "entfernen"), $sButton4 = IniRead($sIniPath, "Settings", "sButton4", "OK"), _
$sButton5 = IniRead($sIniPath, "Settings", "sButton5", "OK")
Opt("GUIOnEventMode", 1)
$Form1 = GUICreate($sForm1, $iWidth, $iHeight, $iLeft, $iTop)
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")
;WinMove($sForm1, "", $iLeft, $iTop, $iWidth, $iHeight)
$Group1 = GUICtrlCreateGroup($sGroup1, 8, 8, 161, 49)
$asIniSections = IniReadSectionNames($sIniPath)
If IsArray($asIniSections) Then
$iIndex = _ArraySearch($asIniSections, "Settings")
If Not @error Then
_ArrayDelete($asIniSections, $iIndex)
If IsArray($asIniSections) Then
$sCombo1 = _ArrayToString($asIniSections, "|",1)
EndIf
EndIf
EndIf
If StringInStr($sCombo1, "|") Then
$Combo1 = GUICtrlCreateCombo(StringLeft($sCombo1, StringInStr($sCombo1, "|") - 1), 16, 24, 145, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetData($Combo1, StringTrimLeft($sCombo1, StringInStr($sCombo1, "|")))
Else
$Combo1 = GUICtrlCreateCombo($sCombo1, 16, 24, 145, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
EndIf
GUICtrlSetOnEvent($Combo1, "Combo1Change")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup($sGroup2, 8, 64, 161, $iHeight - 125)
Dim $ahButtons[1][3]
If IsArray($asIniSections) And UBound($asIniSections) > 1 Then
For $i = 1 To UBound($asIniSections) - 1
$aSection = IniReadSection($sIniPath, $asIniSections[$i])
_ArraySort($aSection,0,0,0,1)
For $i2 = 1 To UBound($aSection) - 1
$hButton = GUICtrlCreateButton($aSection[$i2][0], 17, 52+$i2*32,142,26,$WS_GROUP)
GUICtrlSetOnEvent($hButton, "action")
If $i <> 1 Then GUICtrlSetState($hButton, $GUI_HIDE)
$UBound = UBound($ahButtons)
ReDim $ahButtons[$UBound + 1][3]
$ahButtons[$UBound][0] = $hButton
$ahButtons[$UBound][1] = $aSection[$i2][0]
$ahButtons[$UBound][2] = $asIniSections[$i]
Next
Next
EndIf
_ArrayDelete($ahButtons, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton($sButton1, 8, $iHeight - 50, 161, 17, $WS_GROUP)
GUICtrlSetOnEvent($Button1, "Button1Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
#Region ### START Koda GUI section ### Form=C:\Program Files (x86)\AutoIt3\SciTE\Koda\Forms\Einstellungen.kxf
$Form2 = GUICreate($sForm2, 405, 268, 266, 176, -1, -1, $Form1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form2Close")
$Group3 = GUICtrlCreateGroup($sGroup3, 8, 8, 169, 193)
$Input1 = GUICtrlCreateInput("", 16, 24, 153, 21)
GUICtrlSetOnEvent($Input1, "Input1Change")
$Button2 = GUICtrlCreateButton($sButton2, 16, 48, 153, 17, $WS_GROUP)
GUICtrlSetOnEvent($Button2, "Button2Click")
GUICtrlSetState($Button2, $GUI_DISABLE)
;$List1 = _GUICtrlListBox_Create($Form2, "", 16, 72, 153, 97)
$List1 = GUICtrlCreateList("", 16, 72, 153, 97)
GUICtrlSetOnEvent($List1, "List1Click")
GUICtrlSetData($List1, $sCombo1)
$Button3 = GUICtrlCreateButton($sButton3, 16, 176, 153, 17, $WS_GROUP)
GUICtrlSetOnEvent($Button3, "Button3Click")
GUICtrlSetState($Button3,$GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup($sGroup4, 184, 8, 209, 193)
$Edit1 = GUICtrlCreateEdit("", 192, 48, 193, 121)
GUICtrlSetOnEvent($Edit1, "Edit1Change")
GUICtrlSetState($Edit1, $GUI_DISABLE)
$Button4 = GUICtrlCreateButton($sButton4, 192, 176, 193, 17, $WS_GROUP)
GUICtrlSetOnEvent($Button4, "Button4Click")
GUICtrlSetState($Button4, $GUI_DISABLE)
$Combo2 = GUICtrlCreateCombo($sCombo2, 192, 24, 193, 25)
GUICtrlSetOnEvent($Combo2, "Combo2Change")
GUICtrlSetState($Combo2, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group5 = GUICtrlCreateGroup($sGroup5, 8, 208, 385, 49)
$Combo3 = GUICtrlCreateCombo("", 16, 224, 145, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetData($Combo3, $sCombo3, StringTrimRight($sCombo3,StringInStr($sCombo3,"|") - 1))
GUICtrlSetOnEvent($Combo3, "Combo3Change")
$Input2 = GUICtrlCreateInput("", 168, 224, 145, 21)
GUICtrlSetOnEvent($Input2, "Input2Change")
$Button5 = GUICtrlCreateButton($sButton5, 320, 224, 65, 25, $WS_GROUP)
GUICtrlSetOnEvent($Button5, "Button5Click")
GUICtrlSetState($Button5, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
#EndRegion ### END Koda GUI section ###
EndFunc ;==>INIT
While 1
Sleep(100)
WEnd
Func quit()
Exit
EndFunc ;==>quit
Func Button1Click()
GUISetState(@SW_SHOW, $Form2)
EndFunc ;==>Button1Click
Func Button2Click()
Local $sInput = GUICtrlRead($Input1)
$iIndex = _GUICtrlListBox_FindString($List1, $sInput)
If $iIndex == -1 Then
_GUICtrlListBox_BeginUpdate($List1)
_GUICtrlListBox_AddString($List1, $sInput)
_GUICtrlListBox_EndUpdate($List1)
Else
_GUICtrlListBox_SetSel($List1, $iIndex)
EndIf
GUICtrlSetData($Input1, "")
GUICtrlSetState($Button2, $GUI_DISABLE)
EndFunc ;==>Button2Click
Func Button3Click()
$iSel = _GUICtrlListBox_GetCurSel($List1)
If $iSel <> "-1" Then
IniDelete($sIniPath, _GUICtrlListBox_GetText($List1, $iSel))
_GUICtrlListBox_BeginUpdate($List1)
_GUICtrlListBox_DeleteString($List1, $iSel)
_GUICtrlListBox_EndUpdate($List1)
GUICtrlSetData($Combo2, "")
GUICtrlSetData($Edit1, "")
GUICtrlSetState($Combo2,$GUI_DISABLE)
GUICtrlSetState($Edit1,$GUI_DISABLE)
GUICtrlSetState($Button4,$GUI_DISABLE)
EndIf
EndFunc ;==>Button3Click
Func Button4Click()
If GUICtrlRead($Combo2) == "" Then Return
$Action = GUICtrlRead($Edit1)
If $Action <> "" Then
IniWrite($sIniPath, GUICtrlRead($List1), GUICtrlRead($Combo2), _StringEscape($Action))
Else
IniDelete($sIniPath, GUICtrlRead($List1), GUICtrlRead($Combo2))
INIT()
GUISetState(@SW_SHOW,$Form2)
EndIf
EndFunc ;==>Button4Click
Func Button5Click()
IniWrite($sIniPath, "Settings", GUICtrlRead($Combo3), GUICtrlRead($Input2))
EndFunc ;==>Button5Click
Func Combo1Change()
For $i2 = 0 To UBound($ahButtons) - 1
GUICtrlSetState($ahButtons[$i2][0], $GUI_HIDE)
Next
$Section = GUICtrlRead($Combo1)
$aSection = IniReadSection($sIniPath, $Section)
For $i = 1 To UBound($aSection) - 1
For $i2 = 0 To UBound($ahButtons) - 1
If $ahButtons[$i2][2] == $Section Then GUICtrlSetState($ahButtons[$i2][0], $GUI_SHOW)
Next
Next
EndFunc ;==>Combo1Change
Func Combo2Change()
If GUICtrlRead($Combo2) == "" Then
;GUICtrlSetState($Edit1, $GUI_DISABLE)
;GUICtrlSetState($Button4, $GUI_DISABLE)
Else
$Data = IniRead($sIniPath, GUICtrlRead($List1), GUICtrlRead($Combo2), "")
;GUICtrlSetState($Edit1, $GUI_ENABLE)
GUICtrlSetState($Button4, $GUI_ENABLE)
GUICtrlSetData($Edit1, $Data)
EndIf
EndFunc ;==>Combo2Change
Func Combo3Change()
If GUICtrlRead($Combo3) <> "" Then
GUICtrlSetState($Input2, $GUI_ENABLE)
GUICtrlSetState($Button5, $GUI_ENABLE)
Else
GUICtrlSetState($Input2, $GUI_DISABLE)
GUICtrlSetState($Button5, $GUI_DISABLE)
EndIf
EndFunc ;==>Combo3Change
Func Edit1Change()
EndFunc ;==>Edit1Change
Func Form2Close()
GUISetState(@SW_HIDE, $Form2)
GUIDelete($Form2)
GUIDelete($Form1)
INIT()
EndFunc ;==>Form2Close
Func Input1Change()
Local $sInput = GUICtrlRead($Input1)
If $sInput == "Settings" Then
GUICtrlSetData($Input1, "")
GUICtrlSetState($Button2, $GUI_DISABLE)
Else
GUICtrlSetState($Button2, $GUI_ENABLE)
EndIf
EndFunc ;==>Input1Change
Func Input2Change()
EndFunc ;==>Input2Change
Func List1Click()
$sSel = GUICtrlRead($List1)
$aActions = IniReadSection($sIniPath, $sSel)
$sString = ""
GUICtrlSetData($Combo2, "")
If Not @error And IsArray($aActions) And UBound($aActions) > 1 Then
For $i = 1 To UBound($aActions) - 1
$sString &= "|" & $aActions[$i][0]
Next
GUICtrlSetData($Combo2, $sString, $aActions[1][0])
EndIf
GUICtrlSetState($Button3, $GUI_ENABLE)
GUICtrlSetState($Combo2, $GUI_ENABLE)
GUICtrlSetState($Edit1, $GUI_ENABLE)
GUICtrlSetState($Button4, $GUI_ENABLE)
Combo2Change()
$aSection = IniReadSection($sIniPath, $sSel)
EndFunc ;==>List1Click
Func action()
If IsArray($ahButtons) Then
$Section = GUICtrlRead($Combo1)
$CTRL = @GUI_CtrlId
$Key = GUICtrlRead($CTRL)
$Action = IniRead($sIniPath, $Section, $Key, "")
If $Action <> "" Then
$Action = StringFormat($Action)
_RunPlugIn($Action)
EndIf
EndIf
EndFunc ;==>action
Func _StringEscape($String)
Local $escaping[5][2] = [['%', '%%'],['\', '\\'],[@CR, '\r'],[@LF, '\n'],[@TAB, '\t']]
For $i = 0 To UBound($escaping) - 1
$String = StringReplace($String, $escaping[$i][0], $escaping[$i][1]);,0,1)
Next
Return $String
EndFunc ;==>_StringEscape
;===============================================================================
;
; Function Name: _GetWorkingArea()
; Description: Returns the coordinates of desktop working area rectangle
; Parameter(s): None
; Return Value(s): On Success - Array containing coordinates:
; $a[0] = left
; $a[1] = top
; $a[2] = right
; $a[3] = bottom
; On Failure - 0
;
;BOOL WINAPI SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
;uiAction SPI_GETWORKAREA = 48
;===============================================================================
Func _GetWorkingArea()
Local Const $SPI_GETWORKAREA = 48
Local $stRECT = DllStructCreate("long; long; long; long")
Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", _
"uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
If @error Then Return 0
If $SPIRet[0] = 0 Then Return 0
Local $sLeftArea = DllStructGetData($stRECT, 1)
Local $sTopArea = DllStructGetData($stRECT, 2)
Local $sRightArea = DllStructGetData($stRECT, 3)
Local $sBottomArea = DllStructGetData($stRECT, 4)
Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
Return $aRet
EndFunc ;==>_GetWorkingArea
; #FUNCTION# ====================================================================================================================
; Name...........: _RunPlugIn
; Description ...: Führt einen Plug-In aus
; Syntax.........: _RunPlugIn($Source)
; Parameters ....: $Source - Source in AutoIt
; Author ........: Burak Keskin <[email='Burak.keskin@arcor.de'][/email]>
; ===============================================================================================================================
Func _RunPlugIn($Source)
Local $StartLoop_Line, $EndLoop_Line
[/autoit] [autoit][/autoit] [autoit]$Split1 = StringSplit($Source, @LF)
[/autoit] [autoit][/autoit] [autoit]For $NextLoop1 = 1 To $Split1[0]
[/autoit] [autoit][/autoit] [autoit]$Split2 = StringSplit($Split1[$NextLoop1], "=")
$Split3 = StringSplit($Split1[$NextLoop1], " ")
;---------------------------------------------------------------------------------------------------------------
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////
;---------------------------------------------------------------------------------------------------------------
If $Split3[1] <> "For" And $Split3[1] <> "If" Then
If $Split2[0] > 1 Then
Assign(StringTrimLeft(StringTrimRight($Split2[1], 1), 1), Execute(StringTrimLeft(StringReplace($Split2[2], @CR, ""), 1)))
ElseIf $Split2[0] = 1 Then
Execute(StringReplace($Split1[$NextLoop1], @CR, ""))
EndIf
EndIf
;---------------------------------------------------------------------------------------------------------------
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////
;---------------------------------------------------------------------------------------------------------------
If $Split3[1] = "For" Then
$StartLoop_Line = $NextLoop1
For $NextLoop2 = $StartLoop_Line To $Split1[0]
If StringInStr($Split1[$NextLoop2], "Next") Then
$EndLoop_Line = $NextLoop2
ExitLoop
EndIf
Next
$From = $Split3[4]
$To = $Split3[6]
$StartLoop_Line += 1
$EndLoop_Line -= 1
$VarName = $Split3[2]
For $FNLoop = Number($From) To Number($To)
For $NextLoop3 = Number($StartLoop_Line) To Number($EndLoop_Line)
Execute(StringReplace($Split1[$NextLoop3], @CR, ""))
Next
Next
$NextLoop1 = $EndLoop_Line
EndIf
;---------------------------------------------------------------------------------------------------------------
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////
;---------------------------------------------------------------------------------------------------------------
If $Split3[1] = "If" Then
$StartLoop_Line2 = $NextLoop1
For $NextLoop2 = $StartLoop_Line To $Split1[0]
If StringInStr($Split1[$NextLoop2], "EndIf") Then
$EndLoop_Line2 = $NextLoop2
ExitLoop
EndIf
Next
$Var1 = $Split3[2]
$Var2 = $Split3[4]
$StartLoop_Line2 += 1
$EndLoop_Line2 -= 1
$IfType = $Split3[3]
If StringLeft(Eval("Var1"), 1) = "$" Then
$Var1 = Eval(StringTrimLeft(Eval("Var1"), 1))
Else
$Var1 = Eval("Var1")
EndIf
If StringLeft(Eval("Var2"), 1) = "$" Then
$Var2 = Eval(StringTrimLeft(Eval("Var2"), 1))
Else
$Var2 = Eval("Var2")
EndIf
If $IfType = "=" Then
If String($Var1) = String($Var2) Then
For $NextLoop4 = $StartLoop_Line2 To $EndLoop_Line2
Execute(StringReplace($Split1[$NextLoop4], @CR, ""))
Next
EndIf
ElseIf $IfType = "<" Then
If String($Var1) < String($Var2) Then
For $NextLoop4 = $StartLoop_Line2 To $EndLoop_Line2
Execute(StringReplace($Split1[$NextLoop4], @CR, ""))
Next
EndIf
ElseIf $IfType = ">" Then
If String($Var1) > String($Var2) Then
For $NextLoop4 = $StartLoop_Line2 To $EndLoop_Line2
Execute(StringReplace($Split1[$NextLoop4], @CR, ""))
Next
EndIf
ElseIf $IfType = "<>" Then
If String($Var1) <> String($Var2) Then
For $NextLoop4 = $StartLoop_Line2 To $EndLoop_Line2
Execute(StringReplace($Split1[$NextLoop4], @CR, ""))
Next
EndIf
EndIf
$NextLoop1 = $EndLoop_Line2
EndIf
;---------------------------------------------------------------------------------------------------------------
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////
;---------------------------------------------------------------------------------------------------------------
If $Split3[1] = "While" Then
EndIf
[/autoit] [autoit][/autoit] [autoit]Next
EndFunc ;==>_RunPlugIn
Verbesserungswürdig ist noch die Größenanpassung der GUI(Window-Snap beabsichtigt uvm)
autoit.de/wcf/attachment/6750/