Startordner steht bereits auf meiner ToDo-Liste.
Der Button zum anlegen eines neuen Verzeichnisses gibt es bereits (in der noch nicht veröffentlichten Version). Genauso wie eine Mehrfachauswahl bei den Dateien (Rückgabe ist jetzt ein Array).
Option zum Ein-/ausblenden von Dateien könnte ich noch einbauen.
Beiträge von Oscar
-
-
[verschoben nach Hilfe & Unterstützung]
-
Es gibt eine neue Version (Post#1). Ich fand es besser, wenn zu den Dateien auch die wichtigsten Dateiinformationen angezeigt werden.
-
Dafür gibt es AdlibRegister oder Du musst einen Timer benutzen (TimerInit und TimerDiff).
-
Ich habe mal was gescriptet:
[autoit]
[/autoit][autoit][/autoit][autoit]
#include <Date.au3>$sDate = _DateToRFC822()
[/autoit][autoit][/autoit][autoit]
ConsoleWrite($sDate & @CR)Func _DateToRFC822()
[/autoit]
Local $tLocalTime = _Date_Time_GetLocalTime(), $aLocalTime = _Date_Time_SystemTimeToArray($tLocalTime)
Local $tSystemTime = _Date_Time_GetSystemTime(), $aSystemTime = _Date_Time_SystemTimeToArray($tSystemTime)
Local $sRFC822Date = StringFormat('<pubDate>%s, %02d %s %4d %02d:%02d:%02d %+03d00</pubDate>', _DateDayOfWeek($aLocalTime[7] + 1, 1), $aLocalTime[1], _DateToMonth($aLocalTime[0], 1), $aLocalTime[2], $aLocalTime[3], $aLocalTime[4], $aLocalTime[5], $aLocalTime[3] - $aSystemTime[3])
$tLocalTime = ''
$tSystemTime = ''
Return $sRFC822Date
EndFunc -
Hier wurde nach einer Auswahlbox gefragt, in der man ein Verzeichnis oder eine Datei auswählen kann.
Ich habe mal so eine UDF erstellt (siehe Anhang). Beispiel ist auch vorhanden.Neu in dieser Version (09.07.2013):
- Jetzt mit den wichtigsten Datei-Informationen (Datei-Icon/-Name/-Erweiterung/-Größe/-Attribute)Neu in dieser Version (16.07.2013):
- Mehrfachauswahl bei Dateien möglich (per Option)
- Nur Ordnerauswahl (per Option)
- Man kann nun einen Startordner angeben. Dieser wird dann automatisch geöffnet/selektiert und ganz oben im Treeview angezeigt.
- Position (Left/Top) sowie Größe (Width/Height) können nun angegeben werden (Standard = 800x600, zentriert).
- Die Rückgabe ist nun ein Array (außer im Fehlerfall). $Array[0] beinhaltet die Anzahl der Rückgabewerte. -
Ich habe es bisher immer so gemacht, dass ich mehrere GUIs erstellt habe und dann GUI-HIDE/SHOW. Wobei ich die MAIN-GUI eigentlich immer angezeigt lasse und diese nur deaktiviere. Die anderen GUIs waren dann meistens Eingabefenster oder um Einstellungen vorzunehmen. Bei mir waren das aber immer separate Fenster (zwar als Child, aber nicht im MAIN-GUI integriert).
Wobei ich mir das Konzept von m-obi auch mal angesehen habe und es ganz gut finde. Das werde ich wohl auch mal ausprobieren...
Von der Performance her sollte das Extra-GUI-Konzept schneller (beim wechseln) sein, als alle Controls in einer Schleife anzuzeigen/zu verstecken. Vor allem leidet aber auch die Lesbarkeit darunter, weil man die Controls in ein Array packen muss, um das vernünftigt handeln zu können. Ich bevorzuge es, den Controlvariablen passende/merkbare Namen zu geben. -
Naja, man muss mehr Funktionen schreiben, aber eigentlich ist der OnEventMode einfacher (IMHO). Vorrausgesetzt man hat erstmal verstanden, wie der Modus funktioniert.
Wichtig ist nämlich, dass in den Funktionen, die per GUISetOnEvent oder GUICtrlSetOnEvent aufgerufen werden, möglichst kein Sleep oder eine Endlosschleife vorhanden ist.
Solange wie man diese Funktionen nicht wieder verlässt, solange werden keine weiteren GUI-Events ausgewertet. Diese "Event-Funktionen" sollten also eine möglichst kurze Laufzeit aufweisen, um die Benutzeroberfläche bedienbar zu halten. -
Nun, in der Hilfe zu InetRead steht:
ZitatEin Binär-String wird zurückgegeben...
und außerdem steht dort noch:
ZitatDie zurückgegebenen Daten sind im binären Format. Die Funktion BinaryToString() kann benutzt werden, um die Daten in einen String umzuwandeln.
Alle Klarheiten beseitigt?

-
Im OnEventMode würde das Beispiel so aussehen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>Opt('GUIOnEventMode', 1) ; OnEventMode für die GUI
[/autoit] [autoit][/autoit] [autoit]Global $Loop = False
[/autoit] [autoit][/autoit] [autoit]#region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$GUI = GUICreate("Test", 187, 146, 854, 446)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit') ; beim Klick auf das Schliessen-Symbol wird die Funktion '_Exit' aufgerufen
$Text = GUICtrlCreateEdit("", 8, 8, 169, 81, BitOR($GUI_SS_DEFAULT_EDIT, $ES_CENTER))
GUICtrlSetData(-1, "0")
$Start = GUICtrlCreateButton("Start", 8, 112, 75, 25)
GUICtrlSetOnEvent(-1, '_Start') ; beim Klick auf [Start] wird die Funktion '_Start' aufgerufen
$Stop = GUICtrlCreateButton("Stop", 104, 112, 75, 25)
GUICtrlSetOnEvent(-1, '_Stop') ; beim Klick auf [Stop] wird die Funktion '_Stop' aufgerufen
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###While Sleep(10) ; Sleep(10) damit das Script nicht 100% Rechenlast benötigt
[/autoit] [autoit][/autoit] [autoit]
If $Loop Then ;solange $loop=true, zahlen erhöhen
Sleep(GUICtrlRead($Text))
GUICtrlSetData($Text, GUICtrlRead($Text) + 1)
EndIf
WEndFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>_ExitFunc _Start()
[/autoit] [autoit][/autoit] [autoit]
$Loop = True
EndFunc ;==>_StartFunc _Stop()
[/autoit]
$Loop = False
EndFunc ;==>_Stop -
Andy: Deine Umsetzung ist auch nicht so ideal. Man sollte kein Sleep in die MsgLoop-Schleife packen. Das führt dazu, dass (wenn der Sleep-Wert zu groß ist) die Buttons gar nicht mehr abgefragt werden.
Also entweder den OnEventMode benutzen (in der Endlosschleife dort ist ein Sleep ja sogar angebracht) oder beim MsgLoop-Modus einen Timer verwenden. -
So:
[autoit]
[/autoit]
Global $arDB = StringSplit($DB, '|'), $aSuchenItem[UBound($arDB)]
For $i = 0 To UBound($arDB) - 1
$aSuchenItem[$i] = GUICtrlCreateTreeViewItem($arDB[$i], $SuchenItem)
Next -
Achso ja, englisch soll Standard sein. Dann könnte man das auch so machen:
Spoiler anzeigen
[autoit]
[/autoit]
Func LoadInternationalStrings()
Global _
$str_0001 = "Browse...", _
$str_0002 = "Count of start digits to trim", _
$str_0003 = "Count of end digits to trim", _
$str_0004 = "Find what", _
$str_0005 = "Replace with", _
$str_0006 = "Consider file extentions", _
$str_0007 = "Open directory after renaming", _
$str_0008 = "Start renaming", _
$str_0009 = "Choose a direcory which contains the files that you want to rename.", _
$str_0010 = "Renaming ", _
$str_0011 = "", _
$str_0012 = "Collecting files", _
$str_0013 = "An error has occurred.", _
$str_0014 = "Collecting files failed", _
$str_0015 = "Rename sub-directories"
Switch @OSLang
Case "0407", "0807", "0c07", "1007", "1407"
Global _
$str_0001 = "Durchsuchen...", _
$str_0002 = "Anzahl der am Anfang abzuschneidenden Zeichen", _
$str_0003 = "Anzahl der am Ende abzuschneidenden Zeichen", _
$str_0004 = "Suchen nach", _
$str_0005 = "Ersetzen durch", _
$str_0006 = "Dateierweiterungen mit einbeziehen", _
$str_0007 = "Ordner nach dem umbenennen anzeigen", _
$str_0008 = "Starte umbenennen", _
$str_0009 = "Wählen sie einen Ordner aus, dessen Dateien sie umbenennen möchten.", _
$str_0010 = "Benenne ", _
$str_0011 = " um", _
$str_0012 = "Sammle Dateien", _
$str_0013 = "Ein Fehler ist aufgetreten.", _
$str_0014 = "Das sammeln der Daten ist fehlgeschlagen.", _
$str_0015 = "Benenne Unterordner um"
Case Else
MsgBox(48, "FileRenamer $FILERENAMER_VERSION$ - Error", "Your system language could not be detected or is not supported.@LF@" & _
"Laguage has been set to English.@LF@" & _
"@LF@" & _
"MS Language code: @OSLang@")
EndSwitch
EndFunc ;==>LoadInternationalStringsWobei Du vielleicht überlegen solltest, statt der 15 Variablen ($str...) lieber ein Array zu benutzen.
-
Die Funktion "LoadInternationalStrings" könnte doch auch so aussehen:
Spoiler anzeigen
[autoit]Func LoadInternationalStrings()
[/autoit]
Local $strOSLang = ""
Switch @OSLang
Case "0409", "0809", "0c09", "1009", "1409", "1809", "1c09", "2009", "2409", "2809", "2c09", "3009", "3409"
$strOSLang = "ENG"
Global _
$str_0001 = "Browse...", _
$str_0002 = "Count of start digits to trim", _
$str_0003 = "Count of end digits to trim", _
$str_0004 = "Find what", _
$str_0005 = "Replace with", _
$str_0006 = "Consider file extentions", _
$str_0007 = "Open directory after renaming", _
$str_0008 = "Start renaming", _
$str_0009 = "Choose a direcory which contains the files that you want to rename.", _
$str_0010 = "Renaming ", _
$str_0011 = "", _
$str_0012 = "Collecting files", _
$str_0013 = "An error has occurred.", _
$str_0014 = "Collecting files failed", _
$str_0015 = "Rename sub-directories"
Case "0407", "0807", "0c07", "1007", "1407"
$strOSLang = "GER"
Global _
$str_0001 = "Durchsuchen...", _
$str_0002 = "Anzahl der am Anfang abzuschneidenden Zeichen", _
$str_0003 = "Anzahl der am Ende abzuschneidenden Zeichen", _
$str_0004 = "Suchen nach", _
$str_0005 = "Ersetzen durch", _
$str_0006 = "Dateierweiterungen mit einbeziehen", _
$str_0007 = "Ordner nach dem umbenennen anzeigen", _
$str_0008 = "Starte umbenennen", _
$str_0009 = "Wählen sie einen Ordner aus, dessen Dateien sie umbenennen möchten.", _
$str_0010 = "Benenne ", _
$str_0011 = " um", _
$str_0012 = "Sammle Dateien", _
$str_0013 = "Ein Fehler ist aufgetreten.", _
$str_0014 = "Das sammeln der Daten ist fehlgeschlagen.", _
$str_0015 = "Benenne Unterordner um"
Case Else
$strOSLang = "ENG"
MsgBox(48, "FileRenamer $FILERENAMER_VERSION$ - Error", "Your system language could not be detected or is not supported.@LF@" & _
"Laguage has been set to English.@LF@" & _
"@LF@" & _
"MS Language code: @OSLang@")
EndSwitch
EndFunc ;==>LoadInternationalStringsBTW: In SciTE gibt es das "Tidy AutoIt Source"-Tool (CTRL+T). Damit kannst Du den Quellcode sauber formatieren/einrücken lassen.
Nochwas in der Funktion "SelectFolder" solltest Du nicht auf @error testen, sondern mit "FileExists":
[autoit]
[/autoit][autoit][/autoit][autoit]
Local $strDirecory = FileSelectFolder("$str_0009$", "")If FileExists($strDirecory) Then...
[/autoit]
Das hat den Vorteil, dass Du damit auch "falsche" Pfade ("Desktop", "Heimnetzgruppe", "Netzwerk", etc.) abfangen kannst. -
Mal ein paar Anmerkungen...
In der Funktion "LoadInternationalStrings":
[autoit]
Switch-Case unterstützt die Mehrfachauswahl mittels Kommata. Du musst nicht für jeden Eintrag einen Case-Zweig schreiben. Das geht auch so:Case "0409", "0809", "0c09", "1009", "1409", "1809", "1c09", "2009", "2409", "2809", "2c09", "3009", "3409"
[/autoit]
das Gleiche dann für die deutsche Sprache. Für alle anderen Sprachen (außer Deutsch und Englisch) kannst Du "Case Else" benutzen.
Die dann folgenden If...Then Anweisungen kannst Du mit in die Case-Anweisungen schreiben.In der Funktion "Rename":
Warum benutzt Du "_RunDOS( 'REN..."? Das geht doch auch direkt mit AutoIt ("FileMove"). Das würde dann auch das FileGetShortName einsparen.
Du könntest das Programm auch noch erweitern, indem es die Dateien auch rekursiv (inkl. Unterverzeichnisse) umbenennt.Ungewöhnlich ist das benutzen von "ExpandVarStrings". Ich sehe darin nicht so den Vorteil. Man kann zwar die Stringverkettung etwas einfacher halten, aber es erschwert IMHO das lesen des Scripts. Ich bevorzuge für die Anzeige "StringFormat".
-
Geht bei mir (AMD Phenom II X4 940 Processor, Win7 64 Bit) auch, ohne Probleme.
-
Ich weiß nicht mehr von wem die Funktion "__WinAPI_ShellExtractIcons" stammt, aber so geht es jedenfalls (bei compilierten Script):
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WinAPI.au3>$hgui = GUICreate("test", 500, 500)
[/autoit] [autoit][/autoit] [autoit]
$hStatus = _GUICtrlStatusBar_Create($hgui)
Global $aParts[4] = [75, 150, 300, 400]
_GUICtrlStatusBar_SetParts($hStatus, $aParts)
$hIcon = __WinAPI_ShellExtractIcons(@ScriptFullPath, 0, 24, 24)
_GUICtrlStatusBar_SetIcon($hStatus, 0, $hIcon)GUISetState()
[/autoit] [autoit][/autoit] [autoit]
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_WinAPI_DestroyIcon($hIcon)
Exit
EndSwitch
WEndFunc __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
[/autoit]
Local $Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
If (@error) Or ($Ret[0] = 0) Or ($Ret[5] = Ptr(0)) Then Return SetError(1, 0, 0)
Return $Ret[5]
EndFunc ;==>__WinAPI_ShellExtractIcons -
Im Beispielscript zu "TCPRecv" gibt es die Funktion "SocketToIP", die genau das macht.
-
Alles anzeigen
Okay, hab das jetzt mal in Kombination mit einer kleinen Funktion versucht:
[autoit]
[/autoit]
Func DeleteListViewElement ($ListView)
Dim $SelectedItemsArray = _GUICtrlListView_GetSelectedIndices($ListView, True)
If $SelectedItemsArray[0] > 0 Then
For $counter = 0 To UBound($SelectedItemsArray) - 1
_GUICtrlListView_DeleteItem($ListView, $SelectedItemsArray[$counter])
Next
EndIf
EndFuncDiese Funktion kannst Du extrem kürzen, wenn Du _GUICtrlListView_DeleteItemsSelected verwendest.

-
Und das Ganze hättest Du auch zwei Stunden eher haben können, wenn Du gleich mehr gepostet hättest.
Bitte noch das Thema auf "gelöst" setzen (1. Beitrag bearbeiten).