Hi BugFix
Danke für den Tip!!
Wieso ich da nicht selber dran gedacht hab, zumal ich $GUI_DISABLE ja bereits in meinem Tool verwendet hab.
BTW: Ihr macht hier nen tollen Job! Weiter so
Nachtrag:
Hat funktioniert, kann geclosed werden ![]()
Hi BugFix
Danke für den Tip!!
Wieso ich da nicht selber dran gedacht hab, zumal ich $GUI_DISABLE ja bereits in meinem Tool verwendet hab.
BTW: Ihr macht hier nen tollen Job! Weiter so
Nachtrag:
Hat funktioniert, kann geclosed werden ![]()
Hey all
ich hab mir eine GUI mit Buttons erstellt.
Klickt man auf einen Button, wird etwas ausgeführt.
Aus gewohnheit kann es aber vorkommen, dass man auf so einen Button doppelt klickt, dann wird das 2 mal ausgeführt.
Z.B.: es wird Teamspeak doppelt gestartet und doppelt auf einen Server verbunden, oder ein Multiplayergame wird doppelt gestartet
und das soll es aber nicht.
Wie kann ich das verhindern?
Bisher hatte ich das immer mit Shellexecute gemacht, indem ich die ganzen "infos" mit angegeben hab...
Ich arbeite grad an einem Update meines Serverjoiners. Weil aber bei jedem die Games anders abgespeichert sind, macht es ja eigentlich
nur Sinn, den Pfad zum Game aus der Registry auszulesen... nun haben ja auch alle verschiedene WindowsVersionen (XP,Vista,7, 32/64bit)
und da sind die Registry Einträge auch alle verschieden...
... loool, verdammt, mir ist grad klar geworden, dass egal wie ich es anstelle, man nicht um die Pfadeingabe für das Programm herum kommt,
denn selbst wenn ich von meinem Program das "cod4-Protokoll" eintragen lasse, braucht man ja trotzdem den Pfad...
okay, dann werd ich wohl diesen teil des Programms so lassen müssen, wie es ist ![]()
[HKEY_CURRENT_USER\Software\Classes\cod4]
@="URL:cod4 Protocol"
"URL Protocol"=""
[HKEY_CURRENT_USER\Software\Classes\cod4\DefaultIcon]
@="X:\CoD4\iw3mp.exe,1"
[HKEY_CURRENT_USER\Software\Classes\cod4\shell\open\command]
@="X:\CoD4\iw3mp.exe" "%1"
Alles anzeigen
Das ist der Code den ich in der Windows Registry eingefügt habe.Damit soll sich beim Aufruf mit "cod4://" in der URL des Webbrowsers das Game Call of Duty 4 starten.Er beginnt zwar den Start, denn es erscheint der SplashScreen vom Game. Doch dann bricht er ab, indem er mir diese Fehlermeldung um die Ohren knallt:
ZitatError during initializing.
No IWD files in /main found.
Es wird also nicht das Verzeichnis der EXE als WorkingDir erkannt. Wie kann ich das ändern?
Hey all,
Da es sich bei meiner Frage nur bedingt um AutoIt handelt, bin ich wohl im OffTopic besser aufgehoben.
Ich versuche ein Programm per URL aufzurufen. Das Protokoll dafür hab ich bereits (eigentlich) erfolgreich
in die Windows registry reingeschrieben, denn das Programm startet...
Leider schmeisst mir Windows aber sofort danach ne Fehlermeldung um die Ohren
ZitatError during initialization:
blablabla not found in /main
Aber die Dateien sind definitiv vorhanden. Das aktuelle "working directory" wird also nicht erkannt, obwohl es ja eigentlich klar sein sollte:
Sicher bin ich auf dem Holzweg, denn ich glaube, das "%1" steht doch dafür, das eben dieser Pfad zur ExeDatei als "Working Dir" gilt.
Was muss ich tun, damit
als "working dir" funktioniert???
Ich hatte die Berechnung anpassen müssen. Jetzt werden nur noch die Dateien kopiert, die dem Datum entsprechen, dass ich zu beginn des Scripts in der InputBox eintrage.
In meinem vorherigen Post ist die "für mich" aktuelle Version gespoilert. Man könnte jetzt noch einbauen, dass die "Start/Zielpfade" zu beginn abgefragt werden, aber für mich ist das nicht nötig, es bleibt in meinem Fall immer der gleiche Startpfad.
Nochmals danke!! ![]()
Vielleicht denk ich da einfach viel zu quer mit der Berechnung, scheint auch falsch zu sein, denn es werden keine Einträge in die "!copydata.mfc" geschrieben. Der Plan ist, wie gesagt , dass nur Dateien dort rein geschrieben werden, die nicht älter als 2 Tage sind.
Ich hab jetzt "@error" in meinen Zeilen eingebaut und der Fehler kommt nun Tatsächlich nicht mehr. Danke Dafür.
Es stellte sich nun aber heraus, dass meine Rechnung voll fürn Allerwertesten war, die musste ich anpassen.
Jetzt funktioniert es.
;===werden benötigt=============================================================
#include
#include
Global $inputtime = InputBox("Datum des Updates", "Trage hier das Referenzdatum ein." & @LF & @LF & "!!!! Wichtig: !!!!" & @LF & @LF & "nur die Zahlen im Format: JJJJMMTT" & @LF & "Beispiel 8.März 2007 ---> 20070308", @YEAR & @MON & @MDAY)
[/autoit] [autoit][/autoit] [autoit]Global $strFiles = '', $strSize = 0
;===============================================================================
;===Beispiel 1 (erstellen der Datei "!copydata.mfc" im Quellverzeichnis)========
Global $sSourcePath = ''
Global $aReturn = _MultiFileCopy($sSourcePath)
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, 'MFC', '"!copydata.mfc" wurde erstellt!')
;===============================================================================
;===Beispiel 2 (komplettes Verzeichnis kopieren)================================
; Alle Dateien und Unterverzeichnisse (rekursiv) werden kopiert
; Verzeichnisstruktur der Quelle wird übernommen
Global $sSourcePath = ''
Global $sDestinationPath = ''; Zielpfad (wird ggf. erstellt)
Global $aReturn = _MultiFileCopy($sSourcePath, $sDestinationPath, False)
;===============================================================================
;===Beispiel 3 (mehrere Dateien kopieren)=======================================
; Alle Dateien aus dem Array werden ins Zielverzeichnis kopiert
; Array[0] muss die Anzahl der zu kopierenden Dateien enthalten
;~ Global $aSource[4] = [3, @SystemDir & '\shell32.dll', @SystemDir & '\mspaint.exe', @SystemDir & '\eula.txt']
;~ Global $sDestinationPath = @ScriptDir & '\Tmp2'; Zielpfad (wird ggf. erstellt)
;~ Global $aReturn = _MultiFileCopy($aSource, $sDestinationPath, False)
;===============================================================================
;===============================================================================
; Function Name: _MultiFileCopy
; Description:: Kopiert mehrere Dateien mit Progressbar
; Parameter(s): Array mit Dateien zum kopieren oder Quellpfad,
; Zielpfad,
; überschreiben? [True/False],
; Wenn überschreiben = True, dann PreFix zum überschreiben
; Return Value(s): Array mit den kopierten Dateien
; Requirement(s): Global $strFiles = '', $strSize = 0
; #include
; #include
; Author(s): Tom99, progandy, eukalyptus and Oscar (http://www.autoit.de)
;===============================================================================
Func _MultiFileCopy($aSource, $sDestPath = '', $bOverWrite = True, $sPreFix = '!Copy')
Local $oldGUICloseOnESC = Opt('GUICloseOnESC', 0)
Local $ret, $sShowSource, $sShowDest, $sSourcePath = '', $sNewFolder = '', $k
Local $filetime, $filetimeist, $timedifferenz
Local $aMFC[12] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, False, DllOpen('user32.dll')]
If IsArray($aSource) Then
If Not IsNumber($aSource[0]) Then Return SetError(1, 0, 0)
For $i = 1 To $aSource[0]
$aMFC[7] += FileGetSize($aSource[$i])
Next
Else
$sSourcePath = $aSource
If StringRight($sSourcePath, 1) <> '\' Then $sSourcePath &= '\'
$strSize = 0
ToolTip('Bitte warten! Verzeichnis wird eingelesen!', @DesktopWidth / 2 - 100, 10)
If FileExists($sSourcePath & '!copydata.mfc') And $sDestPath <> '' Then
Local $sFile = StringTrimRight(FileRead($sSourcePath & '!copydata.mfc'), 2)
$strSize = StringLeft($sFile, StringInStr($sFile, @CRLF) - 1)
$aSource = StringSplit(StringTrimLeft($sFile, StringInStr($sFile, @CRLF) + 1), @CRLF, 1)
Else
If FileExists($sSourcePath & '!copydata.mfc') Then FileDelete($sSourcePath & '!copydata.mfc')
$aSource = _GetFilesFolder_Rekursiv($sSourcePath)
Local $hFile = FileOpen($sSourcePath & '!copydata.mfc', 2)
If $hFile <> -1 Then
FileWriteLine($hFile, $strSize)
For $i = 1 To $aSource[0]
$filetime = FileGetTime($aSource[$i]) ; von mir hinzugefügt
If Not @error then
If $inputtime = ($filetime[0] & $filetime[1] & $filetime[2]) Then
FileWriteLine($hFile, $aSource[$i]); die auch
Endif
EndIf
Next
FileClose($hFile)
EndIf
EndIf
$aMFC[7] = $strSize
ToolTip('')
If $sDestPath = '' Then Return SetError(0, 0, 1)
EndIf
If StringRight($sDestPath, 1) <> '\' Then $sDestPath &= '\'
If Not FileExists($sDestPath) Then
If Not DirCreate($sDestPath) Then Return SetError(2, 0, 0)
EndIf
$sShowDest = StringRegExpReplace($sDestPath, '(.{15})(.*)(.{35})', '$1' & '[...]' & '$3')
Local $aReturn = $aSource
Local $callback = DllCallbackRegister('__Progress', 'int', 'uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str')
Local $ptr = DllCallbackGetPtr($callback)
Local $DllKernel32 = DllOpen('kernel32.dll')
__ProgressCreate($aMFC)
$aMFC[9] = TimerInit()
For $i = 1 To $aSource[0]
$sArray = ''
For $j = 0 To 11
$sArray &= $aMFC[$j] & ';'
Next
$sFile = StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
If $sSourcePath <> '' Then
$sNewFolder = StringTrimLeft(StringLeft($aSource[$i], StringInStr($aSource[$i], '\', 0, -1)), StringLen($sSourcePath))
If Not FileExists($sDestPath & $sNewFolder) Then
If Not DirCreate($sDestPath & $sNewFolder) Then Return SetError(3, 0, 0)
EndIf
EndIf
If $sFile = '' Then ContinueLoop
$k = 0
While $bOverWrite = False And FileExists($sDestPath & $sNewFolder & $sFile)
$k += 1
$sFile = $sPreFix & $k & "_" & StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
WEnd
$aReturn[$i] = $sDestPath & $sNewFolder & $sFile
$sShowSource = StringRegExpReplace($aSource[$i], '(.{15})(.*)(.{35})', '$1' & '[...]' & '$3')
GUICtrlSetData($aMFC[1], 'Kopiere Datei ' & @CRLF & '"' & $sShowSource & '"' & @CRLF & 'nach: "' & $sShowDest & '"')
$ret = DllCall($DllKernel32, 'int', 'CopyFileExA', 'str', $aSource[$i], 'str', $aReturn[$i], 'ptr', $ptr, 'str', $sArray, 'int', 0, 'int', 0)
;~ ConsoleWrite('Return: ' & $ret[0] & @LF)
If $ret[0] = 0 Then $aMFC[10] = True
$aMFC[8] += FileGetSize($aSource[$i])
Next
DllClose($DllKernel32)
DllCallbackFree($callback)
GUIDelete($aMFC[0])
DllClose($aMFC[11])
Opt('GUICloseOnESC', $oldGUICloseOnESC)
Return $aReturn
EndFunc ;==>_MultiFileCopy
Func __Progress($FileSize, $BytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
Local $aSplit = StringSplit(StringTrimRight($lpData, 1), ";")
If $aSplit[11] = 'True' Then Return 1
Local $pos = GUIGetCursorInfo($aSplit[1])
If _IsPressed('1B', Int($aSplit[12])) Then Return 1
If _IsPressed('01', Int($aSplit[12])) And ($pos[4] = Int($aSplit[7])) Then Return 1
Local $sPercent = Round($BytesTransferred / $FileSize * 100, 0), $iTime, $iTotalTime, $iTransferRate
Local $sPercentAll = Round(($aSplit[9] + $BytesTransferred) / $aSplit[8] * 100, 0)
$iTime = TimerDiff($aSplit[10])
$iTotalTime = Ceiling($iTime / 1000 / ($sPercentAll + 0.1) * 100)
;~ $iTransferRate = _StringAddThousandsSep(Int($aSplit[8] / $iTotalTime / 1000), '.', ',')
GUICtrlSetData($aSplit[3], $sPercent & ' %')
GUICtrlSetData($aSplit[5], $sPercent)
GUICtrlSetData($aSplit[4], $sPercentAll & ' % Zeit: ' & Int($iTime / 1000) & '/' & $iTotalTime & ' s (' & $iTransferRate & ' KB/s)')
GUICtrlSetData($aSplit[6], $sPercentAll)
EndFunc ;==>__Progress
Func __ProgressCreate(ByRef $aMFC)
If Not IsDeclared('WS_POPUPWINDOW') Then Local Const $WS_POPUPWINDOW = 0x80880000
If Not IsDeclared('WS_EX_TOPMOST') Then Local Const $WS_EX_TOPMOST = 0x00000008
If Not IsDeclared('WS_EX_TOOLWINDOW') Then Local Const $WS_EX_TOOLWINDOW = 0x00000080
If Not IsDeclared('WS_EX_COMPOSITED') Then Local Const $WS_EX_COMPOSITED = 0x02000000
$aMFC[0] = GUICreate('MultiFileCopy', 480, 220, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_COMPOSITED))
$aMFC[1] = GUICtrlCreateLabel('', 10, 10, 460, 65)
GUICtrlSetFont(-1, 10, 400, 0, 'Courier New')
GUICtrlCreateLabel('Datei:', 10, 83, 60, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[2] = GUICtrlCreateLabel('0 %', 80, 83, 390, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[4] = GUICtrlCreateProgress(10, 100, 460, 20)
GUICtrlCreateLabel('Gesamt:', 10, 133, 60, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[3] = GUICtrlCreateLabel('0 %', 80, 133, 390, 16)
GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
$aMFC[5] = GUICtrlCreateProgress(10, 150, 460, 20)
$aMFC[6] = GUICtrlCreateButton('Abbrechen', 200, 185, 75, 25)
GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
GUISetState()
EndFunc ;==>__ProgressCreate
;==================================================================================================
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Anpassung: Verzeichnisgröße ermitteln für _MultiFileCopy ($strSize)
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFunc
Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then
$strSize += $file.size
$strFiles &= $file.Path & $Delim
EndIf
Else
$strSize += $file.size
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFunc
danke nochmal für deine Hilfe Raupi ![]()
okay, recht haste natürlich xD
Wenn ich dieses Script hier richtig verstehe, dann Kopiert es NUR die Dateien, die in der "!copydata.mfc" gelistet sind?
Wenn dem so ist, könnte man dann die Funktion, die dafür sorgt, das die Files in die Liste geschrieben werden, so umschreiben,
dass nur die Einträge von den Files in diese Liste eingetragen werden, die nicht älter sind als ein benutzerdefiniertes Datum?
Ich hab schon einige Varianten durchprobiert, wie ich es am besten hinbekomme, aber es kommt immer wieder der gleiche Fehler.
Hier mal der Code:
If IsArray($aSource) Then
If Not IsNumber($aSource[0]) Then Return SetError(1, 0, 0)
For $i = 1 To $aSource[0]
$aMFC[7] += FileGetSize($aSource[$i])
Next
Else
$sSourcePath = $aSource
If StringRight($sSourcePath, 1) <> '\' Then $sSourcePath &= '\'
$strSize = 0
ToolTip('Bitte warten! Verzeichnis wird eingelesen!', @DesktopWidth / 2 - 100, 10)
If FileExists($sSourcePath & '!copydata.mfc') And $sDestPath <> '' Then
Local $sFile = StringTrimRight(FileRead($sSourcePath & '!copydata.mfc'), 2)
$strSize = StringLeft($sFile, StringInStr($sFile, @CRLF) - 1)
$aSource = StringSplit(StringTrimLeft($sFile, StringInStr($sFile, @CRLF) + 1), @CRLF, 1)
Else
If FileExists($sSourcePath & '!copydata.mfc') Then FileDelete($sSourcePath & '!copydata.mfc')
$aSource = _GetFilesFolder_Rekursiv($sSourcePath)
Local $hFile = FileOpen($sSourcePath & '!copydata.mfc', 2)
If $hFile <> -1 Then
FileWriteLine($hFile, $strSize)
For $i = 1 To $aSource[0]
$filetime = FileGetTime($aSource[$i])
If Not ($inputtime - ($filetime[0] & $filetime[1] & $filetime[2])) > 2 Then FileWriteLine($hFile, $aSource[$i])
Next
FileClose($hFile)
EndIf
EndIf
$aMFC[7] = $strSize
ToolTip('')
If $sDestPath = '' Then Return SetError(0, 0, 1)
EndIf
Das ist das Script vom 1. Beitrag dieses Topics, Auszug von Zeile 56 bis Zeile 85.
hinzugefügt hab ich folgende Zeilen:
$filetime = FileGetTime($aSource[$i]) ; von mir hinzugefügt
If Not ($inputtime - ($filetime[0] & $filetime[1] & $filetime[2])) > 2 Then FileWriteLine($hFile, $aSource[$i]); die auch
Die Variable $inputdate wird "Global" zu beginn des Scripts per Inputbox aufgerufen, dort trage ich ein Referenzdatum ein.
Und von allen Dateien in den Ordnern, die durchforstet werden, die nicht älter sind als 2 Tage, vom Referentdatum gesehen,
sollen kopiert werden.
Wenn ich das Script debugge wird mir weder Warnung noch Fehler angezeigt, doch führe ich das Script aus, erhalte ich immer
diese Fehlermeldung:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Lottich\Desktop\AutoIt v3 Script (neu).au3"
C:\Users\Lottich\Desktop\AutoIt v3 Script (neu).au3 (89) : ==> Subscript used with non-Array variable.:
If Not ($inputtime - ($filetime[0] & $filetime[1] & $filetime[2])) > 2 Then FileWriteLine($hFile, $aSource[$i])
If Not ($inputtime - ($filetime^ ERROR
>Exit code: 1 Time: 7.613
Ich komm hier einfach nicht mehr weiter, wie krieg ich diesen Fehler weg??
mfG Lottich
Hey all,
sorry dass ich dieses ältere Thema wieder ausgrabe, aber sind die Entwickler von diesem Thread noch aktiv?
Ich mein speziell die entwickler des Scripts auf der 1. Seite dieses Threads
Tom99, progandy, eukalyptus, Oscar und BugFix
Ich hätte da evtl noch eine Anregung/Herausforderung für euch. Ich selbst bin leider (noch) nicht mächtig
genug das allein zu bewerkstelligen
![]()
mfG Lottich
Hallo.
Dieser Thread ist ausschließlich an die deutschen Entwickler von Autoit gerichtet....
in einem Englisch sprachigen Forum habe ich folgendes Script gefunden, dass man in einem Sourcecode includen kann:
_NTServices.au3
Hier ist die Seite mit kleiner Anleitung
ich möchte euch darum Bitten, dieses mit in die deutsche Hilfe einzubauen und auch mit ins Paket aufzunehmen.
Dieses Script ermöglicht es von Diensten den Status abzufragen, sowie Dienste zu starten und zu stoppen.
Das ist äusserst hilfreich, wie ich finde, hab es auch schon erfolgreich in meinem Projekt integriert.
Joa, jetzt scheint alles zu funktionieren.
Den Fehler, dass jetzt alle Einträge in die letzte INI geschrieben wurden konnte ich beheben, indem ich einfach
$ini = $inix
als Parameter an die Funktion writetoini() aus der Funktion davor übergeben hab.
Das scheint jetzt alles so zu klappen, wie es soll, nun könnte ich einen ersten Testlauf machen, aber nicht am Wochenende. Da soll alles laufen.
Danke für eure Hilfe. Ich werd mich sicher nochmal melden, denn es ist whrscheinlich, dass ich irgendwo nen Error eingebaut hab xD.
Okay,
Ich hab jetzt alles nötige zusammengefasst.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#include <EditConstants.au3>
; ### Prüft, ob das Programm bereits läuft. Lässt nur 1 Instanz zu.
$instanz = "kdsvkais"
If WinExists ($instanz) Then Exit
AutoItWinSetTitle ($instanz)
; ### Scriptoptionen.
Opt("GUIOnEventMode", 1)
Opt('MustDeclareVars', 1)
Opt("WinTitleMatchMode",1)
Local $colorbackground = 0x4A82B5
Local $colorblack = 0x000000
Local $colorstatic = 0xFFF000
Local $font = "Comic Sans MS"
Local $titel = "TEST Serverwatcher"
Local $ini1 = @ScriptDir & "\test1.ini"
Local $ini2 = @ScriptDir & "\test2.ini"
Local $mainwindow, $buttonname, $buttonserver1, $checkmanumod, $buttonserver1mam, $inix, $name, $mamname
Local $pfad, $game, $port, $config, $exe, $pb, $rcon, $mod, $plmax, $plprv, $message, $start
Local $header, $starten, $stoppen, $restart, $opendir, $editme, $back, $iniwindow, $inibuttonback, $takeover
Local $input1, $input2, $input3, $input4, $input5, $input6, $input7, $input8, $input9, $input10, $input11, $input12, $input13
guicreation()
Func guicreation() ; Benutzeroberfläche wird erstellt.
$mainwindow = GUICreate ("IFA Serverwatcher v2.0 in Entwicklung", 800, 600,0,0)
GUISetState (@SW_SHOW)
GUISetOnEvent ($GUI_EVENT_CLOSE, "ProgrammBeenden")
GUISetBkColor ($colorbackground)
GUICtrlSetDefColor ($colorblack)
GUISetFont (40, 400, 4, $font)
GUICtrlCreateLabel ($titel, 40, 20)
GUISetFont (11, 400, 0, $font)
GUICtrlSetDefBkColor($colorstatic)
buttons()
EndFunc
Func buttons() ; Serverbuttons werden erstellt und Funktionen werden zugewiesen.
GUISwitch($mainwindow)
$buttonname = IniRead($ini1,"Name des Buttons","Name des Buttons", "...noch frei...")
$buttonserver1 = GUICtrlCreateButton($buttonname, 40,100,150)
$buttonname = _GUICtrlButton_GetText($buttonserver1)
$checkmanumod = IniRead($ini1,"Manu Admin Mod nutzen","Manu Admin Mod nutzen", "")
If $checkmanumod= "ja" Then $buttonserver1mam = GUICtrlCreateButton("MAM " & $buttonname, 200,100,180)
If $buttonname = "" Then GUICtrlDelete ($buttonserver1)
If $buttonname = "" Then GUICtrlDelete ($buttonserver1mam)
GUICtrlSetOnEvent($buttonserver1, "server1")
GUICtrlSetOnEvent($buttonserver1mam, "mamserver1")
EndFunc
Func server1() ; Verhalten des Serverbuttons, Prüft den Gametype und liest Infos aus. Leitet weiter an Funktion "buttonscreate".
GUISwitch($mainwindow)
buttonsdelete()
$inix = $ini1
$name = IniRead($inix, "Name des Buttons", "Name des Buttons","")
$pfad = IniRead($inix, "Pfad zur Exe", "Pfad zur Exe","")
$game = IniRead($inix, "welches Game", "welches Game","")
$port = IniRead($inix, "Port", "Port","")
$config = IniRead($inix, "Name der Serverconfig", "Name der Serverconfig","")
$exe = IniRead($inix, "Name der Exe", "Name der Exe","")
$pb = IniRead($inix, "Punkbuster", "Punkbuster","")
$rcon = IniRead($inix, "Passwort RCon", "Passwort RCon","")
$mod = IniRead($inix, "Name des Mods", "Name des Mods","")
$plmax = IniRead($inix, "Maximale Spielerzahl", "Maximale Spielerzahl","")
$plprv = IniRead($inix, "Anzahl Private Slots", "Anzahl Private Slots","")
$message= $name & " ist bereits gestartet."
If $game = "cod4" Then
; Hier mit If/ElseIf mit einer Select/Case Verschachtelung um die Variable $start mit den richtigen Parametern zu versehen
; Es wird mit den oben ausgelesenen Variablen jongliert
EndIf
IniWrite($inix, "Startparameter", "Startparameter", $start)
buttonscreate()
EndFunc
Func mamserver1() ; Liest Infos des Manumods und leitet diese weiter an Funktion "buttonscreate2".
GUISwitch($mainwindow)
buttonsdelete()
$inix = $ini1
$name = IniRead($inix, "Name des Buttons", "Name des Buttons","")
$mamname= "MAM " & $name
$pfad = IniRead($inix, "Pfad zu MAM", "Pfad zu MAM", "")
$message= $mamname & " ist bereits gestartet."
buttonscreate2()
EndFunc
Func buttonscreate() ; erstellt "Aktionsgruppe" zur Serverkontrolle eines Serverbuttons.
$header = GUICtrlCreateGroup ($name, 400, 150, 200, 340)
$starten = GUICtrlCreateButton("starten", 450, 185, 100)
$stoppen = GUICtrlCreateButton("stoppen", 450, 225, 100)
$restart = GUICtrlCreateButton("restart", 450, 265, 100)
$opendir = GUICtrlCreateButton("öffne Ordner", 450, 325, 100)
$editme = GUICtrlCreateButton("bearbeiten", 450, 365, 100)
$back = GUICtrlCreateButton("zurück ", 450, 425, 100)
;~ GUICtrlSetOnEvent($starten, "serverstarten")
;~ GUICtrlSetOnEvent($stoppen, "serverstoppen")
;~ GUICtrlSetOnEvent($restart, "serverrestart")
;~ GUICtrlSetOnEvent($opendir, "openserver")
GUICtrlSetOnEvent($editme, "openini")
GUICtrlSetOnEvent($back, "buttonsdelete")
EndFunc
Func buttonscreate2() ; erstellt "Aktionsgruppe" zur Serverkontrolle eines ManuMod-Buttons.
$header = GUICtrlCreateGroup ($mamname, 400, 150, 200, 340)
$starten = GUICtrlCreateButton("starten", 450, 185, 100)
$stoppen = GUICtrlCreateButton("stoppen", 450, 225, 100)
$restart = GUICtrlCreateButton("restart", 450, 265, 100)
$opendir = GUICtrlCreateButton("öffne Ordner", 450, 325, 100)
$back = GUICtrlCreateButton("zurück ", 450, 425, 100)
;~ GUICtrlSetOnEvent($starten, "mamserverstarten")
;~ GUICtrlSetOnEvent($stoppen, "mamserverstoppen")
;~ GUICtrlSetOnEvent($restart, "mamserverrestart")
;~ GUICtrlSetOnEvent($opendir, "openserver")
GUICtrlSetOnEvent($back, "buttonsdelete")
EndFunc
Func openini() ; Übernimmt Daten des gedrückten Buttons und öffnet die INI des gewählten Servers / ManuMods.
$iniwindow = GUICreate($name,600,600,803,0)
GUISetState (@SW_SHOW)
GUISetOnEvent ($GUI_EVENT_CLOSE, "ProgrammBeenden2")
GUISetBkColor ($colorbackground)
$inibuttonback = GUICtrlCreateButton("Abbruch",50,550, 100)
$takeover = GUICtrlCreateButton("übernehmen",450, 550, 100)
GUICtrlSetOnEvent($inibuttonback, "ProgrammBeenden2")
GUICtrlSetOnEvent($takeover, "writetoini")
GUISetFont (11, 400, 0, $font)
Select
Case $game = "ts3"
GUICtrlCreateLabel("Welcher Art soll der Server angehören?" ,30,100)
$input1 = GUICtrlCreateInput($game, 350, 95, 200)
GUICtrlCreateLabel("Wie soll der Name des Buttons lauten?" ,30,140)
$input2 = GUICtrlCreateInput($name, 350, 135,200)
GUICtrlCreateLabel("Welchen Port soll der Server nutzen?" ,30,180)
$input5 = GUICtrlCreateInput($port, 350, 175, 200)
GUICtrlCreateLabel("Nenn mir den Pfad zur Server.exe!" ,30,220)
$input10 = GUICtrlCreateInput($pfad, 350, 215, 200)
GUICtrlCreateLabel("Nenn mir den Namen der Server.exe!" ,30,260)
$input11 = GUICtrlCreateInput($exe, 350, 255, 200)
Case Else
$game = InputBox("Serverart wählen...", "Welcher Natur soll der Server werden?")
Select
Case $game = "ts3"
GUICtrlCreateLabel("Welcher Art soll der Server angehören?" ,30,100)
$input1 = GUICtrlCreateInput($game, 350, 95, 200)
GUICtrlCreateLabel("Wie soll der Name des Buttons lauten?" ,30,140)
$input2 = GUICtrlCreateInput($name, 350, 135,200)
GUICtrlCreateLabel("Welchen Port soll der Server nutzen?" ,30,180)
$input5 = GUICtrlCreateInput($port, 350, 175, 200)
GUICtrlCreateLabel("Nenn mir den Pfad zur Server.exe!" ,30,220)
$input10 = GUICtrlCreateInput($pfad, 350, 215, 200)
GUICtrlCreateLabel("Nenn mir den Namen der Server.exe!" ,30,260)
$input11 = GUICtrlCreateInput($exe, 350, 255, 200)
EndSelect
EndSelect
EndFunc
Func writetoini() ; Schreibt die nötigen Einträge in die INI.
IniWrite($inix, "welches Game", "welches Game", GUICtrlRead($input1))
IniWrite($inix, "Name des Buttons", "Name des Buttons", GUICtrlRead($input2))
IniWrite($inix, "Manu Admin Mod nutzen", "Manu Admin Mod nutzen", GUICtrlRead($input3))
IniWrite($inix, "Pfad zu MAM", "Pfad zu MAM", GUICtrlRead($input4))
IniWrite($inix, "Port", "Port", GUICtrlRead($input5))
IniWrite($inix, "Punkbuster", "Punkbuster", GUICtrlRead($input6))
IniWrite($inix, "Name des Mods", "Name des Mods", GUICtrlRead($input7))
IniWrite($inix, "Name der Serverconfig", "Name der Serverconfig", GUICtrlRead($input8))
IniWrite($inix, "Passwort RCon", "Passwort RCon", GUICtrlRead($input9))
IniWrite($inix, "Pfad zur Exe", "Pfad zur Exe", GUICtrlRead($input10))
IniWrite($inix, "Name der Exe", "Name der Exe", GUICtrlRead($input11))
IniWrite($inix, "Maximale Spielerzahl", "Maximale Spielerzahl", GUICtrlRead($input12))
IniWrite($inix, "Anzahl Private Slots", "Anzahl Private Slots", GUICtrlRead($input13))
EndFunc
Func ProgrammBeenden() ; Beendet das Programm und alle laufenden Funktionen
Exit
EndFunc
Func ProgrammBeenden2() ; Beendet die 2. GUI
GUIDelete($iniwindow)
EndFunc
Func buttonsdelete() ; Entfernt die "Aktionsgruppe" zur Serverkontrolle. Wichtig für die Übersicht.
GUICtrlDelete($header)
GUICtrlDelete($starten)
GUICtrlDelete($stoppen)
GUICtrlDelete($restart)
GUICtrlDelete($opendir)
GUICtrlDelete($editme)
GUICtrlDelete($back)
EndFunc
; ### Funktion: Verhalten dieses Programms während es gestartet ist.
While 1
;~ safemode()
;~ watch()
;~ checker()
;~ cleaner()
Sleep(10000)
WEnd
Die Variable $inix wird übergeben, sobald auf den Button geklickt wird, genau wie alle andern Variablen auch.
Als Test kann man sich ja mal ne test.ini anlegen , das Script starten und bei der Eingabe ts3 eintippen.
Zweck den mein Programm erfüllen soll:
Es handelt sich um eine Benutzeroberfläche, die meine Clanserver überwacht (neu starten wenn sie abschmieren, automatisch bereinigen, und quasi alles machen, was ich sonst per hand erledigen muss. Das Programm läuft auch schon einwandfrei in der Version 1.6, allerdings ist das Maßgeschneidert und verträgt KEINE Änderungen, und unterstützt nur die im Quellcode hinterlegten Server/Teamspeak. Schreibt mir Logs, behebt Fehlermeldungen, die bei manchen Server unerwartet und unregelmässig auftauchen, mir auch anzeigt, welche Gameserver überwacht werden und welche nicht, und und und.
Aber es ist nicht flexibel genug.
Also muss ne neue Version her. Eine, die so Flexibel ist, dass ich nur noch INI die Pro Server bearbeiten brauch. Das funktioniert auch. Bisher hatte ich das so, dass mir die übergebene
Server.ini mit notepad++ geöffnet wurde, aber da die INI mehrere Sektionen hat (von denen je nach Situation nicht alle gebraucht werden) und nicht nur ich auf das Programm zugreifen werde, ist es doch klüger, über eine GUI mit Input-Felder nur jene "benötigten Eingaben" aufzulisten, die gerade gebraucht werden.
Ich bin es vorher auch theoretisch durchgegangen und mit den gesammelten Erkenntnissen aus der momentan aktuellen Version 1.6 ist es am sinnvollsten mit mehreren INI´s zu arbeiten, das erleichtert die Arbeit mit dem Übergeben der Variablen.
Mag sein und ist auch wahrscheinlich, dass ihr viel mehr auf dem Kasten habt als ich, aber ich arbeite erst seit gut 2 Monaten mit autoit und hab vorher auch noch nie sowas in der Richtung gemacht. Sicher kriegt ihr mein gesammten Code viel kleiner hin als ich, aber ich bin sehr zufrieden mit dem, was ich bisher gebaut hab.
zurück zum Thema
Ich übergebe alle nötigen Parameter.
also, dass passiert:
Ich starte das Programm, es entsteht eine GUI mit 10 Buttons, die jeweils für einen möglichen Gameserver stehen. bei Klick auf einen Button wird die entsprechende INI ausgelesen und eine neue "Button-Gruppe" erstellt. die ausgelesenen Parameter werden an diese Gruppe weiter gegeben. In dieser Gruppe befindet sich auch ein Edit-Button der mir eine neue GUI aufmacht, mit den Daten der entsprechenden INI als Vorgabe in den Input-Feldern.
Das tut es auch einwandfrei.
Will ich dann etwas ändern, oder ich hab zu beginn auf einen Button geklickt, der noch keine Einträge in der INI hat, dann muss/soll/will ich ja die Eingaben in den Inputfeldern machen. nachdem ich die Eingaben gemacht hab klick ich auf den Button "Übernehmen" der die Funktion aufruft, in der die Eingaben der Inputfelder in die besagte INI reinschreibt.
Und er macht auch die Einträge. Es werden in der dem Button zugehörenden INI die korrekten Sektionen und Schlüssel eingetragen, Nur nicht die Werte aus den Inputfeldern.
Also stimmt doch eigentlich soweit alles mit dem Parameter übergeben. Die Variablen für die Iputfelder sind auch deklariert, sonst hätte mir das der Syntax-Check doch bemängelt.
Allerdings frage ich bei einem "freien Button" per Input-Box ab, welcher Art der Gameserver sein soll. Dieser Wert wird komischerweise eingetragen.
Nachtrag:
Jetzt hab ich es endlich.... ich hab vergessen dem Button "Übernehmen" die Funktion zum INIschreiben zuzuweisen. Dachte es würde reichen
[autoit]If $takeover Then writetoini()
[/autoit]
War offensichtlich ein Trugschluss. Jetzt hab ich aber wieder das Problem, dass $inix die letzte Server.ini ist und nicht mehr die, des gedrückten Serverbuttons. Das is doch zum Mäuse melken.
Hallo ihr beiden.
Arrays machen bei mir keinen Sinn, weil ich einfach zu viele verschiedene Variablen habe, die in mehreren Funktionen verwendet werden sollen. insgesammt beläuft sich mein kleines Script momentan mit 47 Funktionen auf 3680 Zeilen und diese sind fast alle mit select/case und darin noch mit if und elseif verschachtelt. Würd ich da auch noch mit arrays arbeiten, käm ich ja gar nicht mehr klar ![]()
Zum Thema Global
Ich hab bei mir die opt must declare vars auf 1 gesetzt. demzufolge sind alle Variablen mit Local versehen. und da klappts doch auch mit den "Wert übertragungen"...
Aber ich werd das gleich mal testen
Nachtrag:
Das mit dem Global kann es eigentlich nicht sein, weil:
wenn ich (innerhalb dieser Funktion) auf einen anderen Button klicke, wo schon Einträge in einer anderen INI vorhanden sind, dann wird mir das in den Input-Feldern
vorgegeben, das Lesen funzt mit Local, und das Schreiben ja eigentlich auch, denn mir wird von diesem Code
IniWrite($inix,"Name des Buttons","Name des Buttons", GUICtrlRead($input1))
[/autoit]folgendes in die INI (wo es dann auch rechtmässig rein soll, habe 10 INI´s) geschrieben
Und ich kann machen was ich will, er schreibt mir einfach nicht das in die INI, was ich in dem Inputfeld reingeschrieben hab.
Hallo.
Hier ist ein kleiner Ausschnit aus dem Programm, welches ich fast fertig gestellt hab. Aber vor nem grossen Testlauf auf meinem ROOT muss ich noch dieses kleine Problem fixen, irgendwie...
Case $game = "ts3"
GUICtrlCreateLabel("Welcher Art soll der Server angehören?" ,30,100)
$input1 = GUICtrlCreateInput($game, 350, 95, 200)
GUICtrlCreateLabel("Wie soll der Name des Buttons lauten?" ,30,140)
$input2 = GUICtrlCreateInput($name, 350, 135,200)
GUICtrlCreateLabel("Welchen Port soll der Server nutzen?" ,30,180)
$input5 = GUICtrlCreateInput($port, 350, 175, 200)
GUICtrlCreateLabel("Nenn mir den Pfad zur Server.exe!" ,30,220)
$input10 = GUICtrlCreateInput($pfad, 350, 215, 200)
GUICtrlCreateLabel("Nenn mir den Namen der Server.exe!" ,30,260)
$input11 = GUICtrlCreateInput($exe, 350, 255, 200)
EndSelect
EndSelect
If $takeover Then
writetoini()
EndIf
EndFunc
Func writetoini()
$read1=GUICtrlRead($input1)
IniWrite($inix, "welches Game", "welches Game", $read1)
$read2=GUICtrlRead($input2)
IniWrite($inix, "Name des Buttons", "Name des Buttons", $read2)
$read3=GUICtrlRead($input3)
IniWrite($inix, "Manu Admin Mod nutzen", "Manu Admin Mod nutzen", $read3)
$read4=GUICtrlRead($input4)
IniWrite($inix, "Pfad zu MAM", "Pfad zu MAM", $read4)
$read5=GUICtrlRead($input5)
IniWrite($inix, "Port", "Port", $read5)
Die Variable $takeover ist ein Button, der bei Klick die Werte der Input-Felder in die INI schreiben soll.
Wie gesagt, ist nur ein Ausschnitt. Es wurde eine 2. GUI erstellt, hat je nach Situation aus vorheriger Funktion verschiedene Labels und unterschiedliche Anzahl an Input-Feldern.
Die Eingaben, die ich in den Input-Feldern mache, sollen in eine INI gespeichert werden. Davon hab ich 10 stück an der Zahl. Die richtige INI wird mir durch vorherige Funktionen bereitgestellt und auch die Einträge funktionieren fast perfekt. Die Sektionen und Schlüssel werden in die richtige INI geschrieben aber die Werte aus den Inputboxen werden einfach nicht eingetragen! Nur ab und an mal ne Null bei einer Sektion, die nicht durch ein Input-Feld geändert werden soll. Das ist aber okay, da im weiteren Verlauf diese Einträge keine Rolle spielen. Aber:
Warum zum Henker werden Variablen der Input-Felder nicht in die INI geschrieben?
Diese Varianten funktionieren nicht:
$read1=GUICtrlRead($input1)
IniWrite("beispiel.ini","texte","say1", $read1)
;oder
IniWrite("beispiel.ini","texte","say1", GUICtrlRead($input1))
;oder hab auch auf die letzt genannte Funktion verzichtet, ohne Erfolg...
[/autoit]
Was muss ich anders machen??
Hallo Community,
seit heute bin ich hier der neue und wie es sich für nen "Frischling" gehört, hab ich auch gleich eine Frage.
Ich schreibe ein Programm, dass auf einem ROOT läuft. Ich hab die "alpha-Version darauf schon laufen und es funktioniert super.
Leider ist es zu unflexibel. Es ist maßgeschneidert auf den aktuellen Zustand des ROOTs. Will ich da Änderungen vornehmen
(was hinzufügen oder wegnehmen), dann kann das Programm nicht mehr richtig arbeiten. Ist nicht Sinn der Sache, bei jeder Änderung wieder
das Script rauszupacken, im Code rumzufriemeln und dann wieder zu kompilieren...
Also zum Eingemachten:
Das Programm soll mir meine Gameserver steuern. Die Informationen, die es braucht, holt es sich aus einer INI-Datei.
Um es flexibler zu gestalten, wär es sinnvoll, für jeden vorhandenen Schlüssel in der INI automatisch einen neuen Button zu erstellen.
Und genau das ist mein Problem.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <needs\gamecheck.au3>
; ### Scriptoptionen.
Opt("GUIOnEventMode", 1)
Opt('MustDeclareVars', 1)
; ### Variablen scriptbasierend werden deklariert.
Local $ini = @ScriptDir & "\needs\server.ini"
Local $font, $titel, $mainwindow, $sect, $i, $button, $name, $game, $von_links, $von_oben, $game
; ### Benutzeroberfläche wird erstellt.
$font = "Comic Sans MS"
$titel = "Serverwatcher"
$mainwindow = GUICreate ("Serverwatcher v1.5 alpha", 800, 600)
GUISetState (@SW_SHOW)
GUISetOnEvent ($GUI_EVENT_CLOSE, "ProgrammBeenden")
GUISetBkColor (0xA6C5E9)
GUICtrlSetDefColor (0xFF0000)
GUISetFont (20, 400, 4, $font)
GUICtrlCreateLabel ($titel, 180, 30)
GUICtrlSetDefColor (0x000000)
GUISetFont (10, 400, 0, $font)
$i = "1"
$sect = IniReadSection($ini, $i)
If Not @error Then
$von_links = 80
$von_oben = 130
$name = IniRead($ini, $i, "Servername intern", "")
$game = IniRead($ini, $i, "Game", "")
$button = GUICtrlCreateButton($name, $von_links, $von_oben, 150)
GUICtrlSetOnEvent($button, "gamecheck")
EndIf
$i = "2"
$sect = IniReadSection($ini, $i)
If Not @error Then
$von_links = 80
$von_oben = 130 + 20 * $i
$name = IniRead($ini, $i, "Servername intern", "")
$game = IniRead($ini, $i, "Game", "")
$button = GUICtrlCreateButton($name, $von_links, $von_oben, 150)
GUICtrlSetOnEvent($button, "gamecheck")
EndIf
$i = "3"
$sect = IniReadSection($ini, $i)
If Not @error Then
$von_links = 80
$von_oben = 130 + 20 * $i
$name = IniRead($ini, $i, "Servername intern", "")
$game = IniRead($ini, $i, "Game", "")
$button = GUICtrlCreateButton($name, $von_links, $von_oben, 150)
GUICtrlSetOnEvent($button, "gamecheck")
EndIf
Func ProgrammBeenden()
Exit
EndFunc
While 1
Sleep(1000)
WEnd
Die Funktion gamecheck() wird dann von einem anderemScript durchgeführt, welches ein "Select Case Szenario" enthällt:
#include <cod4.au3>
Local $game
gamecheck()
[/autoit][autoit][/autoit][autoit]Func gamecheck()
Select
Case $game = "cod4"
cod4()
Case $game = "cod6"
;~ cod6()
Case $game = "coduo"
;~ coduo()
Case $game= "ts3"
;~ ts3()
Case $game = "homefront"
;~ homefront()
EndSelect
EndFunc
Anschliessend wird dann die Funktion aufgerufen, für die das Select-Case-Szenario zutrifft. Zu Testzwecken hab ich als Aktion eine MsgBox die mir dann eine Meldung ausgibt, wie der Server zu starten ist (Parameter).
Und das grosse Problem hierbei:
Mir werden 3 Buttons angezeigt, doch nur der 1. hat den tatsächlichen Namen, wie er sein muss, die beiden anderen sind fast nur striche ohne Namen.
Wenn ich diese dann anklicke, dann bekomm ich eine Meldung, die gar nicht zutreffen sollte. Versuch ich das nur mit einem Eintrag im ersten Quellcode, dann funktioniert es.
Auch beim Start des ersten Scripts wird mir, bevor die Programmoberfläche angezeigt wird, die Meldung angezeigt, die nur erscheinen dürfte, wenn ich auf den Button klicke.
WTF, i need help!