Noch ein Kandidat! Klasse!
Jetzt musst Du Dich aber ranhalten. Wir anderen haben ja schon einigen Vorsprung.
Allerdings ist bei mir das Ende auch schon erreicht. Finde einfach keine Optimierungsmöglichkeiten mehr.
Beiträge von Oscar
-
-
Damit kann man ja richtig kleine Geschichten schreiben (ist mir gerade passiert):
[autoit]
[/autoit]
Global $oNotebook = ObjGet('Notebook', 'Hardware')
If $oNotebook.DVD_Writer = 'Defekt' Then
$sPriceList = InetGet('Computer-Shop', 'Preisliste')
$sDVDWriter = StringInStr($sPriceList, 'DVD-Brenner', 0)
_INetMail('computer-shop', 'Bestellung', $sDVDWriter & $sMyAdress)
ProcessWait('Bestellung eingetroffen', 3*24*60*60*1000)
Global $oCar = ObjGet('Street', 'My Car')
$oCar.DriveTo('Computer-Shop')
ControlSend('Computer-Shop-Kasse', 'Preis', Default)
$oCar.DriveTo('Home')
$oNotebook.Remove('Defekter DVD-Brenner')
$oNotebook.Add('Neuer DVD-Brenner')
$rc = CDTray('D:', 'open')
If $rc = 'ERROR' Then
_INetMail('Computer-Shop', 'Grrr...*#$*§!', '')
$oNotebook.Remove('Neuer, defekter DVD-Brenner')
$oCar.DriveTo('Computer-Shop')
ControlSend('Computer-Shop', 'Reklamation')
ControlGetText('Computer-Shop', 'Nicht vorrätig! Bestellen!')
$oCar.DriveTo('Home')
ProcessWait('Bestellung eingetroffen', 3*24*60*60*1000)
$oCar.DriveTo('Computer-Shop')
ControlSend('Computer-Shop', 'Umtausch')
$oCar.DriveTo('Home')
$oNotebook.Add('Neuer DVD-Brenner')
$rc = CDTray('D:', 'open')
If $rc = 'Ok' Then MsgBox(0, 'Notebook wieder in Ordnung', 'Hurra!')
EndIf
EndIf -
Während des drückens wird die Funktion __Progress() mehrfach aufgerufen. Ohne die Variable kommt es darauf an, wie lange Du die ESC-Taste drückst bzw. den Button anklickst. Machst Du das nur ganz kurz oder ist der Rechner nicht schnell genug, so wird nur ein Kopiervorgang abgebrochen.
-
Naja, auch alte Hasen brauchen manchmal einen Schubs...

