Oh, diese Leichenschänderei ![]()
Was man natürlich erwähnen kann: Die Abfrage ob "Default" gesetzt ist geht prima mit
IsKeyword($Parameter)
[/autoit]denn "Default" ist das einzige in AutoIt existierende Keyword. ![]()
Oh, diese Leichenschänderei ![]()
Was man natürlich erwähnen kann: Die Abfrage ob "Default" gesetzt ist geht prima mit
IsKeyword($Parameter)
[/autoit]denn "Default" ist das einzige in AutoIt existierende Keyword. ![]()
und wieder mal viel zu viel RegEx für diese einfache Aufgabe
Ich wollte nur deine Aufmerksamkeit wecken.
- Nun auch in RegExp-freier Version. ![]()
Hi,
ich habe mal ein wenig in der Python-Syntax "fremdgeschnüffelt"
und finde die dortige Syntax zur Stringbearbeitung sehr komfortabel. Unsere Befehle StringLeft, -Right, -Mid, -TrimLeft, -TrimRight sind alle in einer simplen Syntax enthalten.
Das ist recht angenehm zu händeln. Also habe ich es mal für AutoIt analog umgesetzt. Vielleicht findet jemand Geschmack dran. ![]()
$s = '0123456789'
ConsoleWrite('> String gesamt ' & $s & @CRLF)
ConsoleWrite('> Das 2-te Zeichen ' & _StrPython($s, '1') & @CRLF)
ConsoleWrite('> an Index 2 bis 5 ' & _StrPython($s, '2:6') & @CRLF)
ConsoleWrite('> bis Index 6 ' & _StrPython($s, ':6') & @CRLF)
ConsoleWrite('> alles ab Index 6 ' & _StrPython($s, '6:') & @CRLF)
ConsoleWrite('> 2-tes von rechts ' & _StrPython($s, '-2') & @CRLF)
ConsoleWrite('> die letzten 3 ' & _StrPython($s, '-3:') & @CRLF)
ConsoleWrite('> außer letzte 3 ' & _StrPython($s, ':-3') & @CRLF)
Func _StrPython($sString, $sMask)
Local $aMask = StringSplit($sMask, ':', 2)
Select
Case StringRegExp($sMask, '\A\d+\z') ; == i
Return StringMid($sString, $sMask+1, 1)
Case StringRegExp($sMask, '\A\d+:\d+\z') ; == i:j
Return StringMid($sString, $aMask[0]+1, $aMask[1]-$aMask[0])
Case StringRegExp($sMask, '\A\:\d+\z') ; == :i
Return StringLeft($sString, $aMask[1])
Case StringRegExp($sMask, '\A\d+:\z') ; == i:
Return StringMid($sString, $aMask[0]+1)
Case StringRegExp($sMask, '\A-\d+\z') ; == -n
Return StringMid($sString, StringLen($sString)+$sMask+1, 1)
Case StringRegExp($sMask, '\A-\d+:\z') ; == -n:
Return StringRight($sString, Abs($aMask[0]))
Case StringRegExp($sMask, '\A:-\d+\z') ; == :-n
Return StringTrimRight($sString, Abs($aMask[1]))
EndSelect
EndFunc
Edit:
Ja ja - es geht natürlich auch ohne RegExp
:
Func _StrPython($sString, $sMask)
Local $aMask = StringSplit($sMask, ':', 2)
If Not StringInStr($sMask, ':') Then ; == i, -n
If $sMask < 0 Then Return StringMid($sString, StringLen($sString)+$sMask+1, 1) ; == -n
Return StringMid($sString, $sMask+1, 1) ; == i
ElseIf StringLeft($sMask, 1) = ':' Then ; == :i, :-n
If $aMask[1] < 0 Then Return StringTrimRight($sString, Abs($aMask[1])) ; == :-n
Return StringLeft($sString, $aMask[1]) ; == :i
ElseIf StringRight($sMask, 1) = ':' Then ; == i:, -n:
If $aMask[0] < 0 Then Return StringRight($sString, Abs($aMask[0])) ; == -n:
Return StringMid($sString, $aMask[0]+1) ; == i:
Else
Return StringMid($sString, $aMask[0]+1, $aMask[1]-$aMask[0]) ; == i:j
EndIf
EndFunc
Edit 16.10.2012
Ich habe die Funktion jetzt etwas erweitert. Zusätzlich zu der bisherigen Syntax kann die Funktion jetzt mit Operationskonstanten aufgerufen werden. Das ist unter Umständen leichter zu merken.
Weiterhin habe ich ein Skript beigefügt um UserCallTips für die Funktion zu installieren.
#Region - TimeStamp
; 2012-10-16 13:01:10 v 0.2
#EndRegion - TimeStamp
#include-once
Global Const $_OIx = -2000 ; == On Index
Global Const $_FTo = $_OIx +1 ; == From (Index) To (Index)
Global Const $_FSTo = $_OIx +2 ; == From Start To (Index)
Global Const $_FToE = $_OIx +3 ; == From (Index) To End
Global Const $_PFR = $_OIx +4 ; == (Char At) Position From Right
Global Const $_ChR = $_OIx +5 ; == (Number) Chars Right
Global Const $_WoChR = $_OIx +6 ; == Without (Number) Chars Right
;===============================================================================
; Function Name....: _StrPython
; Description......: Stringbearbeitung mit Pythonsyntax
; Parameter(s).....: $sString der zu bearbeitende String
; .................: $sOp entweder Maske oder Operator Variable:
; .................: Maske, die die Operation definiert, Index ist 0-basiert
; .................: Maske OperatorVar.
; .................: i $_OIx Zeichen an Index (i)
; .................: i:j $_FTo String von Index (i) bis Index (j) , inkl. (i) / exkl. (j)
; .................: :i $_FSTo String ab Anfang bis Index (i) , exkl. (i)
; .................: i: $_FToE String ab Index (i) bis Ende , inkl. (i)
; .................: -n $_PFR das n-te Zeichen von rechts
; .................: -n: $_ChR die letzten n Zeichen
; .................: :-n $_WoChR alles außer den n letzten Zeichen
; .................: $iVal (nur bei Verwendung OperatorVar.) der (Von) Index
; .................: $iTo (nur bei Verwendung OperatorVar.) der Bis Index
; Return Value(s)..: Erfolg Das Ergebnis der Bearbeitung
; .................: Fehler '' und @error 1 = Von-Bis-Operation ohne Bis-Index
; .................: @error 2 = kein gültiger Operationstyp
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _StrPython($sString, $sOp, $iVal='', $iTo='')
Local $sMask = $sOp
If $iVal <> '' Then
Switch $sOp
Case $_OIx ; == On Index
$sMask = $iVal
Case $_FTo ; == From To
If $iTo = '' Then Return SetError(1,0,'')
$sMask = $iVal & ':' & $iTo
Case $_FSTo ; == From Start To
$sMask = ':' & $iVal
Case $_FToE ; == From To End
$sMask = $iVal & ':'
Case $_PFR ; == Position From Right
$sMask = '-' & $iVal
Case $_ChR ; == Chars Right
$sMask = '-' & $iVal & ':'
Case $_WoChR ; == Without Chars Right
$sMask = ':-' & $iVal
Case Else
Return SetError(2,0,'')
EndSwitch
EndIf
Local $aMask = StringSplit($sMask, ':', 2)
If Not StringInStr($sMask, ':') Then ; == i, -n
If $sMask < 0 Then Return StringMid($sString, StringLen($sString)+$sMask+1, 1) ; == -n
Return StringMid($sString, $sMask+1, 1) ; == i
ElseIf StringLeft($sMask, 1) = ':' Then ; == :i, :-n
If $aMask[1] < 0 Then Return StringTrimRight($sString, Abs($aMask[1])) ; == :-n
Return StringLeft($sString, $aMask[1]) ; == :i
ElseIf StringRight($sMask, 1) = ':' Then ; == i:, -n:
If $aMask[0] < 0 Then Return StringRight($sString, Abs($aMask[0])) ; == -n:
Return StringMid($sString, $aMask[0]+1) ; == i:
Else
Return StringMid($sString, $aMask[0]+1, $aMask[1]-$aMask[0]) ; == i:j
EndIf
EndFunc ;==>_StrPython
#include "StrPython.au3"
[/autoit] [autoit][/autoit] [autoit]$s = '0123456789'
ConsoleWrite('> String gesamt ' & $s & @CRLF)
ConsoleWrite('> Das 2-te Zeichen ' & _StrPython($s, '1' ) & @CRLF)
ConsoleWrite('> von Index 2 bis (exkl.) 6 ' & _StrPython($s, '2:6') & @CRLF)
ConsoleWrite('> bis Index 6 (exkl.) ' & _StrPython($s, ':6' ) & @CRLF)
ConsoleWrite('> alles ab Index 6 (inkl.) ' & _StrPython($s, '6:' ) & @CRLF)
ConsoleWrite('> 2-tes von rechts ' & _StrPython($s, '-2' ) & @CRLF)
ConsoleWrite('> die letzten 3 ' & _StrPython($s, '-3:') & @CRLF)
ConsoleWrite('> außer letzte 3 ' & _StrPython($s, ':-3') & @CRLF)
ConsoleWrite(@CRLF)
ConsoleWrite('> String gesamt ' & $s & @CRLF)
ConsoleWrite('> Das 2-te Zeichen ' & _StrPython($s, $_OIx, 1) & @CRLF) ; == On Index
ConsoleWrite('> von Index 2 bis (exkl.) 6 ' & _StrPython($s, $_FTo, 2, 6) & @CRLF) ; == From (Index) To (Index)
ConsoleWrite('> bis Index 6 (exkl.) ' & _StrPython($s, $_FSTo, 6) & @CRLF) ; == From Start To (Index)
ConsoleWrite('> alles ab Index 6 (inkl.) ' & _StrPython($s, $_FToE, 6) & @CRLF) ; == From (Index) To End
ConsoleWrite('> 2-tes von rechts ' & _StrPython($s, $_PFR, 2) & @CRLF) ; == (Char At) Position From Right
ConsoleWrite('> die letzten 3 ' & _StrPython($s, $_ChR, 3) & @CRLF) ; == (Number) Chars Right
ConsoleWrite('> außer letzte 3 ' & _StrPython($s, $_WoChR, 3) & @CRLF) ; == Without (Number) Chars Right
; == UserCallTips installieren
$sPathUserCallTips = StringLeft(@AutoItExe, StringInStr(@AutoItExe, '\', 0, -1)) & 'SciTE\api\au3.user.calltips.api'
$sToWrite = _
'_StrPython ( $Str, $_OIx, INDEX ) od. ( $Str, "INDEX" ) Gibt Zeichen an Index zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_FTo, INDEX_1, INDEX_2 ) od. ( $Str, "INDEX_1:INDEX_2" ) Gibt Zeichen zw. Index_1 und (exkl.) Index_2 zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_FSTo, INDEX ) od. ( $Str, ":INDEX" ) Gibt Zeichen von Start bis (exkl.) Index zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_FToE, INDEX ) od. ( $Str, "INDEX:" ) Gibt Zeichen von Index bis Ende zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_PFR, NUMBER ) od. ( $Str, "-NUMBER" ) Gibt das n-te Zeichen von rechts zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_ChR, NUMBER ) od. ( $Str, "-NUMBER:" ) Gibt n Zeichen von rechts zurück; erfordert StrPython.au3' & @CRLF & _
'_StrPython ( $Str, $_WoChR, NUMBER ) od. ( $Str, ":-NUMBER" ) Gibt String ohne n rechte Zeichen zurück; erfordert StrPython.au3' & @CRLF
If Not FileExists($sPathUserCallTips) Then
FileWrite($sPathUserCallTips, $sToWrite)
Else
$hFile = FileOpen($sPathUserCallTips, 1)
FileWrite($hFile, @CRLF & $sToWrite)
FileClose($hFile)
EndIf
Nun, ich finde an Eval() nichts auszusetzen , solange man es dosiert einsetzt. Und um eine variable Zahl an Parametern zu übergeben hat man keine andere Wahl. Vorher ein Parameterarray zu erstellen oder einen Parameterstring den ich dann splitte, halte ich für wenig komfortabel.
Und wie progandy auch richtig anmerkte (in einem anderen Thread), sollte man der Geschwindigkeit zu liebe auf das langsame StringFormat verzichten.
Ihr kennt es bestimmt auch: z.B. beim Debuggen möchte man sich im Schleifendurchlauf mehrere Werte nebeneinander anzeigen lassen. Schön wäre es natürlich, wenn diese Werte dann auch immer genau übereinander, also in Tabellenform ausgegeben werden.
Genau das ermöglicht die Funktion _LenGroupedOutput.
Der Einsatz beschränkt sich natürlich nicht nur auf die Konsolenausgabe. Überall, wo mit fixen Stringlängen gearbeitet werden soll ist es recht nützlich.
So gehts:
- Parameter $sLen -- legt die Stringlänge für die übergebenen Werte fest.
Dabei gilt:
'-ANZAHL' -- Alle Werte bekommen die Länge ANZAHL
'ANZAHL_1,ANZAHL_2, ..ANZAHL_n' -- Länge für Element 'n' ; bei Ausrichtung Links nur bis n-1 erforderlich (Angabe bis vorletztes Element)
- Parameter $charFill -- Zeichen, das zum Auffüllen verwendet werden soll
- Parameter $iAlign -- Ausrichtung: 0=Links, 1=Rechts
- Parameter $var_1 .._10 -- Die zu gruppierenden Werte
Und so sieht es dann z.B. aus:
Ausrichtung: Links, Länge für jeden Wert übergeben:
9951......385...60..2686....2044....865
1832......354...24..1047....794.....3253
4157......566...9...4958....2032....732
8108......644...60..3358....4092....1619
9218......322...40..6387....1660....9286
2037......960...78..4019....6150....5656
4731......803...47..6326....4297....6075
2964......436...29..2917....8831....9078
Ausrichtung: Rechts, eine Länge gültig für alle Werte:
....9198.....704......22....1643....2147....4672
....4295.....562......57....1170....4806....6894
....1823......16......26....8112....7126....6141
....6806.....916......53....7885....6703....1689
....1586.....995.......6.....730....5141....7381
....5959.....421......25....4287.....806....5501
....7686.....854......56....2991....7314....4110
....1821.....428......28....5727....6935....6916
Alles anzeigen
ConsoleWrite('Ausrichtung: Links, Länge für jeden Wert übergeben:' & @CRLF)
For $i = 1 To 8
ConsoleWrite(_LenGroupedOutput('10,6,4,8,8,8', '.', 0, Random(10,10000,1),Random(10,1000,1),Random(1,100,1),Random(10,10000,1),Random(10,10000,1),Random(10,10000,1)) & @CRLF)
Next
ConsoleWrite(@CRLF & 'Ausrichtung: Rechts, eine Länge gültig für alle Werte:' & @CRLF)
For $i = 1 To 8
ConsoleWrite(_LenGroupedOutput('-8', '.', 1, Random(10,10000,1),Random(10,1000,1),Random(1,100,1),Random(10,10000,1),Random(10,10000,1),Random(10,10000,1)) & @CRLF)
Next
;===============================================================================
; Function Name....: _LenGroupedOutput
; Description......: Längengruppierten Ausgabestring aus bis zu 10 Werten erzeugen
; Parameter(s).....: $sLen Festlegen der Stringlänge der übergebenen Werte
; '-ANZAHL' das Minus gibt an: ANZAHL gilt für ALLE übergebenen Werte
; 'ANZAHL_1,ANZAHL_2,..ANZAHL_n' ANZAHL_n für Element 'n' ; bei $iAlign=0: n-1 (bis vorletztes Element)
; $charFill Zeichen, das zum Auffüllen verwendet werden soll
; $iAlign '0'= LeftAlign, '1'= RightAlign
; $var_1 .._10 Bis zu 10 Werte, die gruppiert werden sollen
; Return Value(s)..: Erfolg Der gruppierte String
; Fehler @error 1 - $sLen nicht für alle Elemente übergeben
; @error 2 - $charFill ist Leerstring oder zu lang
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _LenGroupedOutput($sLen, $charFill, $iAlign, $var_1, $var_2, $var_3='-0', $var_4='-0', $var_5='-0', $var_6='-0', $var_7='-0', $var_8='-0', $var_9='-0', $var_10='-0')
Local $aVar[9], $index = 0, $aLen, $sFill = '', $sOut = ''
If $iAlign <> 1 Then $iAlign = 0
If StringLen($charFill) <> 1 Then Return SetError(2,0,0)
For $i = 1 To 30
$sFill &= $charFill
Next
For $i = 1 To 10
If Eval('var_' & $i) <> '-0' Then
$aVar[$i-1] = Eval('var_' & $i)
$index = $i -1
Else
ExitLoop
EndIf
Next
If StringLeft($sLen, 1) = '-' Then
$aLen = StringSplit(StringTrimLeft($sLen, 1), ',', 2)
ReDim $aLen[$index+1]
For $i = 1 To $index
$aLen[$i] = $aLen[0]
Next
Else
$aLen = StringSplit($sLen, ',', 2)
If UBound($aLen) < $index Then Return SetError(1,0,0)
EndIf
For $i = 0 To $index
If $iAlign = 0 Then
If $i = $index Then ExitLoop
$sOut &= StringLeft($aVar[$i] & $sFill, $aLen[$i])
Else
$sOut &= StringRight($sFill & $aVar[$i], $aLen[$i])
EndIf
Next
If $iAlign = 0 Then $sOut &= $aVar[$index]
Return $sOut
EndFunc ;==>_LenGroupedOutput
Bei vielen Regestrierungen verwende ich meist so was.
So schön Wegwerf-Mail-Accounts sind: Inzwischen weisen (gefühlte) 99% aller Foren etc. Registrierungsversuche mit TrashMail ab.
Ich hatte noch nicht alle Eventualitäten berücksichtigt - aber nach einmal drüber Schlafen ist nun alles im Lot.
Wenn du StringFormat noch durch normale Stringfunktionen und Round ersetzt
Habe ich gleich mal aufgegriffen und umgesetzt. Viel Spaß damit. ![]()
Ich dachte eigentlich, dass ich vor 4..5 Jahren schonmal solch eine Funktion erstellt habe - finde sie aber nicht mehr.
Ihr kennt ja sicher die sehr mächtige Funktion StringFormat. Und somit wißt ihr auch, wie schwer man sich diese Syntax merken kann. ![]()
In der Mehrzahl der Fälle brauche ich es um Zahlenwerte mit Vornullen oder fester Nachkommastellenlänge auszugeben. Und jedes mal grübele ich aufs Neue, wie die Syntax ist.
Deshalb nun diese Funktion mit einer simpleren Syntax. Vielleicht auch eine Hilfe für andere. ![]()
ConsoleWrite( _FormatNumber('N5', '1243')& @CRLF) ; == Ganzzahl, 5-stellig (min) (Auffüllen mit Vornullen)
ConsoleWrite( _FormatNumber('n5', '1243')& @CRLF) ; == Ganzzahl, 5-stellig (min) (Auffüllen mit Leerzeichen)
ConsoleWrite( _FormatNumber('N5.2', '1243.5')& @CRLF) ; == Float, 5 Vorkommastellen (min) (Auffüllen mit Vornullen), 2 Nachkommastellen (Ergänzen mit Nullen)
ConsoleWrite( _FormatNumber('n.3', '1243.56')& @CRLF) ; == Float, Vorkomma wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
;===============================================================================
; Function Name....: _FormatNumber
; Description......: Formatierung von Zahlenwerten (mit und ohne Vorzeichen, Integer od. Float)
; Parameter(s).....: $sMask Maske zum Bestimmen des Ausgabestrings
; N3 Ganzzahl min. 3 Stellen, Auffüllen mit Vornullen
; n3 Ganzzahl min. 3 Stellen, Auffüllen mit Leerzeichen
; N3.2 Float min. 3 Vorkommastellen (Auffüllen mit Vornullen), min. 2 Nachkommastellen (Ergänzen mit Nullen)
; n.3 Float, Vorkommastellen wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
; $sString der zu formatierende Zahlenwert
; Note.............: Bei negativen Zahlenwerten wird das Vorzeichen mit zur Anzahl der Vorkomma/Stellen eingerechnet
; Return Value(s)..: der formatierte Zahlenwert
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _FormatNumber($sMask, $sString)
Local $sType = StringLeft($sMask, 1)
Local $preZero = StringIsUpper($sType)
$sMask = StringTrimLeft($sMask, 1)
$sMask = StringSplit($sMask, '.', 2)
If UBound($sMask) = 1 Then
If $preZero Then
Return StringFormat('%0' & $sMask[0] & 'd', $sString)
Else
Return StringFormat('%' & $sMask[0] & 'd', $sString)
EndIf
Else
If $preZero Then
Return StringFormat('%0' & $sMask[0] + $sMask[1] +1 & '.' & $sMask[1] & 'f', $sString)
Else
Return StringFormat('%' & StringInStr($sString, '.') + $sMask[1] & '.' & $sMask[1] & 'f', $sString)
EndIf
EndIf
EndFunc ;==>_FormatNumber
Und hier mal die Umsetzung mit progandys Anregung:
Oops - da fällt mir auf: Bei negativen Zahlen stimmt die Anordnung des Vorzeichens noch nicht. Jetzt passt es.![]()
Ändere ich gleich noch.
Edit 01.10.20011
Heut Nacht fiel mir plötzlich ein: Was ist eigentlich mit Übergabe Float zur Ganzzahlformatierung und umgekehrt. Hatte ich noch nicht berücksichtigt.
Jetzt noch mal überarbeitet die wohl alles berücksichtigende Funktion:
Local $aNumbers[6] = [123, 123.456, -123, -123.856, 0.5, -0.5]
Local $aMasks[8] = ['N2', 'n2', 'N5', 'n5', 'N2.2', 'n.2', 'N5.2', 'n.3']
Local $sFill = '..........'
For $i = 0 To 5
For $j = 0 To 7
ConsoleWrite('> ' & StringLeft($aNumbers[$i] & $sFill, 10) & StringLeft($aMasks[$j] & $sFill,
& _FormatNumber($aMasks[$j], $aNumbers[$i]) & @CRLF)
Next
Next
;===============================================================================
; Function Name....: _FormatNumber
; Description......: Formatierung von Zahlenwerten (mit und ohne Vorzeichen, Integer od. Float)
; Parameter(s).....: $sMask Maske zum Bestimmen des Ausgabestrings
; N3 Ganzzahl min. 3 Stellen, Auffüllen mit Vornullen
; n3 Ganzzahl min. 3 Stellen, Auffüllen mit Leerzeichen
; N3.2 Float min. 3 Vorkommastellen (Auffüllen mit Vornullen), min. 2 Nachkommastellen (Ergänzen mit Nullen)
; n.3 Float, Vorkommastellen wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
; $sString der zu formatierende Zahlenwert
; Note.............: Bei negativen Zahlenwerten wird das Vorzeichen mit zur Anzahl der Vorkomma/Stellen eingerechnet
; Return Value(s)..: der formatierte Zahlenwert
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _FormatNumber($sMask, $sString)
Local $aFill[2] = [' ','0000000000000000000'], $sLen
Local $preZero = StringIsUpper(StringLeft($sMask, 1)), $fFloat = 0, $fNegative = 0
If $sString < 0 Then $fNegative = 1
Local $aVal = StringSplit($sString, '.', 2)
If @error Then
ReDim $aVal[2]
Else
$fFloat = 1
EndIf
$sMask = StringTrimLeft($sMask, 1)
$sMask = StringSplit($sMask, '.', 2)
$sLen = StringLen($aVal[0])
If UBound($sMask) = 1 Then
If $sLen >= $sMask[0] Then
If $fFloat Then Return Round($sString)
Return $sString
Else
If $fFloat Then $sString = Round($sString)
If $fNegative Then Return '-' & StringReplace(StringLeft($aFill[$preZero], $sMask[0] - $sLen) & $sString, '-', '', 1)
Return StringLeft($aFill[$preZero], $sMask[0] - $sLen) & $sString
EndIf
Else
If $preZero And ($sLen < $sMask[0]) Then $aVal[0] = StringLeft($aFill[1], $sMask[0] - $sLen) & $aVal[0]
If $fFloat Then
$aVal[1] = Round('0.' & $aVal[1], $sMask[1])
$aVal[1] &= StringLeft($aFill[1], $sMask[1] - (StringLen($aVal[1]) -2))
If $fNegative Then Return '-' & StringReplace($aVal[0] & '.' & StringTrimLeft($aVal[1], 2), '-', '', 1)
Return $aVal[0] & '.' & StringTrimLeft($aVal[1], 2)
Else
If $fNegative Then Return '-' & StringReplace($aVal[0] & '.' & StringLeft($aFill[1], $sMask[1]), '-', '', 1)
Return $aVal[0] & '.' & StringLeft($aFill[1], $sMask[1])
EndIf
EndIf
EndFunc ;==>_FormatNumber
Wenn du in der Schleife einen festen Endwert (Ubound) definierst, kannst du sie nicht mehr dynamisch ändern.
Du mußt die Ubound-Prüfung in den Schleifenkopf setzen - dann wird bei jedem Durchlauf geprüft und somit kannst du innerhalb der Schleife das Array verkleinern/vergrößern und trotzdem alle Elemente durchlaufen.
so z.B.
For $i = 0 To UBound($Array) -1
[/autoit]Btw: Umlaute in Variablennamen sind nicht möglich. ![]()
Ah, da fehlt wohl noch das: #include <WindowsConstants.au3>
Installiere dir mal gleich die OrganizeIncludes von Xeno (Link links neben der ShoutBox), damit geht das Includieren schön automatisch.
Was passiert mit $WM_COMMAND?
Nun, das ist eine Windows-Nachricht, die ausgewertet wird. Dazu wird sie zuerst mit GUIRegisterMsg für die GUI registriert und verweist hier auf die Auswertefunktion "WM_COMMAND".
In dieser Funktion wird abgefragt von welchem Input die Nachricht $EN_CHANGE (Änderung des Inhalts) gesendet wird. Da 7 Inputs ausgewertet werden habe ich diese in ein Array gepackt - bzw. die Handle der Inputs, da diese in der Funktion verwendet werden - und prüfe in einer Schleife von welchem Input die Änderung kommt, lese den neuen Inhalt und schreibe ihn in die zweite Spalte des Arrays. Anschließend wird die Rechenfunktion aufgerufen, die mit den im Array gespeicherten Werten das Ergebnis erstellt und sofort anzeigt.
Das passiert bei jeder Änderung und somit hast du eine "automatische" Berechnung.
Versuche es mal für die anderen Berechnungen nachzuvollziehen, sieht schwerer aus, als es ist.
Beste Lösung: Ich bin restriktiv!
- Kenn ich einen Mailabsender nicht, wird die Mail ungelesen gelöscht. Wobei die Vorarbeit schon mein Provider macht und den meisten Müll in den Spambereich verschiebt. Da bekomm ich täglich eine Mail mit den Spam-Headern, kurzer Blick drauf, ob sich was drauf verirrt hat und erledigt. Somit ist mein Mailfach weitestgehend leer. ![]()
So erhältst du alle gemounteten Laufwerke:
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"
$Output=""
$Output = $Output & "Computer: " & $strComputer & @CRLF
$Output = $Output & "==========================================" & @CRLF
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
Local $aOut[1][2]
For $objItem In $colItems
If $aOut[UBound($aOut)-1][0] <> '' Then ReDim $aOut[UBound($aOut)+1][2]
$aOut[UBound($aOut)-1][0] = $objItem.DeviceID
$aOut[UBound($aOut)-1][1] = $objItem.Description
Next
Else
Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_LogicalDisk" )
Endif
_ArrayDisplay($aOut )
Hi,
ein nettes Gimmick ist immer, wenn die Berechnung "von allein" erfolgt. Das heißt, bereits während der Eingabe werden die Ergebnisse berechnet und ausgegeben.
Ich hab dir das mal für die erste Berechnung (Ware) erstellt. Kannst dich ja dann dran versuchen, dass auch für die anderen Berechnungen zu komplettieren. ![]()
Btw: Du meinst doch sicher Marge, oder?
#include <GUIConstants.au3>
#include <EditConstants.au3>
#Region ### START Koda GUI section ### Form=c:\program files (x86)\autoit3\koda\forms\rechner.kxf
$Form1_1 = GUICreate("Angebotsrechner", 658, 625, 237, 137)
$Group1 = GUICtrlCreateGroup("Wareneinkauf", 8, 16, 537, 161)
$HEK = GUICtrlCreateLabel("Händler EK", 40, 48, 58, 17)
$VERSI = GUICtrlCreateLabel("Versicherung", 296, 48, 66, 17)
$UMW = GUICtrlCreateLabel("Umweltpauschale", 40, 80, 88, 17)
$VERSA = GUICtrlCreateLabel("Versandkosten", 296, 80, 75, 17)
$SK = GUICtrlCreateLabel("Sonstige Kosten", 40, 112, 81, 17)
$MWST = GUICtrlCreateLabel("MwSt. %", 296, 112, 45, 17)
$MAGE = GUICtrlCreateLabel("Mage %", 40, 144, 42, 17)
$VK = GUICtrlCreateLabel("Verkaufspreis", 296, 144, 68, 17)
$HEK_IN = GUICtrlCreateInput("", 192, 48, 65, 21)
$UMW_IN = GUICtrlCreateInput("", 192, 80, 65, 21)
$SK_IN = GUICtrlCreateInput("", 192, 112, 65, 21)
$MAGE_IN = GUICtrlCreateInput("", 192, 144, 65, 21)
$VERSI_IN = GUICtrlCreateInput("", 448, 48, 65, 21)
$VERSA_IN = GUICtrlCreateInput("", 448, 80, 65, 21)
$VK_OUT = GUICtrlCreateLabel("€", 448, 144, 66, 17)
$MWST_IN = GUICtrlCreateInput("", 448, 112, 65, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Stundenansatz", 8, 192, 537, 129)
$SS_P = GUICtrlCreateLabel("Stundensatz Privatkunde", 40, 224, 123, 17)
$SS_G = GUICtrlCreateLabel("Stundensatz Geschäftskunde", 40, 256, 144, 17)
$GES_H_GEPL = GUICtrlCreateLabel("Geplante Gesamtstundenzahl", 296, 224, 143, 17)
$SUMME_H = GUICtrlCreateLabel("Summe Stunden", 40, 288, 82, 17)
$SS_P_IN = GUICtrlCreateInput("", 192, 224, 65, 21)
$SS_GK_IN = GUICtrlCreateInput("", 192, 256, 65, 21)
$S_GE = GUICtrlCreateInput("", 448, 224, 65, 21)
$STUNDENSUMME = GUICtrlCreateLabel("€", 448, 288, 66, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Anfahrtskosten", 8, 336, 537, 129)
$Label11 = GUICtrlCreateLabel("Kilometerpauschale", 40, 368, 96, 17)
$Label12 = GUICtrlCreateLabel("Anfahrtskilometer", 40, 400, 85, 17)
$GEP_ANZ_ANF = GUICtrlCreateLabel("Geplante Anzahl Anfahrten", 296, 368, 131, 17)
$Label14 = GUICtrlCreateLabel("Summe Anfahrten / Kilometer", 40, 432, 142, 17)
$KILO_P = GUICtrlCreateInput("", 192, 368, 65, 21)
$KILO_AN = GUICtrlCreateInput("", 192, 400, 65, 21)
$ANZ_FAHR = GUICtrlCreateInput("", 448, 368, 65, 21)
$H_Gesamt = GUICtrlCreateLabel("€", 448, 432, 66, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$UEBERN_WARE = GUICtrlCreateButton("Übernahme", 562, 136, 75, 25, 0)
;~ $ERRECHNEN_WARE = GUICtrlCreateButton("Errechnen", 562, 88, 75, 25, 0)
$LEEREN_WARE = GUICtrlCreateButton("Leeren", 562, 40, 75, 25, 0)
$UEBERNAHME_STUNDEN = GUICtrlCreateButton("Übernahme", 562, 286, 75, 25, 0)
$ERRECHNEN_STUNDEN = GUICtrlCreateButton("Errechnen", 562, 246, 75, 25, 0)
$LEEREN_STUNDEN = GUICtrlCreateButton("Leeren", 562, 206, 75, 25, 0)
$UEBERNAHME_ANFAHRT = GUICtrlCreateButton("Übernahme", 562, 434, 75, 25, 0)
$ERRECHNEN_ANFAHRT = GUICtrlCreateButton("Errechnen", 562, 394, 75, 25, 0)
$LEEREN_ANFAHRT = GUICtrlCreateButton("Leeren", 562, 354, 75, 25, 0)
$Group4 = GUICtrlCreateGroup("Gesamtkostenaufstellung", 8, 480, 537, 129)
$Label5 = GUICtrlCreateLabel("Ware", 40, 512, 30, 17)
$Label6 = GUICtrlCreateLabel("Stunden", 40, 544, 44, 17)
$Label7 = GUICtrlCreateLabel("Anfahrten", 40, 576, 50, 17)
$Label8 = GUICtrlCreateLabel("Gesamtkosten", 296, 512, 72, 17)
$GES_KOSTEN_OUT = GUICtrlCreateLabel("€", 448, 512, 66, 17)
$WARE_OUT = GUICtrlCreateLabel("€", 192, 512, 74, 17)
$STUNDEN_OUT = GUICtrlCreateLabel("€", 192, 544, 74, 17)
$ANFAHRTEN_OUT = GUICtrlCreateLabel("€", 192, 576, 74, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$ERRECHNEN_GESAMT = GUICtrlCreateButton("Errechnen", 562, 530, 75, 25, 0)
Global $aWARE[8][2] = [[0], _
[GUICtrlGetHandle($HEK_IN)],[GUICtrlGetHandle($UMW_IN)],[GUICtrlGetHandle($SK_IN)],[GUICtrlGetHandle($MAGE_IN)], _
[GUICtrlGetHandle($VERSI_IN)],[GUICtrlGetHandle($VERSA_IN)],[GUICtrlGetHandle($MWST_IN)]]
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
[/autoit] [autoit][/autoit] [autoit]#EndRegion ### END Koda GUI section ###
Global $Var_WARE
Global $Var_STUNDEN
Global $Var_KM
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $UEBERN_WARE
GUICtrlSetData($WARE_OUT, $aWARE[0][0] & ' €')
Case $ERRECHNEN_STUNDEN
If GUICtrlRead($SS_P_IN) <> '' ANd GUICtrlRead($SS_GK_IN) <> '' Then
MsgBox(0, '', 'Bist Du verwirrt?')
GUICtrlSetData($SS_GK_IN, '')
GUICtrlSetData($SS_P_IN, '')
ContinueCase
EndIf
If GUICtrlRead($SS_GK_IN) <> '' Then GUICtrlSetData($STUNDENSUMME, GUICtrlRead($SS_GK_IN)* GUICtrlRead($S_GE) & ' €')
If GUICtrlRead($SS_P_IN) <> '' Then GUICtrlSetData($STUNDENSUMME, GUICtrlRead($SS_P_IN)* GUICtrlRead($S_GE) & ' €')
Case $UEBERNAHME_STUNDEN
If GUICtrlRead($SS_P_IN) <> '' ANd GUICtrlRead($SS_GK_IN) <> '' Then
MsgBox(0, '', 'Bist Du verwirrt?')
GUICtrlSetData($SS_GK_IN, '')
GUICtrlSetData($SS_P_IN, '')
ContinueCase
EndIf
If GUICtrlRead($SS_GK_IN) <> '' Then GUICtrlSetData($STUNDEN_OUT, GUICtrlRead($SS_GK_IN)* GUICtrlRead($S_GE) & ' €')
If GUICtrlRead($SS_P_IN) <> '' Then GUICtrlSetData($STUNDEN_OUT, GUICtrlRead($SS_P_IN)* GUICtrlRead($S_GE) & ' €')
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $iCode
Case $EN_CHANGE
For $i = 1 To 7
If $hWndFrom = $aWARE[$i][0] Then $aWARE[$i][1] = StringStripWS(GUICtrlRead($iIDFrom), ![]()
Next
GUICtrlSetData($VK_OUT, _CalculateWare() & ' €')
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func _CalculateWare()
Local $a = $aWARE[1][1] + $aWARE[2][1] + $aWARE[3][1] + $aWARE[5][1] + $aWARE[6][1]
Local $b = $a / 100 * $aWARE[4][1]
Local $c = $a / 100 * $aWARE[7][1]
$aWARE[0][0] = $a + $b + $c
Return $aWARE[0][0]
EndFunc
Aus dem Skript-Bsp. habe ich jetzt eine UDF erstellt. s. Post #1
Aber.. noch ein kleines Problem:
Ohne erkennbaren Grund friert manchmal beim Schließen von registrierten Fenstern oder beim Fokuswechsel zwischen diesen das Skript ein. Ich konnte bisher die Ursache nicht ausmachen - vielleicht hat jemand von euch den zündenden Gedanken.
Mal ganz ketzerisch: Muß ja was faul sein, wenn der Index-Dienst euer System lahm legt. Das Herumdoktorn an den Symptomen hilft zwar temporär, ist aber auch nicht optimal. Deaktiviere doch den Indexdienst. Dann teste, ob du überhaupt merkst, dass er nicht läuft. Bisher war dieser Dienst eher eine Bremse als ein Vorteil.
Die Motivation das Werk dann auch zu verwalten, war für mich der Anlaß einen Thread mit Links zu meinen Werken zu erstellen. Hat den Vorteil, dass ich auch schnell selbst meine Skripte finde. Und das ist ausreichend Motivation. ![]()
Eine zentrale Verwaltung, sicher schön - aber ich glaub nicht wirklich dran, dass das gepflegt wird.
Aktualisiert, sortiert und besser lesbar formatiert. s. Post #1
Also ich habe mir das Skript nicht angesehen (Mache ich nie, wenn ich dazu erst was herunterladen muss! - Wozu kann man Code hier im Spoiler darstellen?!), aber der mehr als wagen Erklärung nach vermute ich Folgendes:
Jede zur Exe kompilierte au3 besteht aus Interpreter+Code. Um nicht in jeder Exe erneut den Interpreter einzubinden, wird er nur einmal verwendet und die Einzelskripte werden kaskadiert angehängt. Es werden also nicht, wie suggeriert, tatsächlich kleinere Exe'n erstellt, sondern die Exe'n werden als Einzeldatei nicht mehr ausführbar und müssen in der 'Sammlung mit Interpreter' integriert sein. Kein wirklicher Vorteil, wie ich meine.
Oder interpretiere ich das jetzt falsch?
Eine detaillierte Beschreibung von Funktionen ist immer noch der beste Weg um Irritationen zu vermeiden.
Und wenn 3 Leute "..äh Bahnhof?" schreien, kannst du sicher sein, dass es mit der Beschreibung nicht weit her ist.
Freut uns - und jetzt noch im ersten Post den Präfix auf "gelöst" setzen: Dann sind auch wir glücklich. ![]()