Hier die Version vom 28.02.2010:
Für's Forum zu groß, also von meiner Homepage: http://www.technik-hobby.de/download/SciTE4AutoIt3.exe
Edit: Link geändert!
Hier die Version vom 28.02.2010:
Für's Forum zu groß, also von meiner Homepage: http://www.technik-hobby.de/download/SciTE4AutoIt3.exe
Edit: Link geändert!
Ich habe hier gerade noch eine Version gefunden, da wird als Versionsnummer nur "02/28/2010" angezeigt.
Wenn Du die haben möchtest, sag Bescheid.
Und warum eine zusätzliche Exit-Funktion und die zweite While-Schleife?
Du kannst doch einfach:
TrayItemSetOnEvent(-1, "_Exit")
[/autoit]
schreiben und die Funktion "ExitScript" weglassen.
Die zweite Schleife sowieso weg, die wird überhaupt nicht aufgerufen.
So, das Spiel ist jetzt fertig und steht bereit zum download (Post #1).
Ich habe das Spiel ausgiebig getestet und hoffe, dass ich nichts übersehen habe, sodass das Spiel auch bei euch fehlerfrei laufen wird.
Falls jemand trotzdem irgendein Fehler bemerkt, bitte melden! ![]()
Hier noch eine Möglichkeit, den Benutzer die Auswahl zu überlassen:
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
$sIPAdress = _IPAdressUserInput()
ConsoleWrite($sIPAdress & @CR)
Func _IPAdressUserInput($hParent = 0)
Local $sIPAdress = '', $hGui, $idCombo, $idOk, $iOldGuiMode
$sIPAdress &= @IPAddress1 <> '0.0.0.0' ? @IPAddress1 & '|' : ''
$sIPAdress &= @IPAddress2 <> '0.0.0.0' ? @IPAddress2 & '|' : ''
$sIPAdress &= @IPAddress3 <> '0.0.0.0' ? @IPAddress3 & '|' : ''
$sIPAdress &= @IPAddress4 <> '0.0.0.0' ? @IPAddress4 & '|' : ''
$sIPAdress = StringTrimRight($sIPAdress, 1)
;~ If Not StringInStr($sIPAdress, '|') Then Return $sIPAdress ; <- diese Zeile aktivieren, wenn man bei nur einer IP-Adresse die Auswahlbox nicht anzeigen lassen will
$hGui = GUICreate('IP-Adresse auswählen', 290, 150, -1, -1, BitOR($WS_CAPTION, $WS_POPUP), -1, $hParent)
GUISetBkColor(0xDDDDDD)
GUICtrlCreateGroup('Bitte die richtige IP-Adresse auswählen:', 10, 20, 270, 80)
GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
$idCombo = GUICtrlCreateCombo('', 50, 50, 190, 36, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, $sIPAdress, StringRegExpReplace($sIPAdress, '(\d+\.\d+\.\d+\.\d+).*', '$1'))
GUICtrlSetFont(-1, 14, 800, 0, 'Courier New', 5)
$idOk = GUICtrlCreateButton('Ok', 110, 110, 70, 28)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial', 5)
GUISetState()
$iOldGuiMode = Opt('GUIOnEventMode', 0)
Do
Until GUIGetMsg() = $idOk
$sIPAdress = GUICtrlRead($idCombo)
GUIDelete($hGui)
Opt('GUIOnEventMode', $iOldGuiMode)
Return $sIPAdress
EndFunc
Zitat aus der Hilfe:
ZitatYou can enable window dragging for GUI without $WS_CAPTION by using $WS_EX_CONTROLPARENT in the exStyle parameter.
So:
#Region
#AutoIt3Wrapper_Icon=\favicon.ico
#EndRegion
#include <GUIConstants.au3>
#include <IE.au3>
Opt('GUIOnEventMode', 1)
Opt('GUICloseOnESC', 0)
Global $pPfad = @ScriptDir & '/data/index.html'
Global $oIE = _IECreateEmbedded()
Global Const $hGUI = GUICreate('txt', 1130, 900)
Global $oObjekt = GUICtrlCreateObj($oIE, 0, 0, 1130, 900)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
GUISetState(@SW_SHOW, $hGUI)
GUISetIcon(@ScriptDir & "\favicon.ico")
$Menu_File = GUICtrlCreateMenu("Info")
$Menu_File_Item = GUICtrlCreateMenuItem("About", $Menu_File)
GUICtrlSetOnEvent(-1, '_About')
_IENavigate($oIE, 'file:///' & $pPfad)
[/autoit] [autoit][/autoit] [autoit]While Sleep(1000)
WEnd
Func _Exit()
Exit
EndFunc ;==>_Exit
Func _About()
Run("about.exe")
EndFunc ;==>_About
Schöne Funktion! Gleich mal archivieren!
Du kannst Dir das #include und _WinAPI_GetFullPathName sparen, wenn Du stattdessen FileGetLongName mit Flag 1 verwendest:
$sPath = FileGetLongName($sPath, 1)
[/autoit]GuiSetIcon darfst Du erst aufrufen, nachdem Du die Gui (mit GuiCreate) erstellt hast.
So:
[autoit]
$var = "In dem String stehen Zahlen wie 1234 oder aber auch 5555."
$erg = StringRegExpReplace($var, '.*?(\d+).*', '$1')
MsgBox(0, 'Ergebnis', $erg)
Hier noch eine kürzere Version der Funktion "_CheckUserInput":
Func _CheckUserInput()
Local $iCount = 0
For $Checkbox In $ahCheck
If BitAND(GUICtrlRead($Checkbox), $GUI_CHECKED) Then $iCount += 1
Next
For $Checkbox In $ahCheck
If Not BitAND(GUICtrlRead($Checkbox), $GUI_CHECKED) Then GUICtrlSetState($Checkbox, ($iCount = 6 ? $GUI_DISABLE : $GUI_ENABLE))
Next
EndFunc ;==>_CheckUserInput
Ok, das wäre dann noch kürzer. ![]()
Ich habe mal nur den Check auf 6 Zahlen eingebaut:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=LottoChance.exe
#AutoIt3Wrapper_Res_Description=v1.2.04
#AutoIt3Wrapper_Res_Comment=Lottochancen-GENERATOR: 6 aus 49
#AutoIt3Wrapper_Res_Field=Companyname|dk78soft
#AutoIt3Wrapper_Res_LegalCopyright=dk78soft
#AutoIt3Wrapper_Res_ProductVersion=1.2.0.4
#AutoIt3Wrapper_Res_FileVersion=1.2.0.4
#AutoIt3Wrapper_Res_Language=7
#AutoIt3Wrapper_UseUpx
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 2 -w 4 -w 6
#AutoIt3Wrapper_Icon=lotto.ico
;#AutoIt3Wrapper_Res_Icon_Add=cancel.ico
;#AutoIt3Wrapper_Res_Icon_Add=ok.ico
;#AutoIt3Wrapper_Res_Icon_Add=write.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ComboConstants.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <WindowsConstants.au3>
#include <GuiStatusBar.au3>
#include <Date.au3>
#include <File.au3>
HotKeySet('{F9}', '_break')
Global $aLottoNum[49], $timer, $bBreak = False, $iCount = 0
For $i = 1 To 49
$aLottoNum[$i - 1] = $i
Next
Global $progname = 'LottoChance', $mycompany = 'dkSoftware', $version = '1.02.04'
Global $breite = 410, $hoehe = 280
Global $Form1 = GUICreate($progname, $breite, $hoehe, -1, -1, $WS_Border + $WS_POPUP + $WS_CLIPSIBLINGS)
Global $ribboncontext = GUICtrlCreateMenu("o(°U°)o ")
Global $idrandom = GUICtrlCreateMenuItem("Zufallsgenerator", $ribboncontext)
Global $idclean = GUICtrlCreateMenuItem("Tip löschen", $ribboncontext)
Global $idsim = GUICtrlCreateMenuItem("Simulation starten", $ribboncontext)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateMenuItem("", $ribboncontext)
Global $ribbonexit = GUICtrlCreateMenuItem("Beenden", $ribboncontext)
Global $ahCheck[49]
For $i = 0 To 48
$ahCheck[$i] = GUICtrlCreateCheckbox($i + 1, 5 + Mod($i, 7) * 30, 5 + Int($i / 7) * 30, 30, 30, $BS_PUSHLIKE)
GUICtrlSetFont(-1, 12, 400, 0, "IMPACT")
GUICtrlSetTip(-1, "Wählen Sie ihre 6 Zahlen")
Next
Global $label1 = GUICtrlCreateLabel(' 6 Zahlen auswählen!', 5, 235, 400, 16, 1)
Global $label3 = GUICtrlCreateLabel('0', 250, 15, 60, 16, 2)
GUICtrlSetFont(-1, 10, 800, '', 'Tahoma')
GUICtrlCreateLabel('x 3 Richtige', 312, 17, 70, 15)
Global $label4 = GUICtrlCreateLabel('0', 250, 35, 60, 16, 2)
GUICtrlSetFont(-1, 10, 800, '', 'Tahoma')
GUICtrlCreateLabel('x 4 Richtige', 312, 37, 70, 15)
Global $label5 = GUICtrlCreateLabel('0', 250, 55, 60, 16, 2)
GUICtrlSetFont(-1, 10, 800, '', 'Tahoma')
GUICtrlCreateLabel('x 5 Richtige', 312, 57, 70, 15)
Global $label6 = GUICtrlCreateLabel('0', 250, 78, 60, 18, 2)
GUICtrlSetFont(-1, 12, 800, '', 'Tahoma')
GUICtrlCreateLabel('x 6 Richtige', 312, 82, 70, 15)
Global $hStatusb = _GUICtrlStatusBar_Create($Form1, -1, "", $SBARS_TOOLTIPS)
Global $aParts[2] = [$breite - 200, $breite]
Global $prozess = GUICtrlCreateProgress(15, 220, 380, ![]()
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState()
_GUICtrlStatusBar_SetMinHeight($hStatusb, 25)
_GUICtrlStatusBar_SetParts($hStatusb, $aParts)
Global $hIcon = __WinAPI_ShellExtractIcons(@ScriptFullPath, 0, 16, 16)
_GUICtrlStatusBar_SetIcon($hStatusb, 0, $hIcon)
_GUICtrlStatusBar_SetText($hStatusb, ' ' & $progname & ' ' & $version, 0)
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case $ribbonexit
Exit
Case $ahCheck[0] To $ahCheck[48]
_CheckUserInput()
Case $idrandom
_Randoming()
Case $idclean
_Clear()
Case $idsim
_Start()
EndSwitch
WEnd
Func _CheckUserInput()
Local $iCount = 0
For $i = 0 To UBound($ahCheck) - 1
If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then $iCount += 1
Next
If $iCount = 6 Then
For $i = 0 To UBound($ahCheck) - 1
If Not BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then GUICtrlSetState($ahCheck[$i], $GUI_DISABLE)
Next
Else
For $i = 0 To UBound($ahCheck) - 1
If Not BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then GUICtrlSetState($ahCheck[$i], $GUI_ENABLE)
Next
EndIf
EndFunc ;==>_CheckUserInput
Func _Randoming()
For $i = 0 To 48
GUICtrlSetState($ahCheck[$i], $GUI_DISABLE)
GUICtrlSetState($ahCheck[$i], $GUI_UNCHECKED)
Next
Local $result, $zahl
For $i = 1 To 6
Do
$zahl = Random(1, 49, 1)
GUICtrlSetState($ahCheck[$zahl - 1], $GUI_CHECKED)
Until StringInStr($result, $zahl) = 0
$result &= StringRight($zahl, StringLen($zahl) - 1)
Next
GUICtrlSetState($idsim, $GUI_ENABLE)
_CheckboxCounter()
If $iCount <> 6 Then _Randoming()
AdlibUnRegister()
EndFunc ;==>_Randoming
Func _Break()
$bBreak = True
GUICtrlSetState($idsim, $GUI_DISABLE)
GUICtrlSetState($idrandom, $GUI_ENABLE)
GUICtrlSetState($idclean, $GUI_ENABLE)
GUICtrlSetState($prozess, $GUI_HIDE)
GUICtrlSetData($label1, ' Start-Button anklicken!')
EndFunc ;==>_Break
Func _Clear()
For $i = 0 To 48
GUICtrlSetState($ahCheck[$i], $GUI_ENABLE)
GUICtrlSetState($ahCheck[$i], $GUI_UNCHECKED)
Next
GUICtrlSetState($idsim, $GUI_DISABLE)
GUICtrlSetData($label1, ' 6 Zahlen auswählen!')
EndFunc ;==>_Clear
Func _Start()
_CheckboxCounter()
If $iCount <> 6 Then _Randoming()
GUICtrlSetState($idrandom, $GUI_DISABLE)
GUICtrlSetState($idclean, $GUI_DISABLE)
GUICtrlSetState($idsim, $GUI_DISABLE)
GUICtrlSetData($label3, 0)
GUICtrlSetData($label4, 0)
GUICtrlSetData($label5, 0)
GUICtrlSetData($label6, 0)
GUICtrlSetState($prozess, $GUI_SHOW)
GUICtrlSetData($prozess, 0)
Local $aTip[6], $aDraw, $iWin = StringLeft(6, 1), $i3, $i4, $i5, $i6
$iCount = 0
For $i = 0 To 48
If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED) Then
$aTip[$iCount] = $i + 1
$iCount += 1
EndIf
Next
$iCount = 0
GUICtrlSetData($label1, ' Bitte warten...')
$timer = TimerInit()
AdlibRegister('_DisplayTimer', 500)
Do
$iCount += 1
$aDraw = _Lottodraw()
Switch _Win($aTip, $aDraw)
Case 3
$i3 += 1
GUICtrlSetData($label3, $i3)
If $i3 = 5 Then GUICtrlSetData($prozess, 1)
If $i3 = 10 Then GUICtrlSetData($prozess, 2)
If $i3 = 25 Then GUICtrlSetData($prozess, 3)
If $i3 = 50 Then GUICtrlSetData($prozess, 4)
If $i3 = 100 Then GUICtrlSetData($prozess, 5)
If $i3 = 1000 Then GUICtrlSetData($prozess, 10)
If $i3 = 2000 Then GUICtrlSetData($prozess, 15)
If $i3 = 3000 Then GUICtrlSetData($prozess, 20)
If $i3 = 5000 Then GUICtrlSetData($prozess, 30)
If $i3 = 7500 Then GUICtrlSetData($prozess, 40)
If $i3 = 10000 Then GUICtrlSetData($prozess, 50)
If $i3 = 15000 Then GUICtrlSetData($prozess, 60)
If $i3 = 20000 Then GUICtrlSetData($prozess, 70)
If $i3 = 30000 Then GUICtrlSetData($prozess, 80)
If $i3 = 50000 Then GUICtrlSetData($prozess, 90)
If $i3 = 75000 Then GUICtrlSetData($prozess, 95)
Case 4
$i4 += 1
GUICtrlSetData($label4, $i4)
Case 5
$i5 += 1
GUICtrlSetData($label5, $i5)
Case 6
$i6 += 1
GUICtrlSetData($prozess, 100)
$bBreak = True
GUICtrlSetData($label6, $i6)
GUICtrlSetData($label1, ' Gewonnen!')
MsgBox(0, 'Lottogewinn', 'Hurra, ' & $iWin & ' Richtige!' & @CRLF & 'Anzahl der Ziehungen: ' _
& _NumberFormatThousand($iCount) & @CRLF & 'Benötigte Zeit: ' & _NumberFormatThousand(Round(TimerDiff($timer) / 1000)) & ' sek.')
GUICtrlSetState($prozess, $GUI_HIDE)
EndSwitch
Until $bBreak
$bBreak = False
GUICtrlSetState($idclean, $GUI_ENABLE)
GUICtrlSetState($idsim, $GUI_ENABLE)
GUICtrlSetState($idrandom, $GUI_ENABLE)
AdlibUnRegister()
EndFunc ;==>_Start
Func _DisplayTimer()
GUICtrlSetData($label1, ' Bitte warten... ' & _NumberFormatThousand($iCount) & ' Ziehungen')
EndFunc ;==>_DisplayTimer
Func _Lottodraw()
Local $aTmp = $aLottoNum, $aDraw[6], $iTmp
For $i = 0 To 5
Local $iRandom = Random(0, 48 - $i, 1)
$aDraw[$i] = $aTmp[$iRandom]
$aTmp[$iRandom] = $aTmp[48 - $i]
Next
_ArraySort($aDraw)
Return $aDraw
EndFunc ;==>_Lottodraw
Func _Win($aTip, $aDraw)
Local $iCount = 0
For $i = 0 To 5
If $aTip[$i] = $aDraw[$i] Then $iCount += 1
Next
Return $iCount
EndFunc ;==>_Win
Func _CheckboxCounter()
Global $iCount = 0
For $i = 0 To 48
$iCount += BitAND(GUICtrlRead($ahCheck[$i]), $GUI_CHECKED)
Next
GUICtrlSetData($label1, ' ' & 6 - $iCount & ' Zahlen auswählen!')
If $iCount = 6 Then
_CheckboxState($GUI_DISABLE)
GUICtrlSetState($idsim, $GUI_ENABLE)
GUICtrlSetData($label1, ' Start-Button anklicken!')
Else
_CheckboxState($GUI_ENABLE)
GUICtrlSetState($idsim, $GUI_DISABLE)
EndIf
EndFunc ;==>_CheckboxCounter
Func _CheckboxState($State)
For $i = 0 To 48
If BitAND(GUICtrlRead($ahCheck[$i]), $GUI_UNCHECKED) Then GUICtrlSetState($ahCheck[$i], $State)
Next
EndFunc ;==>_CheckboxState
Func _NumberFormatThousand($vNumber, $ret = 'DE') ; bis 18 Vorkommastellen
Local $sOut = '', $a = StringRegExp(StringReplace($vNumber, '.', ','), "(-?\d{1,3})(\d{3})?(\d{3})?(\d{3})?(\d{3})?(\d{3})?(?:\Z|(,\d+))", 3)
For $i = 0 To UBound($a) - 1
If $a[$i] <> '' Then $sOut &= '.' & $a[$i]
Next
If $ret <> 'DE' Then Return StringTrimLeft(StringReplace(StringReplace($sOut, '.', ','), ',,', '.'), 1)
Return StringTrimLeft(StringReplace($sOut, '.,', ','), 1)
EndFunc ;==>_NumberFormatThousand
Func __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
Local $ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
If (@error) Or ($ret[0] = 0) Or ($ret[5] = Ptr(0)) Then Return SetError(1, 0, 0)
Return $ret[5]
EndFunc ;==>__WinAPI_ShellExtractIcons
Um ein paar Codezeilen einzusparen und mit einem eindimensionalen Array:
[autoit]
Local $sString = "Míke"
Local $sChars = "ÄAe|ÖOe|ÜUe|äae|öoe|üue|ÂA|ÀA|ÁA|âa|áa|àa|ÊE|ÈE|ÉE|êe|ée|èe|ÎI|ÌI|ÍI|îi|íi|ìi|ÔO|ÒO|ÓO|ôo|óo|òo|ÛU|ÙU|ÚU|ûU|úU|ùU|,|.|-|/|\|_"
Local $aChars = StringSplit($sChars, "|", 2)
For $i = 0 To UBound($aChars) - 1
$sString = StringReplace($sString, StringLeft($aChars[$i], 1), StringMid($aChars[$i], 2), 0, 1)
Next
ConsoleWrite($sString & @CR)
Häh?
Zeig mal das Script. Das geht sicherlich auch einfacher/besser.
Was soll das für einen Sinn ergeben?
Warum soll die Case-Anweisung 21 mal abgefragt werden?
Bitte!
Vielleicht solltest Du Dein Script als neuen Thread in "Scripte" erstellen, damit Dein Script leichter gefunden wird. Es ist ja doch etwas umfangreicher als mein obiges Beispielscript.
Als kleinen Tip:
Dein benutzen von InetGet erfordert zahlreiche Festplattenzugriffe (langsam und unnötig). Mit "InetRead" und "BinaryToString" geht es schneller und ohne Festplattenzugriffe.
Die UDF benötigt man dafür eigentlich gar nicht. Das geht auch mit dem Standard-Date-Control:
#include <DateTimeConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
GUICreate("Stunden : Minuten", 240, 120)
[/autoit] [autoit][/autoit] [autoit]$idDate = GUICtrlCreateDate("", 40, 20, 90, 30, $DTS_UPDOWN)
GUICtrlSetFont(-1, 20)
; to select a specific default format
$sStyle = "HH:mm"
GUICtrlSendMsg($idDate, $DTM_SETFORMATW, 0, $sStyle)
GUISetState(@SW_SHOW)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
MsgBox($MB_SYSTEMMODAL, "Time", GUICtrlRead($idDate))
[/autoit]Bei einer MsgBox reicht es aus, die GUI als Parent zu setzen. So wird aus der MsgBox automatisch ein Childfenster der GUI.
Beispiel:
#include <GUIConstantsEx.au3>
$hGui = GUICreate('test', 400, 300)
$idOpen = GUICtrlCreateButton('Open MsgBox', 10, 20, 100, 25)
$idClose = GUICtrlCreateButton('Close GUI', 120, 20, 100, 25)
GUISetState(@SW_SHOW, $hGui)
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idClose
Exit
Case $idOpen
MsgBox(48, "Fehler!", "Kennwort falsch!", 0, $hGui)
EndSwitch
WEnd
Errorhandling sollte in jedem Script vorhanden sein.
Angefangen mit Deiner Zeile 1, solltest Du gleich prüfen, ob $file auf wirklich ein Filehandle (Wert <> -1) ist.
Du gibst dort nämlich einen relativen Pfad an. Relativ zum WorkingDir. Einige AutoIt-Befehle ändern das WorkingDir nach dem Aufruf, sodass der Pfad evtl. nicht mehr stimmt und es somit zu der obigen Fehlermeldung kommt.
Außerdem sollte eine geöffnetet Datei unbedingt auch wieder geschlossen werden (FileClose), weil die Datei ansonsten gelockt ist.