Hi,
du hast die Einträge im Kontextmenü unter "Datei Öffnen" gemacht. Da dieser komplette Eintrag im Kontextmenü fehlt wenn du unterschiedliche Dateiformate auswählst, solltest du deine eigenen Einträge in einen anderen Bereich schreiben, wie es auch antivir macht.....
Beiträge von Andy
-
-
4x die gesuchte Funktion, teilweise mit speziellen "Goodies", such dir eine passende aus^^
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$pfad = @WindowsDir
;$pfad="j:\desktop"$begin1 = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$dateien1 = _ordner_rekursiv($pfad, 1)
$dif1 = TimerDiff($begin1)
ConsoleWrite("tweaky" & @TAB & Round($dif1 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien1) - 1 & @CRLF)$begin2 = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$dateien2 = _GetFilesFolder_Rekursiv($pfad, '*', 0)
$dif2 = TimerDiff($begin2)
ConsoleWrite("BugFix" & @TAB & Round($dif2 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien2) - 1 & @CRLF)$begin3 = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$dateien3 = _RecursiveFileListToArray($pfad, '', 1)
$dif3 = TimerDiff($begin3)
ConsoleWrite("Oscar" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF)$begin3 = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$dateien3 = _FileListToArrayEx($pfad, '*.*', 1)
$dif3 = TimerDiff($begin3)
ConsoleWrite("amiforum" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF);===============================================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
; einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (http://www.autoit.de)
; Anregungen von: bernd670 (http://www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
Local $hSearch, $sFile, $sReturn = ''
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Or $hSearch = -1 Then Return SetError(0, 0, $sReturn)
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
$sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <File.au3>;*******************************************************************************************************************************************************************************************************************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Funktion _ordner_rekursiv($udf_quellordner[, $udf_Ordner_Dateien[, $udf_unterordner=False[, $udf_spalte_datum [, $udf_dateityp = "*"[, $udf_auslassen = ""]]]]])
; Beschreibung ermittelt alle Dateien/Ordner des angegebenen Verzeichnisses
; Parameter $udf_quellordner: der zu durchsuchende Ordner (Angabe: einzelner Ordner als String oder mehrere Ordner im Array beginnend bei 1)
; optional $udf_Ordner_Dateien: 1 = Dateien auflisten (Standard) 2 = Ordner auflisten
; optional $udf_unterordner: True = Unterordner nicht miteinbeziehen (Standard) False = Unterordner nicht miteinbeziehen
; optional $udf_spalte_datum: True = Änderungsdatum der Datei ermitteln False = Änderungsdatum der Datei nicht ermitteln (Standard)
; optional $udf_dateityp: einzuschließende Dateitypen (mehrere Typen durch | trennen) "*" >>> alle (Standard)
; optional $udf_auslassen: Wörter, die im Pfad oder Dateinamen vorkommen, auslassen (mehrere durch | trennen) "" <<< Standard
; Rückgabewert Erfolg: Gibt ein Array mit 3 Spalten zurück (Dateiname, Dateipfad, Änderungsdatum)
; Fehler: 0 setzt @error
; @error = 1 mindestens 1 Pfad existiert nicht
; Autor Tweaky (http://www.autoit.de)
;*******************************************************************************************************************************************************************************************************************************************;********************************************
[/autoit] [autoit][/autoit] [autoit]
; Ordner rekursiv (Hauptfunktion) *
;********************************************Func _ordner_rekursiv($udf_quellordner, $udf_Ordner_Dateien = 1, $udf_unterordner = True, $udf_spalte_datum = False, $udf_dateityp = "*", $udf_auslassen = "")
[/autoit] [autoit][/autoit] [autoit]
Local $verzeichnisse_alle[1] ;Array für die Ordner
Local $array_alles[1000000][3] ;Array für die Ordner und Dateien
Local $szDrive, $szDir, $szFName, $szExtIf Not IsArray($udf_quellordner) Then
[/autoit] [autoit][/autoit] [autoit]
$udf_quellordner_tmp = $udf_quellordner
Dim $udf_quellordner[2]
$udf_quellordner[1] = $udf_quellordner_tmp
EndIfFor $i = 1 To UBound($udf_quellordner) - 1
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($udf_quellordner[$i]) Or Not StringInStr($udf_quellordner[$i], ":") Then
SetError(1)
Return 0
EndIfIf StringRight($udf_quellordner[$i], 1) <> "\" Then $udf_quellordner[$i] &= "\"
[/autoit] [autoit][/autoit] [autoit]$udf_quellordner_einzeln = $udf_quellordner[$i]
[/autoit] [autoit][/autoit] [autoit]If $udf_unterordner = True Then ;mit Unterordner
[/autoit] [autoit][/autoit] [autoit]
_ordner_rekursiv_mit_unterordner($udf_quellordner_einzeln, $verzeichnisse_alle)
_ArrayAdd($verzeichnisse_alle, $udf_quellordner_einzeln)
Else ;ohne Unterordner
$verzeichnisse_alle = $udf_quellordner
EndIf
NextIf IsArray($verzeichnisse_alle) Then $verzeichnisse_alle[0] = UBound($verzeichnisse_alle) - 1 ;In die erste Zeile die Anzahl der Dateien schreiben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If $udf_Ordner_Dateien = 1 Then ;Dateien auflisten
[/autoit] [autoit][/autoit] [autoit]
$zaehler_fortlaufend = 0If Not IsArray($verzeichnisse_alle) Then
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse_alle_tmp = $verzeichnisse_alle
Dim $verzeichnisse_alle[2]
$verzeichnisse_alle[1] = $verzeichnisse_alle_tmp
EndIfFor $u = 1 To UBound($verzeichnisse_alle) - 1
[/autoit] [autoit][/autoit] [autoit]
$array_alle_dateien = _FileListToArray($verzeichnisse_alle[$u], "*", 1)For $k = 1 To UBound($array_alle_dateien) - 1
[/autoit] [autoit][/autoit] [autoit]
$kriterien_ok = 0If $udf_dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
[/autoit] [autoit][/autoit] [autoit]
$kriterien_ok = 1ElseIf StringInStr($udf_dateityp, "|") Then ;Dateitypen angegeben
[/autoit] [autoit][/autoit] [autoit]
$dateityp_split = StringSplit($udf_dateityp, "|")
$udf_dateiendung_array = _PathSplit($array_alle_dateien[$k], $szDrive, $szDir, $szFName, $szExt)
$udf_dateiendung = $udf_dateiendung_array[4]
For $i = 1 To UBound($dateityp_split) - 1
If "." & $dateityp_split[$i] = StringRight($array_alle_dateien[$k], StringLen($udf_dateiendung)) Then
$kriterien_ok = 1
ExitLoop
EndIf
Next
EndIfIf $udf_auslassen <> "" Then ;Wörter in dem Pfad und Datei auslassen
[/autoit] [autoit][/autoit] [autoit]
$auslassen_split = StringSplit($udf_auslassen, "|")
For $i = 1 To UBound($auslassen_split) - 1
If StringInStr($array_alle_dateien[$k], $auslassen_split[$i]) Or StringInStr($verzeichnisse_alle[$u], $auslassen_split[$i]) Then
$kriterien_ok = 0
ExitLoop
EndIf
Next
EndIf;Papierkorb und System Volume Information wird nicht mitkopiert
[/autoit] [autoit][/autoit] [autoit]
If StringInStr($array_alle_dateien[$k], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLER') _
Or StringInStr($array_alle_dateien[$k], 'RECYCLED') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLED') _
Or StringInStr($array_alle_dateien[$k], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$u], 'System Volume Information') _
Or StringInStr($array_alle_dateien[$k], '$RECYCLE.BIN') Or StringInStr($verzeichnisse_alle[$u], '$RECYCLE.BIN') Then
$kriterien_ok = 0
ExitLoop
EndIf;wenn der Dateityp passt und die Datei bzw. der Ordner nicht ausgelassen werden soll
[/autoit] [autoit][/autoit] [autoit]
If $kriterien_ok = 1 Then
$zaehler_fortlaufend += 1
$array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$u]
$array_alles[$zaehler_fortlaufend][1] = $array_alle_dateien[$k]If $udf_spalte_datum = True Then
[/autoit] [autoit][/autoit] [autoit]
$time2 = FileGetTime($verzeichnisse_alle[$u] & "\" & $array_alle_dateien[$k], 0) ;"Datum geändert" auslesen
$array_alles[$zaehler_fortlaufend][2] = $time2[0] & $time2[1] & $time2[2] & $time2[3] & $time2[4] & $time2[5]
EndIfEndIf
[/autoit] [autoit][/autoit] [autoit]Next
[/autoit] [autoit][/autoit] [autoit]
NextElse ;Ordner auflisten
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To UBound($verzeichnisse_alle) - 1
$array_alles[$i][0] = $verzeichnisse_alle[$i]
$zaehler_fortlaufend = UBound($verzeichnisse_alle) - 1
Next
EndIf;Leere Zeilen am Ende löschen
[/autoit] [autoit][/autoit] [autoit]
ReDim $array_alles[$zaehler_fortlaufend + 1][3];In die erste Zeile die Anzahl der Dateien schreiben
[/autoit] [autoit][/autoit] [autoit]
If IsArray($array_alles) Then $array_alles[0][0] = UBound($array_alles) - 1$verzeichnisse_alle = 0
[/autoit] [autoit][/autoit] [autoit]Return $array_alles
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ordner_rekursiv;**************************************
[/autoit] [autoit][/autoit] [autoit]
; Unterordner durchsuchen *
;**************************************Func _ordner_rekursiv_mit_unterordner($udf_quellordner, ByRef $verzeichnisse_alle)
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse = _FileListToArray($udf_quellordner, "*", 2)For $i = 1 To UBound($verzeichnisse) - 1
[/autoit] [autoit][/autoit] [autoit]
$verzeichnisse[$i] = $udf_quellordner & $verzeichnisse[$i] & "\"
_ArrayAdd($verzeichnisse_alle, $verzeichnisse[$i])
_ordner_rekursiv_mit_unterordner($verzeichnisse[$i], $verzeichnisse_alle)
Next
EndFunc ;==>_ordner_rekursiv_mit_unterordner;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; 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] [autoit][/autoit] [autoit][/autoit] [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 _
$strFiles &= $file.Path & $Delim
Else
$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;~ $sSearchPath = 'h:' ; Pfad der durchsucht werden soll (rekursiv)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ $sSearchPattern = '*.zip' ; RegExp-Pattern
;~ $sSavePath = @ScriptDir & '\Doppelte.txt' ; Datei (inkl. Pfad), in der die doppelten gespeichert werden;~ ToolTip('Bitte warten! Verzeichnis wird eingelesen!', @DesktopWidth/2-100, 80, 'Double-Finder', 1, 7)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ Global $aFiles = _FileListToArrayEx($sSearchPath, $sSearchPattern)
;~ Global $sExists = '|', $sFilename = '', $sDouble = '', $iPos = 0
;~ ToolTip($aFiles[0] & ' Dateien gefunden' & @CRLF & 'Bitte warten! Doppelte werden gesucht!', @DesktopWidth/2-100, 100, 'Double-Finder', 1, 7)
;~ For $i = 1 To $aFiles[0]
;~ $sFilename = StringRegExpReplace($aFiles[$i], '.+\\(.+)', '$1')
;~ $iPos = StringInStr($sExists, '\' & $sFilename)
;~ If $iPos Then
;~ $iStart = StringInStr($sExists, '|', 0, -1, $iPos)
;~ $iEnd = StringInStr($sExists, '|', 0, 1, $iPos)
;~ $sDouble &= StringMid($sExists, $iStart, $iEnd - $iStart) & '|'
;~ $sDouble &= $aFiles[$i] & '|'
;~ EndIf
;~ $sExists &= $aFiles[$i] & '|'
;~ Next
;~ $hFile = FileOpen($sSavePath, 2)
;~ FileWrite($hFile, StringReplace($sDouble, '|', @CRLF))
;~ FileClose($hFile)
;~ ShellExecute('notepad.exe', $sSavePath)
;~ ToolTip('Fertig! Datei erstellt!', @DesktopWidth/2-100, 120, 'Double-Finder', 1, 7)
;~ Sleep(3000)
;~ ExitFunc _FileListToArrayEx($s_path, $s_mask, $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = True)
[/autoit] [autoit][/autoit] [autoit]If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)
[/autoit] [autoit][/autoit] [autoit]; Strip trailing backslash, and add one after to make sure there's only one
[/autoit] [autoit][/autoit] [autoit]
$s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & "\"; Set all defaults
[/autoit] [autoit][/autoit] [autoit]
If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""; Look for bad chars
[/autoit] [autoit][/autoit] [autoit]
If StringRegExp($s_mask, "[\\/:><\|]") Or StringRegExp($s_exclude, "[\\/:><\|]") Then
Return SetError(2, 2, 0)
EndIf; Strip leading spaces between semi colon delimiter
[/autoit] [autoit][/autoit] [autoit]
$s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";"); Confirm mask has something in it
[/autoit] [autoit][/autoit] [autoit]
If StringStripWS($s_mask,
= "" Then Return SetError(2, 2, 0)
If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0); Validate and create path + mask params
[/autoit] [autoit][/autoit] [autoit]
Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
For $i = 1 To $a_split[0]
If StringStripWS($a_split[$i],
= "" Then ContinueLoop
If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
$a_split[$i] &= "*" & $a_split[$i]
EndIf
$s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
Next
$s_hold_split = StringTrimRight($s_hold_split, 1)
If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
[/autoit] [autoit][/autoit] [autoit]
If $i_flag = 1 Then $s_dir_file_only = ":-d"
If $i_flag = 2 Then $s_dir_file_only = ":d"
If Not $f_recurse Then $s_recurse = ""Local $i_buffer, $t_input, $t_output, $s_hold_binary
[/autoit] [autoit][/autoit] [autoit]$i_pid = Run(@ComSpec & " /u /c dir /b " & _
[/autoit] [autoit][/autoit] [autoit]
$s_recurse & "/a" & $s_dir_file_only & " " & _
$s_hold_split, "", @SW_HIDE, 4 + 2); Collect data from std i/o stream
[/autoit] [autoit][/autoit] [autoit]
While 1
$s_stdout = StdoutRead($i_pid, False, True)
If @error Then ExitLoop
$i_buffer = BinaryLen($s_stdout)
$t_input = DllStructCreate("byte[" & $i_buffer & "]")
$t_output = DllStructCreate("char[" & $i_buffer & "]")DllStructSetData($t_input, 1, $s_stdout)
[/autoit] [autoit][/autoit] [autoit]
DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, "int", 0, "ptr", DllStructGetPtr($t_input), _
"int", $i_buffer / 2, "ptr", DllStructGetPtr($t_output), _
"int", $i_buffer, "int", 0, "int", 0)$s_hold_out &= StringRegExpReplace(DllStructGetData($t_output, 1), "(?i)(?:\A|\v)(?:(0+\v+)|(0+))|(\v*0+\z)", "")
[/autoit] [autoit][/autoit] [autoit]
$t_input = 0
$t_output = 0
WEnd; Replace any extending verticle spaces from the end of the string
[/autoit] [autoit][/autoit] [autoit]
$s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
If Not $s_hold_out Then Return SetError(5, 5, 0); Parse data and find matches based on flags
[/autoit] [autoit][/autoit] [autoit]
Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
$s_hold_out = ""If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")
[/autoit] [autoit][/autoit] [autoit]
Local $i_path_len = BinaryLen($s_path)For $i = 1 To $a_fsplit[0]
[/autoit] [autoit][/autoit] [autoit]
If $s_exclude And StringRegExp(StringRegExpReplace( _
$a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)" & $s_exclude) Then ContinueLoop
If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
If $f_full_path Then
$s_hold_ret &= $a_fsplit[$i] & Chr(1)
Else
$s_hold_ret &= StringTrimLeft($a_fsplit[$i], $i_path_len) & Chr(1)
EndIf
Next$s_hold_ret = StringTrimRight($s_hold_ret, 1)
[/autoit] [autoit][/autoit] [autoit]
If $s_hold_ret = "" Then Return SetError(6, 6, 0)Return StringSplit($s_hold_ret, Chr(1))
[/autoit]
EndFunc -
Hab auch mal was geschnitzt^^
Bei jedem An/Abpfiff der Halbzeit den Button drücken, bis zum Elfmeterschiessen
Die aktuelle Spielminute wird in der Titelleiste angezeigt, man kann den Rahmen zusammenschieben, bis nur noch die Spielminute angezeigt wird.Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Gui = GUICreate("Spielminute", 400, 80, 190, 120,$WS_SIZEBOX+$WS_MINIMIZEBOX)
$Button = GUICtrlCreateButton("Anpfiff 1. Halbzeit", 10, 10, 130, 30)
GUICtrlSetResizing($button, 544 + 2 + 256)
$label = GUICtrlCreateLabel("", 150, 15, 250, 20)
GUICtrlSetResizing($label, 544 + 2 + 256)
GUISetState(@SW_SHOW)Global $pfiff = 0, $t, $HZ = 1, $p = "Anpfiff", $gesamtzeit = 1 , $verlaengerung=""
[/autoit] [autoit][/autoit] [autoit]
;adlibregister("_spielzeit",1000) ;jede sekunde die aktuelle spielzeit anzeigen1While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button
_pfiff()
GUICtrlSetData($Button, $p & $HZ & ". Halbzeit"&$verlaengerung)
EndSwitch
WEndFunc _pfiff()
[/autoit] [autoit][/autoit] [autoit]
$pfiff += 1 ;1. Pfiff=Anpfiff 1. HZ, 2. Pfiff=Ende 1. HZ 3.Pfiff=anpfiff 2.HZ....bis zum elfmeterschiessen
$HZ = Int(($pfiff + 2) / 2) ;Halbzeit
if $HZ>2 then $verlaengerung=" (VL)" ;nach der 2. Halbzeit kommt die Verlängerung
If $HZ = 5 Then Exit ;nach der 2. Verlängerung ist Schluss....
If Mod($pfiff, 2) Then ;nur beim anpfiff der Halbzeit den Timer starten
$t = TimerInit() ;beim 1. 3. und 5. Pfiff timer starten
$p = "Abpfiff " ;Button beschriften
AdlibRegister("_spielzeit", 1000) ;jede sekunde die aktuelle spielzeit anzeigen1
Else
$gesamtzeit += Int((TimerDiff($t) / 1000) / 60) ;gesamte spielzeit in minuten
$p = "Anpfiff "
AdlibUnRegister("_spielzeit") ;zeit anhalten
EndIf
EndFunc ;==>_pfiffFunc _spielzeit()
[/autoit]
GUICtrlSetData($label, "Spielzeit: " & $gesamtzeit + Int((TimerDiff($t) / 1000) / 60) & " Minuten " & Int((TimerDiff($t) / 1000)) & " Sekunden der Halbzeit")
WinSetTitle($Gui, "", $gesamtzeit + Int((TimerDiff($t) / 1000) / 60) & ". laufende Spielminute"&$verlaengerung)
EndFunc ;==>_spielzeit -
-
Um das ganze zu beschleunigen, würde ich dazu raten, die Animation beim Fenstervergrößern/verkleinern auszustellen
ZitatAnimation der Fenster beim Minimieren/Maximieren ausstellen
Wenn Sie die Größe eines Fensters einer Anwendung minimieren oder maximieren, wird dieser Vorgang per Defaulteinstellung durch eine kleine Animation unnötig verzögert. Sie sehen, wie das Fenster sich vergrößert oder verkleinert. Durch Deaktivierung der Animationsfunktion wird unter HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics der Schlüssel MinAnimate von 1 auf 0 umgestellt. Die Auswirkung stellen Sie aber eventuell wie auch bei einigen anderen Registrykey-Änderungen erst nach der nächsten Anmeldung oder sogar erst nach dem nächsten Neustart fest. Anwendungsfenster werden dann ohne jede Verzögerung minimiert oder maximiert.
Spart sicherlich einiges an Zeit...
-
Zitat
Dann ist es aber meistens schon kompiliert und der Interpreter wirft etwas aus wie "Fehler in Zeile soundso".
soweit ich weiß, gibt der Interpreter bei einem compilierten Programm garkeine bzw -1 als fehlerhafte Zeile aus.
/EDIT/ in der Version 3.3.4.0 werden mir nicht nachvollziehbare Zahlen angezeigt an Stelle der Zeilennummer.
Das nützt dir somit auch nichts. Wenn du den Quellcode hast, dann kannst du auch (SciTe vorausgesetzt) mit CTRL+J direkt in die Funktionen der includierten Dateien hineinspringen, falls dort ein Fehler auftritt.
Weiterhin kann ich nur immer wieder dringend raten, Fehler im Compilat erst garnicht erst entstehen zu lassen sondern (und das ist so gut wie bei ALLEN AutoIt-Funktionen so) den @error-code abzufragen. Bei Objekten gibts einen Errorhandler uswusf.
[autoit]
Es gibt auch die Möglichkeit, im Code eine "sinnvolle" Ausgabe im Fehlerfall bei einem compilierten Script zu erzwingen. Beispielsweise: "Fehler im Modul XYZ" statt "Error in Line -1" , aber da kann man gleich auf @error testen.
Nach der Funktion muss ich mal schauen...OnAutoItExitRegister()
[/autoit]Damit könnte man die aktuell verwendete Funktion ausgeben, aber wie gesagt, genauso aufwendig wie die @error-Abfrage.
-
Hab in meiner oberen Antwort das Beispiel mal vereinfacht...
HIER gab es eine ähnliche AnfrageGenerell KANN man das auch mit CASE abfragen machen...dann sollte man aber
[autoit]$msg=guigetmsg(1)
[/autoit]verwenden, man beachte den Parameter und lese die Hilfe^^
/EDIT/ habs mal verdeutlicht^^
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
;Opt('GUIOnEventMode', 1)
Dim $Blg[19]
dim $b[19]
$gui=guicreate("",300,500)For $k = 0 to 18 Step + 1
[/autoit] [autoit][/autoit] [autoit]
$Blg[$k] = GUICtrlCreateButton($k, 40, 40 + $k * 14, 129, 15, $WS_GROUP)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $msg[0] = ' & $Blg[$k] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
GUICtrlSetOnEvent(-1, "_do")
GuiCtrlSetState(-1,$GUI_ONTOP)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
Nextguisetstate()
[/autoit] [autoit][/autoit] [autoit]do
[/autoit] [autoit][/autoit] [autoit]
$msg=guigetmsg(1)
switch $msg[0]case $Blg[0] to $Blg[18] ;alle buttons
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_do()
endswitchuntil 0
[/autoit] [autoit][/autoit] [autoit]func _do()
[/autoit]
msgbox (0,"code: "&$msg[0],"Button Nr: "&$msg[0]-3)
endfunc -
Hallo,
mal ein Beispiel wie man so etwas abfragt...Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
Dim $Blg[19]
dim $b[19]
$gui=guicreate("",300,500)For $k = 0 to 18 Step + 1
[/autoit] [autoit][/autoit] [autoit]
$Blg[$k] = GUICtrlCreateButton($k, 40, 40 + $k * 14, 129, 15, $WS_GROUP)
GUICtrlSetOnEvent(-1, "_do")
GuiCtrlSetState(-1,$GUI_ONTOP)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
Nextguisetstate()
[/autoit] [autoit][/autoit] [autoit]do
[/autoit] [autoit][/autoit] [autoit]
until 0func _do()
[/autoit]
msgbox (0,@GUI_CtrlId,"button nr. "&@GUI_CtrlId-$blg[0])
endfunc/EDIT/ Beispiel vereinfacht
-
Auch von mir natürlich einen
glücklichen Herzwunsch zum Geburtstag! -
Hi,
Zitatmal hier nach Ergo von Andy
uuhhh^^, kein guter Hinweis, das erinnert mich daran einen Fix einzubauen, damit ErGo auch mit iGoogle bedienbar wird....zzt funktioniert es nur ohne das personalisierte Google, aber das sollte kein Problem werden.
-
Hi,
hab mal etwas in der Mottenkiste gekramt und ein Script gefunden, um die erweiterten Tastencodes meiner Tastatur herauszubekommen. Das Script wurde bissl erweitert, vielleicht ist was brauchbares dabei...Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Misc.au3>
$dll = DllOpen("user32.dll")$gui = GUICreate('gedrückte Tasten')
[/autoit] [autoit][/autoit] [autoit]
;GUICtrlCreateLabel("Bitte beliebige Tastenkombinationen drücken oder"&@crlf & @CRLF &"rechteCTRL+AltGR+# um zu beenden",10,10)
GUISetState()Do
[/autoit] [autoit][/autoit] [autoit]
$all_pressed_keys = _tasten() ;alle tastencodes, die gleichzeitig gedrückt sind
If $all_pressed_keys = "" Then $all_pressed_keys = "keine"
WinSetTitle($gui, "", 'gedrückte Tasten: ' & $all_pressed_keys); tastencodes im fenstertitel
Until guigetmsg()=-3 or _pressedkeys("A3 A5 BF", $all_pressed_keys) ;wenn in irgendeiner Tastenkombination rechtectrl+altGR+# gedrückt wird, dann ende
dllclose($dll)Func _tasten() ;alle gleichzeitig gedrückten Tasten werden mit ihren hexcodes zurückgegeben
[/autoit] [autoit][/autoit] [autoit]
$tastencode = ""
For $i = 1 To 256
If _IsPressed(Hex($i), $dll) = 1 Then
$tastencode &= Hex($i, 2) & " "
EndIf
Next
Return $tastencode
EndFunc ;==>_tastenFunc _pressedkeys($keys, ByRef $all_pressed_keys) ;$keys ist der string der übergebenen Hexdaten
[/autoit]
$key = StringSplit($keys, " ", 3) ;tastencodes in ein array
If @error Then Return 0
$anzahl = 0
For $i = 0 To UBound($key) - 1 ; alle
If StringInStr($all_pressed_keys, $key[$i], 1) Then $anzahl += 1 ;wenn key in all_pressed_keys enthalten ist, anzahl erhöhen
Next
If $anzahl = UBound($key) Then Return 1 ;alle tasten in $keys wurden betätigt
Return 0
EndFunc ;==>_pressedkeyseine Frage dazu habe ich noch, wieso wird jeder Tastendruck mit einem Sound von Windows (XP) quittiert, wenn die Zeile mit dem Guictrlcreatelabel() aktiv ist?
-
Hi,
Zitatin welchem Format das abgespeichert wird,
SQLite ist eine Datenbank. Abgesehen davon, daß du die entsprechende dll im Zugriff haben musst, ist nicht gesagt, daß du mit einer Datenbank besser oder schneller an deine Arraydaten kommst als beim Lesen aus einer Textdatei. Wenn natürlich Abhängigkeiten der Daten deiner Arrays untereinander bestehen und du diese Abhängigkeiten in deinem Script abfragen möchtest, dann ist eine Datenbank klasse!
Aber nur um Arrays beim Start eines Scripts zu befüllen würde ich persönlich keine Datenbank implementieren. Das geht mit einer beliebigen Datei (txt, html, trw, kft, hzx....) genauso.
-
Hallo Alina,
ZitatHabe die Nacht gelesen, das ich dann im VM sowohl Vista-Ultimate als auch das gewünschte Windows-7 installieren kann.
Du kannst in EINER VM beliebig viele BS installieren! Stell dir die VM einfach als einen "Universalcomputer" vor, den du beliebig mit RAM und Festplatten ausstatten kannst. Du könntest beispielsweise 3x Vista in verschiedenen Konfigurationen, 4x Win7 und noch 22 Linuxversionen installieren. Allerdings kannst du pro VM nur eines der ausgewählten Betriebssysteme starten.
Mit reichlich (realem) Speicher und Festplatten ausgestattet hindert dich aber niemand daran, mehrere VM´s zu installieren und diese mit verschiedenen BS GLEICHZEITIG auf deinem Rechner laufen zu lassen. Da lohnt sich dann auch ein Quadcore/Multicore-Prozessor.
Und bezüglich Geschwindigkeit war ich auch bei Win7 in der VirtualBox sehr positiv überrascht. -
Hallo Alina,
mit der Info, daß dein "alter" PC erst ein Jahr alt ist, hättest du auch früher rausrücken können
Wenn du nicht auf den "Grafikschnickschnack" bei WIN7 angewiesen bist (es gibt Leute, die sich dieses BS nur deswegen kaufen!), dann würde ich den einfachsten/schnellsten Weg nehmen und WIN7 in einer Virtuellen Maschine laufen lassen. Sozusagen ein PC im PC. Das habe ich zzt. auch so. Von der Geschwindigkeit merke ich keine Nachteile, der Vorteil ist, daß man mit einem Tastendruck wieder in sein HOST-BS wechseln und auch simpel Daten zwischen diesen beiden BS verschieben/austauschen kann. Ansonsten muß man, wenn die BS auf unterschiedlichen Partitionen laufen, neu Booten und für Dateitransfers die Infrastruktur (primäre/logische LW) entsprechend anpassen. -
Zitat
PS. mein pc is aus dem jahr 2001 soll heissen: 512mb arbeitsspeicher,2Ghz cpu und nvidia fx5500 graka
Hi, schweift jetzt etwas vom Thema ab, aber versuche mal das RAM auf 1 Gigabyte aufzurüsten. Das ist echt eine Investition die sich Geschwindigkeitsmäßig lohnt. Jedenfalls hat das bei mir in einer ähnlichen Konfiguration den Rechner wieder benutzbar gemacht. Das ewige swappen der Daten auf die Platte legt bei wenig RAM den Rechner komplett lahm. Die "gefühlte Schwuppdizität" verbessert sich enorm, wenn das Festplattengerödel merklich weniger wird.
-
Hi,
[autoit]
die Einzelteile eines Pfades bekommt man man sehr einfach per_pathsplit()
[/autoit]. Da kann man sich das trimmen weitgehend sparen...
-
Hi,
da viele Spiele im Vollbildmodus auf die Overlaytechnik zurückgreifen und mit eigenen Treibern Grafik/Tastatur/IO abfragen bzw. ansteuern, werden die "normalen" WinAPI-Funktionen garnicht aufgerufen.
Du könntest für Screenshots die spielinterne Screenshotfunktion benutzen und die Datei per AutoIt-Script anzeigen oder bearbeiten. -
Hi,
ZitatZumindest Funktionsbeschreibungen wären toll.
es gibt doch die deutsche Hilfe als CHM-Datei (zugegeben für AutoIt´ler teilweise etwas schwer zu verstehen^^) und auch die m.E. sehr gute PDF-Datei mit den Funktionsbeschreibungen, der Inhalt der PDF liegt doch im Paket sogar als Openoffice-Text bei.
Bevor man dieselbe Arbeit nochmal macht, fände ich es besser, eine "Übersetzung" der in der Orginal-Hilfe verwendeten Begriffe zu erstellen.
Was ist beispielsweise mit einem "Bereich#" gemeint und wie erhält man "Zeiger". Dieses "in AutoIt-Syntax" übersetzt und auf die orginale Hilfe verwiesen macht Ressourcen frei für das(die) eigentliche(n) Tutorial(s). -
Hallo Alina,
ich würde dir empfehlen, einen Bürorechner aus einer der großen Serien bei einem der großen Versender deiner Wahl zu bestellen. Das hat den Vorteil, daß alle verbauten Komponenten einsatzklar sind, ohne erst wochenlang Treibern hinterherzulaufen. Da ich davon ausgehe, daß du das System zum ARBEITEN (Produktivumgebung) nutzen möchtest, ist ein Angebot mit Abhol/BringIn-Service im Falle eines Defektes Gold wert. Zur Zeit wirft Intel neue (teure) Prozessoren (i3,i5,i7) auf den Markt, da sollte sich mit einem ca. 1 Jahr alten (bewährten) System ein Schnäppchen machen lassen.
Für eine halbwegs aktuelle Maschine deines anvisierten Tätigkeitsbereichs würde ich jetzt aus dem Bauch heraus die 400,- - 500,- Eurogrenze anpeilen.
Ob Dual- oder Quadcore ist dabei schnurz, deine Anwendungen benutzen sowieso nur einen Prozessorkern. Wert würde ich persönlich auf einen sehr leisen Rechner legen, deine Tochter trägt bestimmt lautstark zur "Noise-Pollution" bei, da braucht Mama auch nicht noch einen Rechner der sich anhört wie ein startender Jet....Meine Frau hat sich für genau deinen Anwendungsbereich in einen der kompakten ACER X1300(Zitat: "...ist der SCHNUGGELISCH!") verguckt, kostet neu 399,-€ (incl BS) und ist sehr kompakt, sehr leise und die Stromsparmodi sind im BIOS auch schon richtig eingestellt. Auspacken, anschliessen, läuft....so muß das sein...
-
Zitat
Hmmm, danke... Also kann ich da nur ganz fixe Funktionen drin lassen?
Aber dann kann ich auch gleich eig. alles ausgliedern...Ja, genau das ist der Sinn. Generell ist es problematisch, bei Verwendung von GuiCtrlSetOnEvent() mit Messageboxen zu arbeiten, ohne die Msgbox als Taskmodal (Flag 8192) zu benutzen.
[autoit]
Das Problem ist ja nicht die Dauer der Funktion, sondern daß du während der Laufzeit der Funktion diese oder eine andere Funktion wieder startest.
Wenn man also zeitintensive Funktionen benutzt, dann sollte man sich z.B. Funktionen _DisableGUI() und _EnableGUI() schreiben, welche verhindern, daß man die GUI bzw deren Elemente benutzen kann, solange die zeitintensive Funktion läuft.func _dasdauertziemlichlange()
[/autoit][autoit][/autoit][autoit]
_DisableGUI() ; verhindert Zugriff auf die GUI;zeitintensive Tätigkeit des Programms
[/autoit][autoit][/autoit][autoit]_EnableGUI() ;ermöglicht Zugriff auf die Elemente der GUI
[/autoit]
endfunc