$bStop wird gebraucht, weil sonst nur der gerade laufende Kopiervorgang (1 Datei) abgebrochen wird. Die Variable sorgt dafür, dass alle Kopiervorgänge abgebrochen werden.
-
Bei Deiner Änderung kann man aber erst nach einer Datei abbrechen, weil der Button vorher keinen Event auslöst.
Aber Du hast mich auf eine Idee gebracht, die sogar funktioniert (siehe Post #1).
Jetzt kann man die Funktion mit der [ESC]-Taste oder mit Mausklick auf [Abbrechen] abbrechen. Das reicht mir völlig. Vielen Dank!
-
Hmm...aber wie kriege ich die Routine dazu, den Kopiervorgang abzubrechen?

-
Ich brauchte gerade eine Kopierfunktion für mehrere Dateien und Tom99 hatte in "Hilfe & Unterstützung" eine Copy-Funktion mit DllCallback gepostet. Da habe ich die mal etwas ausgebaut:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;===werden benötigt=============================================================
#include<String.au3>
#include<Misc.au3>
Global $strFiles = '', $strSize = 0
;===============================================================================;===Beispiel 1 (erstellen der Datei "!copydata.mfc" im Quellverzeichnis)========
[/autoit] [autoit][/autoit] [autoit]
Global $sSourcePath = 'C:\Programme\AutoIt3\Examples\'Global $aReturn = _MultiFileCopy($sSourcePath)
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, 'MFC', '"!copydata.mfc" wurde erstellt!')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;===============================================================================;===Beispiel 2 (komplettes Verzeichnis kopieren)================================
[/autoit] [autoit][/autoit] [autoit]
; Alle Dateien und Unterverzeichnisse (rekursiv) werden kopiert
; Verzeichnisstruktur der Quelle wird übernommen
Global $sSourcePath = 'C:\Programme\AutoIt3\Examples\'
Global $sDestinationPath = @ScriptDir & '\Tmp1'; Zielpfad (wird ggf. erstellt)Global $aReturn = _MultiFileCopy($sSourcePath, $sDestinationPath, False)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;===============================================================================;===Beispiel 3 (mehrere Dateien kopieren)=======================================
[/autoit] [autoit][/autoit] [autoit]
; 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)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;===============================================================================;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; 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<String.au3>
; #include<Misc.au3>
; 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 $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]
FileWriteLine($hFile, $aSource[$i])
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 ;==>_MultiFileCopyFunc __Progress($FileSize, $BytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
[/autoit] [autoit][/autoit] [autoit]
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 ;==>__ProgressFunc __ProgressCreate(ByRef $aMFC)
[/autoit] [autoit][/autoit] [autoit]
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;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; 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
EndFuncFunc _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
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
EndFuncScreenShot:
IOM302_fix.zip- Die Funktion kann auch ein ganzes Verzeichnis (rekursiv) kopieren, wenn als Quelle kein Array, sondern ein Verzeichnispfad angegeben wird.
- Es wird dann die Verzeichnisstruktur des Übergabepfades übernommen und im Zielpfad erstellt!
- Beim kopieren einzelner Dateien muss im Übergabe-Array (für die zu kopierenden Dateien) der erste Eintrag die Anzahl der Dateien beinhalten!
- Der Zielpfad wird erstellt, wenn er nicht existiert!
- Abbruch per [ESC]-Taste oder über den [Abbrechen]-Button!
- Wird der dritte Parameter auf "False" gesetzt werden evtl. vorhandene Dateien nicht überschrieben. Die neuen Dateien bekommen dann einen PreFix vorangestellt, den man als 4. Parameter angeben kann.
- Die Funktion gibt ein Array mit den kopierten Dateien zurück.Im Script befinden sich drei Beispiele, die den Aufruf verdeutlichen sollen.
Zum rekursiven einlesen des Quellverzeichnisses benutze ich (mal wieder) die Funktion _GetFilesFolder_Rekursiv() von BugFix.

Neue Version ( 26.01.09 )
Weil das einlesen der Verzeichnisstruktur u.U. so lange dauern kann, habe ich MultiFileCopy (MFC) dahingehend geändert, dass man vorab (einmalig) diese Daten einlesen kann (siehe Beispiel). Dazu muss man die Funktion nur mit dem Quellverzeichnis (ohne weitere Parameter) aufrufen. Die Daten werden dann in einer Datei "!copydata.mfc" im Quellverzeichnis abgelegt. Will man später dieses Verzeichnis mit MultiFileCopy irgendwohin kopieren, so sieht MFC nach, ob sich im Quellverzeichnis eine solche Datei befindet und liest die Daten aus dieser Datei, statt das Verzeichnis zeitaufwendig neu einzulesen.
Achtung! Wenn sich die Dateien und/oder die Ordnerstruktur geändert haben, so muss man die Datei "!copydata.mfc" neu erstellen lassen, ansonsten würde MFC die "alten" Daten benutzen. -
@Tom99: Gibt es eine Möglichkeit den Kopiervorgang bei Deiner Routine abzubrechen?
Ich brauche nämlich auch gerade eine Multifile-Kopierfunktion und bin grad dabei, diese zu erstellen. Allerdings brauche ich die Möglichkeit, den Kopiervorgang abbrechen zu können.
Edit: siehe _MultiFileCopy in "Scripte"
-
Nein! Bitte nicht mit den Fingern den Stromverbrauch "messen"!
Mal eine kleine Einführung in die Materie:
Die elektrische Leistung wird in Watt gemessen und errechnet sich aus der Höhe der Spannung (Steckdose = 230 Volt) und dem fließenden Strom (abhängig vom Gerät). Wenn nun die elektrische Leistung sinkt, dann bedeutet das lediglich, dass das Gerät weniger Strom "verbraucht". Die anliegende Spannung beträgt aber weiterhin 230 Volt.
Wenn Du nun mit den Fingern an eine der Leitungen fassen würdest (sollte bei einem intakten Gerät nicht so ohne weiteres möglich sein), würde ein Strom durch Deinen Körper fließen. Die Höhe dieses Stroms hängt von mehreren Faktoren ab:
- Höhe der Spannung
- Übergangswiderstand "Leitung <-> Finger"
- elektrischen Widerstand Deines Körpers
- und dem Übergangswiderstand "Körper <-> Erde"
Man kann also nie so genau vorhersagen, wie groß der Strom sein wird, wenn Du solch eine Leitung anfassen würdest. Aber ab einem Stromfluß von ca. 30mA wird es für einen Menschen gefährlich (Herzkammerflimmern/Herzstillstand). -
Turbolocke: Mein Monitor schaltet bei dem Script in den Standby-Modus (<1Watt). Ich weiß aber nicht, ob das überall so ist.
-
Eine Funktion, die den Monitor aus-/einschalten kann, findet man in der Hilfe zu den UDFs:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <SendMessage.au3>_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit] [autoit][/autoit] [autoit]
Local Const $Off = 2, $On = -1Opt("WinTitleMatchMode", 4)
[/autoit] [autoit][/autoit] [autoit]
$hwnd = WinGetHandle('classname=Progman')
_ToggleMonitor($hWnd, $Off)
Sleep ( 3000 )
_ToggleMonitor($hWnd, $On)
EndFuncFunc _ToggleMonitor($hwnd, $OnOff)
[/autoit]
Local Const $WM_SYSCOMMAND = 274
Local Const $SC_MONITORPOWER = 61808
_SendMessage($hWnd, $WM_SYSCOMMAND, $SC_MONITORPOWER, $OnOff)
If @error Then
MsgBox(0,"_ToggleMonitor", "_SendMessage Error: " & @error)
Exit
EndIf
EndFunc -
Ich habe das Script noch etwas verbessert, so dass man Input5 und 6 besser eingeben kann, bevor es auf drei Nachkommastellen gebracht wird:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include<GUIConstantsEx.au3>
#include<WinAPI.au3>
#include<WindowsConstants.au3>#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Form1", 416, 376, 193, 125)
$Label1 = GUICtrlCreateLabel("1. Menge", 328, 16, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input1 = GUICtrlCreateInput("", 8, 16, 313, 21)
$Label2 = GUICtrlCreateLabel("2. Menge", 328, 48, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input2 = GUICtrlCreateInput("", 8, 48, 313, 21)
$Label3 = GUICtrlCreateLabel("1. * 2. Menge", 328, 88, 68, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Input3 = GUICtrlCreateInput("", 8, 88, 313, 21)
$Label4 = GUICtrlCreateLabel("P1", 328, 120, 17, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Input4 = GUICtrlCreateInput("", 8, 120, 313, 21)
$Label5 = GUICtrlCreateLabel("P1 = 2.00 % bis 5.00 %", 112, 152, 134, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input5 = GUICtrlCreateInput("", 8, 152, 89, 21)
$Label6 = GUICtrlCreateLabel("Wert zwischen 0.55 und 3.60", 112, 184, 170, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input6 = GUICtrlCreateInput("", 8, 184, 89, 21)
$Label8 = GUICtrlCreateLabel("-----------------------------------------------------------------------------------------------------------------------------------", 0, 216, 397, 17)
$Label9 = GUICtrlCreateLabel("Input 1 = Hier erfolg eine Eingabe", 8, 240, 162, 17)
GUICtrlSetColor(-1, 0xFF0000)
$Label10 = GUICtrlCreateLabel("Input 2 = Hier erfolgt auch eine Eingabe", 8, 256, 192, 17)
GUICtrlSetColor(-1, 0xFF0000)
$Label11 = GUICtrlCreateLabel("Input 3 = Berechnung: Input 1 * Input 2", 8, 272, 189, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label12 = GUICtrlCreateLabel("Input 4 = Berechnung: Input 3 / 100 * Input 5 + Input 6", 8, 288, 263, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label7 = GUICtrlCreateLabel("Input 5 und Input 6 sind veränderbar, aber nur direkt nach dem starten. ", 8, 328, 341, 17)
$Label13 = GUICtrlCreateLabel("Input 1 und Input 2 ändern sich während damit gearbeitet wird.", 8, 344, 299, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
Global $Timer1, $Timer2, $Change1 = False, $Change2 = False
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If (TimerDiff($Timer1) > 1000) And ($Change1 = True) Then
$Change1 = False
GUICtrlSetData($Input5, StringFormat('%.3f', GUICtrlRead($Input5)))
GUICtrlSetState($Input5, $GUI_FOCUS)
EndIf
If (TimerDiff($Timer2) > 1000) And ($Change2 = True) Then
$Change2 = False
GUICtrlSetData($Input6, StringFormat('%.3f', GUICtrlRead($Input6)))
GUICtrlSetState($Input6, $GUI_FOCUS)
EndIf
WEndFunc MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
[/autoit]
Local $controlID = _WinAPI_LoWord($wParam)
Switch $controlID
Case $Input1, $Input2
$Change1 = False
$Change2 = False
GUICtrlSetData($Input3, GUICtrlRead($Input1) * GUICtrlRead($Input2))
GUICtrlSetData($Input4, StringFormat('%.3f', GUICtrlRead($Input3) / 100 * GUICtrlRead($Input5) + GUICtrlRead($Input6)))
Case $Input5
$Change1 = True
$Change2 = False
$Timer1 = TimerInit()
Case $Input6
$Change1 = False
$Change2 = True
$Timer2 = TimerInit()
EndSwitch
EndFunc ;==>MY_WM_COMMAND -
Du mußt das transparente Label disablen, dann sind alle anderen GUI-Elemente weiterhin nutzbar.
Geändertes Beispiel aus der Hilfe:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
Local $file, $btn, $msg
GUICreate(" My GUI input acceptfile", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
$file = GUICtrlCreateLabel("", 0, 0, 320, 120)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlCreateInput("", 10, 35, 300, 20) ; will not accept drag&drop files
$btn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)GUISetState()
[/autoit] [autoit][/autoit] [autoit]$msg = 0
[/autoit] [autoit][/autoit] [autoit]
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $btn
ExitLoop
Case $msg = $GUI_EVENT_DROPPED
MsgBox(0,0,@GUI_DRAGFILE)
EndSelect
WEndMsgBox(4096, "drag drop file", GUICtrlRead($file))
[/autoit]
EndFunc ;==>Example -
Erstelle einfach ein transparentes Label in der Größe der GUI. Oder habe ich das falsch verstanden?
-
Ist es das, was Du willst?
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include<GUIConstantsEx.au3>
#include<WinAPI.au3>
#include<WindowsConstants.au3>#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Form1", 416, 376, 193, 125)
$Label1 = GUICtrlCreateLabel("1. Menge", 328, 16, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input1 = GUICtrlCreateInput("", 8, 16, 313, 21)
$Label2 = GUICtrlCreateLabel("2. Menge", 328, 48, 57, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input2 = GUICtrlCreateInput("", 8, 48, 313, 21)
$Label3 = GUICtrlCreateLabel("1. * 2. Menge", 328, 88, 68, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Input3 = GUICtrlCreateInput("", 8, 88, 313, 21)
$Label4 = GUICtrlCreateLabel("P1", 328, 120, 17, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Input4 = GUICtrlCreateInput("", 8, 120, 313, 21)
$Label5 = GUICtrlCreateLabel("P1 = 2.00 % bis 5.00 %", 112, 152, 134, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input5 = GUICtrlCreateInput("", 8, 152, 89, 21)
$Label6 = GUICtrlCreateLabel("Wert zwischen 0.55 und 3.60", 112, 184, 170, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Input6 = GUICtrlCreateInput("", 8, 184, 89, 21)
$Label8 = GUICtrlCreateLabel("-----------------------------------------------------------------------------------------------------------------------------------", 0, 216, 397, 17)
$Label9 = GUICtrlCreateLabel("Input 1 = Hier erfolg eine Eingabe", 8, 240, 162, 17)
GUICtrlSetColor(-1, 0xFF0000)
$Label10 = GUICtrlCreateLabel("Input 2 = Hier erfolgt auch eine Eingabe", 8, 256, 192, 17)
GUICtrlSetColor(-1, 0xFF0000)
$Label11 = GUICtrlCreateLabel("Input 3 = Berechnung: Input 1 * Input 2", 8, 272, 189, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label12 = GUICtrlCreateLabel("Input 4 = Berechnung: Input 3 / 100 * Input 5 + Input 6", 8, 288, 263, 17)
GUICtrlSetColor(-1, 0x0000FF)
$Label7 = GUICtrlCreateLabel("Input 5 und Input 6 sind veränderbar, aber nur direkt nach dem starten. ", 8, 328, 341, 17)
$Label13 = GUICtrlCreateLabel("Input 1 und Input 2 ändern sich während damit gearbeitet wird.", 8, 344, 299, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
[/autoit]
Local $controlID = _WinAPI_LoWord($wParam)
Switch $controlID
Case $Input1, $Input2
GUICtrlSetData($Input3, GUICtrlRead($Input1) * GUICtrlRead($Input2))
GUICtrlSetData($Input4, StringFormat('%.3f', GUICtrlRead($Input3) / 100 * GUICtrlRead($Input5) + GUICtrlRead($Input6)))
Case $Input5, $Input6
GUICtrlSetData($Input5, StringFormat('%.3f', GUICtrlRead($Input5)))
GUICtrlSetData($Input6, StringFormat('%.3f', GUICtrlRead($Input6)))
EndSwitch
EndFunc ;==>MY_WM_COMMAND -
Hallo Alina!
Was genau meinst Du denn mit "Fehler"?
In den Zeilen 16-18 schreibst Du drei verschiedene Werte nach $input4, die jeweils den vorherigen überschreiben ohne einen Bezug zu den vorherigen zu haben. Deshalb ist das so ziemlich sinnlos.
Außerdem wäre es hilfreich zu wissen, um was für GUI-Elemente es sich bei $h, $p1 und $p2 handelt.
Eine Division durch Null (bzw. ein leeres Inputfeld) ergibt immer "1.#INF". Sowas müßte man ggf. abfangen.Achja, und wenn Du die Berechnung doch erst nach Klick auf "Berechnen" durchführst, dann kann das mit $1oldData weg. Das sollte nur dazu dienen, das Flackern der Anzeige zu verhindern.
-
Das sieht ganz so aus, als wolltest Du sowas machen: WiFaRi

-
Ich steuere mal noch eine StringRegExpReplace-Version und einen Geschwindigkeitstest bei:
[autoit]
[/autoit][autoit][/autoit][autoit]
$t = TimerInit()
$str = "|!TET13060NAU00!"
$str = Stringleft($str, 2) & StringTrimLeft($str, 5)
MsgBox(0,0,$str & @CRLF & Round(TimerDiff($t), 4))$t = TimerInit()
[/autoit][autoit][/autoit][autoit]
$str = "|!TET13060NAU00!"
$str = StringRegExpReplace($str, '(\|!)(.{3})', '$1')
MsgBox(0,0,$str & @CRLF & Round(TimerDiff($t), 4))$t = TimerInit()
[/autoit]
$str = "|!TET13060NAU00!"
$str = StringLeft($str,2) & StringMid($str, 6)
MsgBox(0,0,$str & @CRLF & Round(TimerDiff($t), 4))Die Version von Tom99 ist dabei die Schnellste.
-
Das geht aber auch kürzer:
[autoit]
[/autoit]
Func _StringSplitCount(Const $S_TEXT, Const $I_COUNT)
Return StringRegExp($S_TEXT, '.{1,' & $I_COUNT & '}', 3)
EndFunc -
Vielleicht so:
Spoiler anzeigen
[autoit]
[/autoit]
Func _Absenden()
For $i = 0 To UBound($checkOff)-1
If BitAND(GUICtrlRead($checkOff[$i]), $GUI_CHECKED) Then
ShellExecuteWait($OfficePfad & '\' & $OfficeAufruf[$i+1])
If Not @error Then FileWriteLine(@ScriptDir & '\logfile.txt', $OfficeAufruf[$i+1])
EndIf
Next
For $i = 0 To UBound($checkEnt)-1
If BitAND(GUICtrlRead($checkEnt[$i]), $GUI_CHECKED) Then
ShellExecuteWait($EntwicklerPfad & '\' & $EntwickAufruf[$i+1])
If Not @error Then FileWriteLine(@ScriptDir & '\logfile.txt', $OfficeAufruf[$i+1])
EndIf
Next
For $i = 0 To UBound($checkSon)-1
If BitAND(GUICtrlRead($checkSon[$i]), $GUI_CHECKED) Then
ShellExecuteWait($SonstigePfad & '\' & $SonstigAufruf[$i+1])
If Not @error Then FileWriteLine(@ScriptDir & '\logfile.txt', $OfficeAufruf[$i+1])
EndIf
Next
;Exit
EndFunc ;==>_Absenden