Ja, der Fehler ist reproduzierbar.
Ursache: Item werden gelöscht, aber nicht die genutzen Ctrl-ID freigegeben, sodass bei neuen Item irgendwann die max. Anzahl an Ctrl von 65535 erreicht wird. Danach kann kein Item/Ctrl mehr erstellt werden.
Einen Zusammenhang mit dem Handle besteht aber nicht. Dasselbe passiert, wenn die ID verwendet wird für _GUICtrlListView_DeleteAllItems.
Insofern ist das sicherlich ein Bug, aber nicht in der Hilfe, sondern in der Funktion: _GUICtrlListView_DeleteAllItems.
Beiträge von BugFix
-
-
Ich hab das in meinem Programm falsch gemacht - wenn man mit _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($guiListView)) den Inhalt löscht und dann mit GUICtrlCreateListViewItem("wasauchimmer",$guiListView) wieder Items hinzufügt... und das viele male wiederholt, ist der Listview irgendwann leer und es lässt sich nichts mehr hinzufügen. GUICtrlCreateListViewItem gibt dann null zurück.
Kann ich nicht bestätigen. Das ist völlig korrekt.
Ausserdem brauchst du nicht das GUI-Handle, sondern das Handle des LV-Ctrl. ( GUICtrlGetHandle($guiListView) ??? )Ich benutze zur Erstellung immer
[autoit]$LV = GuiCtrlCreateListview('Spalte1|Spalte2', ....)
[/autoit]
$hLV = GuiCtrlGetHandle($LV)Aktualisieren (neuer Inhalt) immer mit:
[autoit]_GuiCtrlListview_DeleteAllItems($hLV)
[/autoit]
; neue Item wieder mit
GuiCtrlCreateListviewItem('Bla|Blub', $LV)Setze das seit Jahren in produktiver Umgebung ein, ohne jedes Problem.
Wenn du vermeintliche Fehler zeigen möchtest, packe bitte ein Codebsp. dabei, mit dem der Fehler nachvollziehbar ist.
-
Habe die dateien Mal drann gehangen
Kleiner Tipp:
Wenn es nicht gerade ein riesiges Skript ist, poste den Quelltext bitte direkt im Thread (Verwenden der Code-Tags). Denn nicht jeder mag extra eine Datei herunterladen um mal einen Blick draufzuwerfen.
-
Und wenn du jetzt noch eine Frage formulieren würdest, könnte dir sogar jemand antworten..

-
Jaja, die "Fragen"-Tipps. Mein Sohn hat zugesehen, was ich getippt habe und wurde fast wütend.

Das passiert halt, wenn Realismus und Fanatismus aufeinandertreffen.
-
Gutes Tutorial, auch der Tipp mit dem Einrücken bei GUI-Element Optionen gefällt mir sehr gut und macht den Code wirklich (auch für andere) viel besser lesbar.
Da siehst du mal, wie widersprüchlich das menschliche Empfindungen sind.
Derartige Einrückungen stören aus meiner Sicht die Lesart. Denn primär dienen Einrückungen dazu eine Substruktur anzuzeigen, was hier eindeutig nicht der Fall ist.
Ähnlich geht es mir mit Leerzeilen. Als ich mit VB anfing, stand in dem Lehrbuch, man möge nach jeder Codezeile eine Leerzeile einfügen. Dadurch wird aber schon ein 25-Zeilen Code auf 50 Zeilen aufgebläht - ohne Sinn und Verstand.
Leerzeilen machen Sinn, wenn man einen Codeblock markieren möchte, z.B. in der GUI die Deklaration von Groups und deren Inhalte, sodass auch codemäßig diese Gruppierung deutlich wird. Wobei man dazu auch sehr gut #region - #endregion nutzen kann.
Und bei großen Skripts eine große Hilfe, wenn die Erklärungen zu Variablen/Funktionen überall im Skript auslesbar sind (mit diesem Tool)Bleibt als Resümee:
Eine Sprache wie AutoIt, die selbst kaum Konventionen vorgibt, wird immer von jedem anders behandelt werden.
Testet euch doch mal selbst: Öffnet ein (umfangreicheres) Skript, dass ihr vor >1 Jahr erstellt habt. Wißt ihr auf Anhieb wieder, was wo passiert?
Wenn ja - Dann ist es sauber programmiert, egal welche Notationen verwendet wurden.
-
Wenn ich das lese, kommt mir nur ein Gedanke: Kindergarten!
Wenn sich jemand wegen irgendeiner Formulierung angepißt fühlt, dann klärt das bitte per PN. Das ist hier kein Ort um Befindlichkeiten auszutauschen.
Also an alle: Bleibt beim Thema, sonst kommt das Schloß vor. -
Mal ein kleiner Tip:
Rückwärts löschen. Dann klappt es auch mit dem Index.
-
wie ich der Variable $return_value automatisch den Wert '' zuteile
[autoit]
Deklariere die Variable mit WertvorgabeFunc _log($private_code, $return_value='')
[/autoit]muss ich für jeden @error diese Funktion aufrufen
Ja, da @error nach jedem! Aufruf einer beliebigen Funktion neu gefüllt wird, musst du direkt nach dem zu prüfenden Vorgang das Makro auswerten.
-
Du musst die Schrittweite, also den Wert um den je Durchlauf die Progressbar erhöht wird (max. bis 100) mit dem Schleifenzähler multiplizieren und als Progresswert setzen.
[autoit]
Rechnung:
$Step = 100 / Anz. Durchläufe
In der Schleife:For $i = 1 To $max
[/autoit]
GuiCtrlSetData($progress, $i*$Step)
;....
Next -
Ich hab mal auf meinem Win7-32 System nachgesehen, dort ist sie im System32-Ordner (ohne dass ich sie installiert hätte) vorhanden. Nun kann ich nicht mit Sicherheit sagen, ob sie auch im "Ur"-Windows vorhanden ist, da ich mein erstes Image erst nach Installation aller für mich wesentlichen Programme angelegt habe. Ob eines dieser Programme die Datei mit installiert hat? Viele Browser verwenden sqlite und etliche andere Programme auch. Es bleibt also eine offene Frage.

-
Die Anwendung von Notationen fördert durchaus die Lesbarkeit.
Ich habe mir inzwischen noch angewöhnt, Variablen die im Funktionskopf stehen in der Form $_Variable darzustellen. So ist innerhalb der Funktion schneller ersichtlich, welche Variable als Parameter übergeben wurde.
In einigen UDF findet man die Parametervariablen in Großbuchstaben. Das finde ich unpassend. Großbuchstaben sollten ausschließlich für Konstanten und Strukturen verwendet werden.
Vieles ist dabei natürlich Geschmackssache.
Aber, wie schon richtig gesagt wurde: Gut kommentiert, ist halb gelesen.
-
In Codezeile 48 lese ich den Inhalt des aktuellen Inputs aus und schreibe ihn ins Array. Dort kannst du ansetzen und den gelesenen Wert in das Folge-Input eintragen.
-
Es wird nichts mehr dargestellt bzw. das zuerst ausgewählte bleibt immer auf dem aktuellen Tab stehen.
Irgendwie wird nur der Tab-Reiter ausgewählt mit dme Code-Beispiel aber nicht der Inhalt angezeigt.
[autoit]
Ahh, stimmt. Hatte ich nicht bedacht. Dadurch, dass der normale Aktivierungsvorgang des Tab-Item abgefangen wird, muß dass nachgeholt werden.
Einfach eine Zeile mehr in der Funktion "_Check", sieht dann so aus:Func _Check()
[/autoit]
If Not $check Then Return
For $i = 1 To $aDisableItem[0]
If $IndexMouseOver = $i Then
$check = False
Return
EndIf
Next
_GUICtrlTab_SetCurSel(GUICtrlGetHandle($Tab), $IndexMouseOver)
GUICtrlSetState(Execute('$Tab' & $IndexMouseOver +1), $GUI_SHOW) ; == TAB-Item-ID muß dazu fortlaufende Nummer haben um mit dem Index zu verknüpfen
$check = False
EndFunc ;==>_Check -
Ich hab mal die Lösung erstellt und etwas kommentiert.
Spoiler anzeigen
[autoit]#Include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <Array.au3>Global Const $WM_COMMAND = 0x0111
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate('TEST')
[/autoit] [autoit][/autoit] [autoit]
$input1 = GUICtrlCreateInput('1', 40, 30, 60, 20)
$input2 = GUICtrlCreateInput('', 40, 60, 60, 20)
$input3 = GUICtrlCreateInput('', 40, 90, 60, 20)
$input4 = GUICtrlCreateInput('', 40, 120, 60, 20)
$btArray = GUICtrlCreateButton('Zeige Werte-Array', 20, 200, 150, 25)Global $aInput[4][2] = [[$input1],[$input2],[$input3],[$input4]] ; == alle Input in einem Array verwalten, Werte werden in das Array gelesen
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGUI)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND') ; == registriert Windows-Message "WM_COMMAND" und weist dieser Msg die gleichnamige Funktion zu
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btArray
_ArrayDisplay($aInput)
EndSwitch
WEndFunc WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
#forceref $hWnd, $iMsg
Local $hWndFrom, $iIDFrom, $iCode, $iNext, $fFound = False
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Select
Case $iCode = 0x0
Local $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($hGUI, '', ControlGetFocus($hGUI)))
For $i = 0 To UBound($aInput) -1
If $aInput[$i][0] = $ID Then
$fFound = True
ExitLoop
EndIf
Next
If Not $fFound Then Return $GUI_RUNDEFMSG ; == Control-ID gehört nicht zu den überwachten Input
$iNext = $i +1
If $iNext = UBound($aInput) Then $iNext = 0 ; == Array-Index für nächstes Control, bei Ende wieder zum ersten
$aInput[$i][1] = GUICtrlRead($aInput[$i][0]) ; == Wert auslesen und in das Array schreiben
ControlFocus($hGUI, '', $aInput[$iNext][0]) ; == Fokus auf nächstes Input setzen
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND -
Es gibt von Oscar ein sehr schönes Skript (FileRenamer).
Mein Skript ist ähnlich, aber mit einem anderen Hintergrund.
Die meisten werden das kennen: Man fotografiert munter drauflos, gelegentlich auch ein Movie und dann wird das ganze in einen Ordner geschoben, z.B. "..Oma\Omas_75ter". An Weihnachten kommt dann noch "..Oma\Oma_Weih_2011" etc. pp. hinzu.
So weit ist das ja schon halbwegs sortiert. Aber in dem Moment, wenn man Bildersammlungen zusammenstellt treten die Probleme auf: In allen Ordnern haben die Dateien dieselben Namen (RIMG00019.jpg o.ä.).
Mein Ansatz ist folgender:
- Die Dateien des Ordners werden nach Erstelldatum aufsteigend benannt als "Ordnername+Trennzeichen+Zähler+Dateiendung"
- Trennzeichen und Stellenzahl des Zählers lassen sich in Einstellungen festlegen
- Videodateien können wahlweise in einem Unterordner (Name frei wählbar) des Ordners abgelegt und ebenfalls umbenannt werden
- Es können für komplette Bildersammlungen mit Unterordnern in einem Durchgang alle Dateien umbenannt werden
- Zu berücksichtigende Dateitypen der Bild-/Videodateien sind individuell festlegbar
- Unerwünschte Dateien (z.B. Thumbs.db o.ä.) können in einer Liste erfasst und dann während des Umbenennens gleich gelöscht werden
- Alle gefundenen Dateien werden mit Erstelldatum im Listview angezeigt, Dateien können per Checkbox (Haken entfernen) vom Umbenennen ausgeschlossen werden
- Im Programmordner wird eine "Settings.ini" mit den Einstellungen abgespeichertZum Ausführen wird die "image_get_info.au3" (von Lazycat) benötigt. Ich habe sie mit angehängt.
Edit: 18.06.2012
Einige Neuerungen
- Anzeige Anzahl eingelesener Bild-/Videodateien
- Anzeige Anzahl schreibgeschützter Dateien
- Radiobutton zum Wechsel Darstellung Dateipfade links-/rechts ausgerichtet im Listview
- Button "Explorer": Öffnet den Explorer im Startordner der Auswahl
- schreibgeschützte Dateien werden rot dargestellt, die Checkbox wird deaktiviert
- Evtl. Fehler (Namenskonflikt-Zieldateiname existiert bereits; Umbenennen nicht erfolgreich) werden in eine "Rename.log" geschrieben.
Falls Fehler auftreten wird die LOG-Datei automatisch geöffnet
- Doppelklick: markierte Datei wird im Standardprogramm geöffnet
- Rechtsklick: Kontextmenü
--- Anzeige kpl. Dateipfad als Tooltip
--- Anzeige aller Dateidetails
--- Aufheben Schreibschutz für markierte Datei(en) (Färbung wieder normal, Checkbox wird aktiviert)Edit: 25.06.2012
- Gefixed: Bug bei Button Explorer und Pfad mit Leerzeichen
- Added: Optional kann zusätzlich ein temporäres Umbenennen mit (wählbarem) Präfix erfolgen. Nützlich, falls schon von Hand einzelne Dateien in die gewünschte Form umbenannt wurden.
- Added: Im Listview werden bei Erfolg die neuen Dateinamen eingetragen und grün eingefärbt. Bei Fehler bleibt der alte Dateiname und wird orange-rot gefärbt.v0.6
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2012-06-25 13:47:54 v 0.6
#EndRegion - TimeStamp#cs
[/autoit] [autoit][/autoit] [autoit]
Im Skriptordner wird die Datei "Rename.log" erstellt mit der Fehlerprotokollierung.
Die Datei wird bei jedem Neustart (Einlesen) gelöscht und beim Umbenennen neu geschrieben, sofern Fehler auftreten.
#ce
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GuiListView.au3>
#Include <GuiStatusBar.au3>
#Include <ProgressConstants.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#include "image_get_info.au3"#cs Settings.ini
[/autoit] [autoit][/autoit] [autoit]
[General]
Startpfad=
n_stellig=4
Delimiter=_
SubFolder=1
UsePrefix=0
Prefix=
Picture_Formate=JPG,JPEG
Video_Folder_Create=1
Video_Folder_Name=VIDEO
Video_Formate=AVI,THM,MOV
#ceGlobal $sPath = @ScriptDir & "\", $bData[2] = [1]
[/autoit] [autoit][/autoit] [autoit]
$bData[1] &= "0x0000010001002020000001002000A810000016..." ; == für Post verkürzt dargestellt
Global $bDatanames[1] = ["Rename Document.ico"]For $i = 1 To $bData[0]
[/autoit] [autoit][/autoit] [autoit]
Local $sFile = $sPath & $bDatanames[$i -1]
Local $hFileOut = FileOpen($sFile, 2+8+16)
FileWrite($hFileOut, Binary($bData[$i]))
FileClose($hFileOut)
NextOnAutoItExitRegister("_DelBinaryTempFiles")
[/autoit] [autoit][/autoit] [autoit]Func _DelBinaryTempFiles()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $bData[0]
FileDelete($sPath & $bDatanames[$i -1])
Next
EndFuncGlobal $sFolder, $aFiles, $fSubFolder = False, $sINI = @ScriptDir & '\Settings.ini', $sLOG = @ScriptDir & '\Rename.log', $hLog, $index, $sDelFile
[/autoit] [autoit][/autoit] [autoit]
Global $fDetail = False, $sFileDetail, $sItemTip, $iFolder = 1, $iSubFolder, $aCountFiles[2] = [0,0], $aItemID[1]
Global $hStatus, $progress, $hProgress, $iStep, $aParts[2] = [160, -1]
Global $sPathStart, $iCountNumbers, $sDelimiter, $sExt, $sExtPict, $sExtVideo, $iCreateVideoFolder, $sVideoFolder, $sDeleteList, $aListview[1][2]
Global $lbCntPic, $lbCntVid, $lbCntErr, $iCntErr, $iCntReadOnly, $sReadOnly, $aCurrItem, $fShowContext = False
Global $cbPrefixTmp, $lbPrefixTmp, $inPrefixTmp, $sPrefix, $iPrefix, $fPrefix = False
If Not FileExists($sINI) Then
IniWrite($sINI, 'General', 'Startpfad', '')
IniWrite($sINI, 'General', 'n_stellig', 4)
IniWrite($sINI, 'General', 'Delimiter', '_')
IniWrite($sINI, 'General', 'SubFolder', 1)
IniWrite($sINI, 'General', 'UsePrefix', 'N')
IniWrite($sINI, 'General', 'Prefix', 'TMP')
IniWrite($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
IniWrite($sINI, 'General', 'Video_Folder_Create', 1)
IniWrite($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
IniWrite($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
IniWrite($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
EndIf$hGui = GUICreate("Dateien Umbenennen " & Chr(169) & "BugFix", 608, 535, 400, 50, Default, $GUI_WS_EX_PARENTDRAG)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
GUICtrlCreateGroup(" Ordner Auswählen ", 15, 15, 570, 87)
$mnu = GUICtrlCreateMenu('Menü')
$mnuSettings = GUICtrlCreateMenuItem('Einstellungen', $mnu)
GUICtrlCreateMenuItem('', $mnu)
$mnuHelp = GUICtrlCreateMenuItem('Hilfe', $mnu)
$inFolder = GUICtrlCreateInput("", 30, 40, 510, 20, $ES_READONLY)
GUICtrlSetBkColor(-1,0xFFFFFF)
$btSelect = GUICtrlCreateButton("...", 550, 40, 20, 20)
GUICtrlSetBkColor(-1, 0xFFD700)
$cbSubFolder = GUICtrlCreateCheckbox('Unterordner mit einbeziehen', 30, 70, 180, 17)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateLabel('Fotos', 330, 64, 60, 17)
$lbCntPic = GUICtrlCreateLabel('0', 405, 64, 30, 17, $ES_RIGHT)
GUICtrlCreateLabel('Videos', 330, 81, 60, 17)
$lbCntVid = GUICtrlCreateLabel('0', 405, 81, 30, 17, $ES_RIGHT)
$btReadFiles = GUICtrlCreateButton('Einlesen', 480, 70, 90 ,22)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x7FFF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup(" Datei - Infos ", 15, 112, 570, 340)
GUICtrlCreateLabel('', 30, 132, 406, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$cbSelAll = GUICtrlCreateCheckbox(' Dateien ( Auswahl alle / Auswahl aufheben )', 39, 135, 280, 17)
$rLeft = GUICtrlCreateRadio('links', 330, 135, 50, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$rRight = GUICtrlCreateRadio('rechts', 380, 135, 50, 17)
GUICtrlCreateLabel('', 435, 132, 136, 23, $SS_ETCHEDFRAME)
GUICtrlCreateLabel('Aufnahmezeitpunkt', 440, 136, 123, 17, $SS_CENTER)
$ListView = GUICtrlCreateListView("Datei|Nr|Aufnahmezeitpunkt", 30, 154, 540, 283, BitOR($LVS_SHOWSELALWAYS,$LVS_REPORT,$LVS_NOCOLUMNHEADER) , BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT,$LVS_EX_CHECKBOXES,$LVS_EX_DOUBLEBUFFER))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 400)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 0)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, $LVSCW_AUTOSIZE_USEHEADER )
$hLV = GUICtrlGetHandle($ListView)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btExplorer = GUICtrlCreateButton('Explorer', 30, 462, 90 ,22)
GUICtrlSetBkColor(-1, 0xFFD700)
GUICtrlSetState(-1, $GUI_DISABLE)
$lbReadOnly = GUICtrlCreateLabel('', 150, 465, 145, 17)
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlCreateLabel('Fehler', 330, 465, 60, 17)
$lbCntErr = GUICtrlCreateLabel('0', 405, 465, 30, 17, $ES_RIGHT)
$btRename = GUICtrlCreateButton('Umbenennen', 480, 462, 90 ,22)
GUICtrlSetBkColor(-1, 0xFA8072)
GUICtrlSetState(-1, $GUI_DISABLE)
$hStatus = _GUICtrlStatusBar_Create ($hGui)
_GUICtrlStatusBar_SetMinHeight ($hStatus, 20)
_GUICtrlStatusBar_SetParts($hStatus, $aParts)
$inProgress = GUICtrlCreateInput('', 0, 1, 150, 20, BitOR($ES_READONLY,$ES_CENTER), $WS_EX_STATICEDGE)
$hInProgress = GUICtrlGetHandle($inProgress)
_GUICtrlStatusBar_EmbedControl($hStatus, 0, $hInProgress)
$progress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
GUICtrlSetColor(-1, 0x008B00)
$hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($hStatus, 1, $hProgress)$hContext = GUICreate('Listview Menü', 200, 69, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel('', 0, 0, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConPath = GUICtrlCreateLabel('Pfad Anzeigen', 10, 4, 188, 17)
GUICtrlSetColor(-1, 0x000080)
GUICtrlCreateLabel('', 0, 23, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConDetail = GUICtrlCreateLabel('Details Anzeigen', 10, 27, 188, 17)
GUICtrlSetColor(-1, 0x000080)
GUICtrlCreateLabel('', 0, 46, 200, 23, $SS_ETCHEDFRAME)
GUICtrlSetState(-1, $GUI_DISABLE)
$ConNoRO = GUICtrlCreateLabel('Schreibschutz Aufheben', 10, 50, 188, 17)
GUICtrlSetColor(-1, 0x8B0000)$hSettings = GUICreate("Einstellungen", 561, 685, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
GUICtrlCreateGroup(" Startordner für Auswahl ", 20, 15, 520, 65)
$inStartFolder = GUICtrlCreateInput("", 35, 40, 450, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
GUICtrlSetBkColor(-1, 0xFFFFFF)
$btFolderSelect = GUICtrlCreateButton("...", 500, 40, 20, 20)
GUICtrlSetBkColor(-1, 0xFFD700)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup(" Verschiedenes ", 20, 95, 520, 95)
$cbSubDir = GUICtrlCreateCheckbox(' Unterordner Durchsuchen', 35, 120, 150)
GUICtrlCreateLabel("Trennzeichen", 210, 124, 80, 20)
$inDelimiter = GUICtrlCreateInput("_", 285, 121, 30, 20)
GUICtrlCreateLabel("Nummerierung Anzahl Ziffern", 345, 124, 140, 17)
$inFileNum = GUICtrlCreateInput("4", 490, 121, 30, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
$cbPrefixTmp = GUICtrlCreateCheckbox('Temporär umbenennen (Vermeidung Namenskollision)', 35, 150, 290)
$lbPrefixTmp = GUICtrlCreateLabel('Präfix', 345, 154, 50)
GUICtrlSetState(-1, $GUI_DISABLE)
$inPrefixTmp = GUICtrlCreateInput('TMP', 460, 151, 60, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup(" Bilder ", 20, 205, 520, 65)
GUICtrlCreateLabel("Bildformate, kommagetrennt", 35, 230, 171, 20)
$inFormatPict = GUICtrlCreateInput("JPG,JPEG", 230, 230, 290, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup(" Video ", 20, 285, 520, 130)
GUICtrlCreateLabel("Eigenen Ordner für Videos erstellen", 35, 315, 215, 20)
$rVideoJa = GUICtrlCreateRadio("Ja", 310, 311, 50, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$rVideoNein = GUICtrlCreateRadio("Nein", 420, 311, 50, 17)
GUICtrlCreateLabel("Name des Video Ordners", 35, 343, 160, 20)
$inVideoFolder = GUICtrlCreateInput("VIDEO", 230, 342, 290, 20)
GUICtrlCreateLabel("Videoformate, kommagetrennt", 35, 376, 185, 20)
$inFormatVideo = GUICtrlCreateInput("AVI,THM,MOV", 230, 373, 290, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateGroup(" zu löschende Dateien ", 20, 430, 520, 200)
$ListViewDel = GUICtrlCreateListView("|", 35, 455, 330, 160, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, $LVSCW_AUTOSIZE_USEHEADER)
$hLVDel = GUICtrlGetHandle($ListViewDel)
$btAddDelFile = GUICtrlCreateButton("Hinzufügen", 410, 455, 110, 25)
GUICtrlSetBkColor(-1, 0x7FFF00)
$btDelDelFile = GUICtrlCreateButton("Löschen", 410, 505, 110, 25)
GUICtrlSetBkColor(-1, 0x00BFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btSave = GUICtrlCreateButton('Speichern', 410, 645, 110, 25)
GUICtrlSetBkColor(-1, 0xFA8072)$hHelp = GUICreate("Hilfe", 641, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
$ListViewHelp = GuiCtrlCreateListView('||', 20, 20, 601, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSetBkColor(-1, 0xF5FFFA)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
$sHelp = _
'EINSTELLUNGEN|' & @CRLF & _
' "Startordner für Auswahl"|Root-Ordner zur Auswahl der Mediendateiordner' & @CRLF & _
' "Trennzeichen"|Zeichen zwischen Dateiname und Nummerierung' & @CRLF & _
' "Nummerierung Anzahl Ziffern"|Nummer in Dateinamen, Länge mit Vornullen' & @CRLF & _
' "Unterordner durchsuchen"|Alle Ordner unterhalb der Auswahl werden auch verwendet' & @CRLF & _
' "Bildformate"|Bilddateitypen, die umbenannt werden sollen' & @CRLF & _
' "Temporär Umbenennen"|Um Konflikte mit bereits existierenden Zieldateinamen' & @CRLF & _
' |zu vermeiden, werden alle Dateien vorab mit dem gewählten Präfix' & @CRLF & _
' |umbenannt und erst dann in der endgültigen Form gespeichert.' & @CRLF & _
' "Videoordner erstellen"|Eigenen Ordner für Videos in jeweiligem Ordner erstellen' & @CRLF & _
'|Alle Videodateien des Ordners werden dorthin verschoben' & @CRLF & _
' "Name Video Ordner"|Bezeichnung für anzulegende Videoordner' & @CRLF & _
' "Videoformate"|Videodateitypen, die umbenannt werden sollen' & @CRLF & _
' "zu löschende Dateien"|Dateien, die in den Ordnern gelöscht werden sollen' & @CRLF & _
'|' & @CRLF & _
'PROGRAMM|' & @CRLF & _
' "Ordner auswählen"|Ordner dessen Mediendateien umbenannt werden sollen' & @CRLF & _
'|Anwenden auf Unterordner kann unabhängig von den Vor-' & @CRLF & _
'|einstellungen gesetzt werden' & @CRLF & _
' < Einlesen >|Der/Die (Unter)Ordner werden nach den Dateitypen durchsucht.' & @CRLF & _
'|Gefundenes wird mit Pfad in das Listview eingetragen.' & @CRLF & _
'|Das Erstelldatum wird in Spalte 2 angezeigt.' & @CRLF & _
' "Checkbox Auswahl Dateien"|Auswählen/Auswahl aufheben für alle Dateien' & @CRLF & _
'|Ausgewählte Dateien werden umbenannt' & @CRLF & _
' "Radio links / rechts"|Ausrichtung Dateipfade im Listview' & @CRLF & _
' < Explorer >|Öffnet Explorer im Startordner Auswahl' & @CRLF & _
' < Umbenennen >|Gewählte Dateien werden umbenannt in:' & @CRLF & _
'|ORDNERNAME-TRENNZEICHEN-NUMMER' & @CRLF & _
'|Nummer ansteigend geordnet nach Erstelldatum' & @CRLF & _
'|Die Nummerierung beginnt in jedem Ordner bei 1' & @CRLF & _
'|Videos haben eine eigene Nummerierung' & @CRLF & _
'|' & @CRLF & _
'LISTVIEW FUNKTIONEN|' & @CRLF & _
' Doppel-Klick|Öffnet die Datei im Standardprogramm' & @CRLF & _
' Rechts-Klick|Kontext-Menü' & @CRLF & _
'| Kompletter Dateipfad als Tooltipp' & @CRLF & _
'| Alle verfügbaren Details von Bilddateien' & @CRLF & _
'| Aufheben Schreibschutz markierter Datei(en)' & @CRLF & _
'|' & @CRLF & _
'FEHLERBEHANDLUNG|' & @CRLF & _
'|Anzahl der Fehler wird auf der Oberfläche angezeigt' & @CRLF & _
'|Im Programmordner wird eine Datei "Rename.log" erstellt,' & @CRLF & _
'|dort werden Fehler protokolliert.' & @CRLF & _
'|Treten Fehler auf, wird "Rename.log" im Standardeditor geöffnet.' & @CRLF & _
'|' & @CRLF & _
'TIPP|' & @CRLF & _
'|Treten beim Umbenennen Namenskonflikte wegen bereits' & @CRLF & _
'|existierender Zieldateien auf:' & @CRLF & _
'| - Einstellungen "Temporär Umbenennen" aktivieren' & @CRLF & _
'| - Dateien erneut < Einlesen >' & @CRLF & _
'| - < Umbenennen >'
$aItem = StringSplit($sHelp, @CRLF, 1)
For $i = 1 To $aItem[0]
GUICtrlCreateListViewItem($aItem[$i], $ListViewHelp)
GUICtrlSetBkColor(-1, 0xFFFFF0)
Next$hDetail = GUICreate("Details", 561, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFFFFBB)
GUISetIcon($sPath & "\Rename Document.ico")
$ListViewDetail = GuiCtrlCreateListView('||', 20, 20, 521, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
GUICtrlSetBkColor(-1, 0xF5FFFA)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
$hLVDetail = GUICtrlGetHandle($ListViewDetail)_ReadSettingsFromINI()
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGui)While 1
[/autoit] [autoit][/autoit] [autoit]
$aMsg = GUIGetMsg(1)
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
If $aMsg[1] = $hSettings Then
GUISetState(@SW_HIDE, $hSettings)
ElseIf $aMsg[1] = $hDetail Then
GUISetState(@SW_HIDE, $hDetail)
ElseIf $aMsg[1] = $hHelp Then
GUISetState(@SW_HIDE, $hHelp)
Else
Exit
EndIf
Case $GUI_EVENT_PRIMARYUP
If $fShowContext Then
$aMPos = MouseGetPos()
$tPoint = DllStructCreate('int;int')
DllStructSetData($tPoint, 1, $aMPos[0])
DllStructSetData($tPoint, 2, $aMPos[1])
$tRectContext = _WinAPI_GetWindowRect($hContext)
If Not _WinAPI_PtInRect($tRectContext, $tPoint) Then
GUISetState(@SW_HIDE, $hContext)
$fShowContext = False
EndIf
EndIf
Case $mnuSettings
_SettingsSet()
GUISetState(@SW_SHOW, $hSettings)
Case $mnuHelp
GUISetState(@SW_SHOW, $hHelp)
Case $ConPath
GUISetState(@SW_HIDE, $hContext)
$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
If $aCurrItem[0] <> 0 Then _ToolTipMouseExit(_GUICtrlListView_GetItemText($hLV, $aCurrItem[1]), 4000)
Case $ConDetail ; == Dateidetail, bei mehreren markierten Dateien wird nur die erste Datei der Markierung verwendet
GUISetState(@SW_HIDE, $hContext)
$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
If $aCurrItem[0] <> 0 Then
$sFileDetail = _GUICtrlListView_GetItemText($hLV, $aCurrItem[1])
_ShowDetail()
EndIf
Case $ConNoRO ; == Schreibschutz aufheben, bei mehreren markierten Dateien wird der Schreibschutz für alle markierten Dateien aufgehoben
GUISetState(@SW_HIDE, $hContext)
$aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
For $i = 1 To $aCurrItem[0]
If Not FileSetAttrib(_GUICtrlListView_GetItemText($hLV, $aCurrItem[$i]), '-R') Then
MsgBox(262160, "Fehler", "Der Schreibschutz für diese Datei konnte nicht aufgehoben werden.")
Else
_GUICtrlListView_SetItemChecked($hLV, $aCurrItem[$i])
GUICtrlSetColor($aItemID[$aCurrItem[$i]], 0x00008B)
$sReadOnly = StringReplace($sReadOnly, ' ' & $aCurrItem[$i] & ' ', ' ')
$iCntReadOnly -= 1
If $iCntReadOnly = 0 Then
GUICtrlSetState($lbReadOnly, $GUI_HIDE)
Else
GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
EndIf
EndIf
Next
Case $btSelect
GUICtrlSetData($lbCntErr, 0)
GUICtrlSetData($lbCntPic, 0)
GUICtrlSetData($lbCntVid, 0)
GUICtrlSetData($progress, 0)
$sFolder = FileSelectFolder('Ordner mit Bildern auswählen', $sPathStart)
If $sFolder <> '' Then
GUICtrlSetData($inFolder, $sFolder)
GUICtrlSetState($btReadFiles, $GUI_ENABLE)
GUICtrlSetState($cbSubFolder, $GUI_ENABLE)
GUICtrlSetState($btExplorer, $GUI_ENABLE)
GUICtrlSetState($lbReadOnly, $GUI_HIDE)
GUICtrlSetData($progress, 0)
GUICtrlSetData($inProgress, '')
EndIf
Case $cbSubFolder
If BitAND(GUICtrlRead($cbSubFolder), $GUI_CHECKED) Then
$fSubFolder = True
Else
$fSubFolder = False
EndIf
Case $btReadFiles
GUICtrlSetState($cbSubFolder, $GUI_DISABLE)
If FileExists($sLOG) Then FileDelete($sLOG)
$aCountFiles[0] = 0
$aCountFiles[1] = 0
$iCntErr = 0
$iCntReadOnly = 0
$sReadOnly = ' '
_LoadListview()
If $iCntReadOnly > 0 Then
GUICtrlSetState($lbReadOnly, $GUI_SHOW)
GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
EndIf
Case $cbSelAll
If _GUICtrlListView_GetItemCount($hLV) > 0 Then
If BitAND(GUICtrlRead($cbSelAll), $GUI_CHECKED) Then
_CheckAll(True)
Else
_CheckAll(False)
EndIf
Else
GUICtrlSetState($cbSelAll, $GUI_UNCHECKED)
EndIf
Case $cbPrefixTmp
If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then
GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
$fPrefix = True
Else
GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
$fPrefix = False
EndIf
Case $rLeft, $rRight
If BitAND(GUICtrlRead($rLeft), $GUI_CHECKED) Then
_GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 0)
Else
_GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 1)
EndIf
_WinAPI_RedrawWindow($hLV)
Case $btExplorer
If $sFolder <> '' Then Run('explorer.exe /root,"' & $sFolder & '"')
Case $btRename
GUICtrlSetState($btRename, $GUI_DISABLE)
$hLog = FileOpen($sLOG, 9)
_RenameFiles()
FileClose($hLog)
Case $btFolderSelect
$sPathStart = FileSelectFolder('Start Ordner auswählen', '')
If $sPathStart <> '' Then GUICtrlSetData($inStartFolder, $sPathStart)
Case $btAddDelFile
$sDelFile = FileOpenDialog('Dateien zum Löschen wählen', $sPathStart, 'Alle(*.*)')
If $sDelFile <> '' Then GUICtrlCreateListViewItem(StringTrimLeft($sDelFile, StringInStr($sDelFile, '\', 1, -1)) , $ListViewDel)
Case $btDelDelFile
_GUICtrlListView_DeleteItemsSelected($hLVDel)
Case $btSave
_WriteSettingsToINI()
GUISetState(@SW_HIDE, $hSettings)
EndSwitch
WEndFunc _RenameFiles()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($inProgress, 'Dateien Umbenennen [0%]')
GUICtrlSetData($progress, 0)
Local $iItem = _GUICtrlListView_GetItemCount($hLV)
Local $iStep = 100/$iItem
Local $nPIC = 0, $nVID = 0, $sItem, $sFile, $sSfx, $sPath, $sNewItem, $sFolder, $sNewPath, $sLastPath, $fCheck = False
Local $aFilesToDelete = StringSplit($sDeleteList, ',')
_GUICtrlListView_BeginUpdate($hLV)
If $fPrefix Then ; == vorher umbenennen mit Präfix
For $i = 0 To $iItem -1
GUICtrlSetData($progress, ($i+1)*$iStep)
GUICtrlSetData($inProgress, 'Temporär Umbenennen [' & Int(($i+1)*$iStep) & '%]')
If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
$sItem = _GUICtrlListView_GetItemText($hLV, $i)
$sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1))
$sFile = StringTrimLeft($sItem, StringLen($sPath))
$sNewItem = $sPath & $sPrefix & '_' & $sFile
If FileMove($sItem, $sNewItem) Then
_GUICtrlListView_SetItemText($hLV, $i, $sNewItem)
Else
_GUICtrlListView_SetItemChecked($hLV, $i, False)
GUICtrlSetColor($aItemID[$i], 0xFF1493)
FileWrite($hLog, 'FEHLER_PRÄFIX "' & $sItem & '" konnte nicht zu "' & $sNewItem & '" umbenannt werden!' & @CRLF)
$iCntErr += 1
EndIf
Next
EndIf
For $i = 0 To $iItem -1
GUICtrlSetData($progress, ($i+1)*$iStep)
GUICtrlSetData($inProgress, 'Dateien Umbenennen [' & Int(($i+1)*$iStep) & '%]')
$sItem = _GUICtrlListView_GetItemText($hLV, $i)
$sSfx = StringTrimLeft($sItem, StringInStr($sItem, '.', 1, -1))
$sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1) -1)
$sFolder = StringTrimLeft($sPath, StringInStr($sPath, '\', 1, -1))
If $sPath <> $sLastPath Then
$sLastPath = $sPath
$fCheck = True
$nPIC = 0
$nVID = 0
EndIf
If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
Select
Case StringInStr($sExtPict, $sSfx)
$nPIC += 1
$sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nPIC) & '.' & StringLower($sSfx)
If FileExists($sNewPath) Then
$iCntErr += 1
FileWrite($hLog, 'NAMENSKONFLIKT "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
Else
If FileMove($sItem, $sNewPath) = 0 Then
$iCntErr += 1
FileWrite($hLog, 'FEHLER_VERSCHIEBEN ' & $sItem & @CRLF)
GUICtrlSetColor($aItemID[$i], 0xFF1493)
Else
_GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
GUICtrlSetColor($aItemID[$i], 0x228B22)
EndIf
EndIf
;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ')' & @CRLF)
Case StringInStr($sExtVideo, $sSfx)
If $iCreateVideoFolder = 1 Then
Local $sLenVid = StringLen($sVideoFolder), $sLenPath = StringLen($sPath)
If ($sLenPath > $sLenVid And StringRight($sPath, $sLenVid) <> $sVideoFolder) Or ($sLenPath < $sLenVid) Then $sPath &= '\' & $sVideoFolder
EndIf
$nVID += 1
If StringRight($sFolder, StringLen($sVideoFolder)) = $sVideoFolder Then
Local $sTmp = StringTrimRight($sPath, StringLen($sVideoFolder) +1)
$sFolder = StringTrimLeft($sTmp, StringInStr($sTmp, '\', 1, -1))
EndIf
$sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nVID) & '.' & StringLower($sSfx)
If FileExists($sNewPath) Then
$iCntErr += 1
FileWrite($hLog, 'NAMENSKONFLIKT "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
Else
If FileMove($sItem, $sNewPath,
= 0 Then
$iCntErr += 1
FileWrite($hLog, 'FEHLER_VERSCHIEBEN "' & $sItem & '" nach "' & $sNewPath & '"' & @CRLF)
GUICtrlSetColor($aItemID[$i], 0xFF1493)
Else
_GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
GUICtrlSetColor($aItemID[$i], 0x228B22)
EndIf
EndIf
;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ', 8)' & @CRLF)
EndSelect
If $fCheck Then
$fCheck = False
If UBound($aFilesToDelete) > 1 Then
For $j = 1 To $aFilesToDelete[0]
If FileExists($sPath & '\' & $aFilesToDelete[$j]) Then
If FileDelete($sPath & '\' & $aFilesToDelete[$j]) = 0 Then
$iCntErr += 1
FileWrite($hLog, 'FEHLER_LÖSCHEN ' & $sPath & '\' & $aFilesToDelete[$j] & @CRLF)
EndIf
;~ ConsoleWrite('!> FileDelete(' & $sPath & '\' & $aFilesToDelete[$j] & ')' & @CRLF)
EndIf
Next
EndIf
EndIf
Next
_GUICtrlListView_EndUpdate($hLV)
GUICtrlSetData($progress, 100)
GUICtrlSetData($inProgress, 'Dateien Umbenennen [100%]')
GUICtrlSetData($lbCntErr, $iCntErr)
If $iCntErr > 0 Then ShellExecute($sLOG)
EndFunc;==================================================================================
[/autoit] [autoit][/autoit] [autoit]
Func _OutputLen($_s, $_iLen, $_sFill='.') ; == NUR FÜR KONSOLENAUSGABE IM TEST
Local $sLen = StringLen($_s)
If $_iLen <= $sLen Then Return $_s & $_sFill
For $i = $sLen To $_iLen
$_s &= $_sFill
Next
Return $_s
EndFunc
;==================================================================================Func _ShowDetail()
[/autoit] [autoit][/autoit] [autoit]
If $sFileDetail = '' Then Return
Local $sInfo = _ImageGetInfo($sFileDetail)
Local $aTmp, $aSplit = StringSplit(StringTrimRight($sInfo, 1), @LF, 1)
If @error Then Return
_GUICtrlListView_DeleteAllItems($hLVDetail)
For $i = 1 To $aSplit[0]
$aTmp = StringSplit($aSplit[$i], '=')
If StringLen(StringStripWS($aTmp[2], 8)) Then
GUICtrlCreateListViewItem($aTmp[1] & '|' & StringStripWS($aTmp[2], 2), $ListViewDetail)
GUICtrlSetBkColor(-1, 0xFFFFF0)
EndIf
Next
WinSetTitle($hDetail, '', 'Details von "' & StringTrimLeft($sFileDetail, StringInStr($sFileDetail, '\', 1, -1)) & '"')
GUISetState(@SW_SHOW, $hDetail)
EndFuncFunc _ReadSettingsFromINI()
[/autoit] [autoit][/autoit] [autoit]
$sPathStart = IniRead($sINI, 'General', 'Startpfad', '')
$iCountNumbers = IniRead($sINI, 'General', 'n_stellig', 4)
$sDelimiter = IniRead($sINI, 'General', 'Delimiter', '_')
$iSubFolder = IniRead($sINI, 'General', 'SubFolder', 1)
If $iSubFolder = 1 Then
GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
$fSubFolder = True
Else
GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
EndIf
$iPrefix = IniRead($sINI, 'General', 'UsePrefix', 0)
If $iPrefix = 1 Then
GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
$fPrefix = True
Else
GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
EndIf
$sPrefix = IniRead($sINI, 'General', 'Prefix', 'TMP')
$sExtPict = IniRead($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
$sExtVideo = IniRead($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
If $sExtVideo <> '' Then
$sExt = $sExtPict & ',' & $sExtVideo
Else
$sExt = $sExtPict
EndIf
$iCreateVideoFolder = IniRead($sINI, 'General', 'Video_Folder_Create', 1)
$sVideoFolder = IniRead($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
$sDeleteList = IniRead($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
EndFuncFunc _WriteSettingsToINI()
[/autoit] [autoit][/autoit] [autoit]
$sPathStart = GUICtrlRead($inStartFolder)
IniWrite($sINI, 'General', 'Startpfad', $sPathStart)
$iCountNumbers = GUICtrlRead($inFileNum)
IniWrite($sINI, 'General', 'n_stellig', $iCountNumbers)
$iSubFolder = 0
If BitAND(GUICtrlRead($cbSubDir), $GUI_CHECKED) Then $iSubFolder = 1
IniWrite($sINI, 'General', 'SubFolder', $iSubFolder)
If $iSubFolder = 1 Then
GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
Else
GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
EndIf
$sDelimiter = GUICtrlRead($inDelimiter)
IniWrite($sINI, 'General', 'Delimiter', $sDelimiter)
$iPrefix = 0
If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then $iPrefix = 1
IniWrite($sINI, 'General', 'UsePrefix', $iPrefix)
IniWrite($sINI, 'General', 'Prefix', GUICtrlRead($inPrefixTmp))
$sExtPict = GUICtrlRead($inFormatPict)
IniWrite($sINI, 'General', 'Picture_Formate', $sExtPict)
$sExtVideo = GUICtrlRead($inFormatVideo)
IniWrite($sINI, 'General', 'Video_Formate', $sExtVideo)
If $sExtVideo <> '' Then
$sExt = $sExtPict & ',' & $sExtVideo
Else
$sExt = $sExtPict
EndIf
$iCreateVideoFolder = 1
If BitAND(GUICtrlRead($rVideoJa), $GUI_UNCHECKED) Then $iCreateVideoFolder = 0
IniWrite($sINI, 'General', 'Video_Folder_Create', $iCreateVideoFolder)
$sVideoFolder = GUICtrlRead($inVideoFolder)
IniWrite($sINI, 'General', 'Video_Folder_Name', $sVideoFolder)
$sDeleteList = ''
For $i = 0 To _GUICtrlListView_GetItemCount($hLVDel) -1
$sDeleteList &= _GUICtrlListView_GetItemText($hLVDel, $i) & ','
Next
If $sDeleteList <> '' Then $sDeleteList = StringTrimRight($sDeleteList, 1)
IniWrite($sINI, 'General', 'DeleteList', $sDeleteList)
EndFuncFunc _SettingsSet()
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($inStartFolder, $sPathStart)
GUICtrlSetData($inFileNum, $iCountNumbers)
GUICtrlSetData($inDelimiter, $sDelimiter)
GUICtrlSetData($inVideoFolder, $sVideoFolder)
GUICtrlSetData($inFormatVideo, $sExtVideo)
GUICtrlSetData($inFormatPict, $sExtPict)
If $iSubFolder = 1 Then
GUICtrlSetState($cbSubDir, $GUI_CHECKED)
Else
GUICtrlSetState($cbSubDir, $GUI_UNCHECKED)
EndIf
If $iPrefix = 1 Then
GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
$fPrefix = True
Else
GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
$fPrefix = False
EndIf
If $iCreateVideoFolder = 1 Then
GUICtrlSetState($rVideoJa, $GUI_CHECKED)
Else
GUICtrlSetState($rVideoNein, $GUI_CHECKED)
EndIf
_GUICtrlListView_DeleteAllItems($hLVDel)
Local $a = StringSplit($sDeleteList, ',')
For $i = 1 To $a[0]
GUICtrlCreateListViewItem($a[$i], $ListViewDel)
Next
EndFuncFunc _LoadListview()
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_DeleteAllItems($hLV)
Local $aFolderRecursive, $sFilesFound, $sAllFiles = '', $iErr = 0
If $fSubFolder Then
GUICtrlSetData($inProgress, 'Unterordner Einlesen [0%]')
$sAllFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1, '', True)
If StringLen($sAllFiles) = 1 Then
$sAllFiles = ''
Else
$sAllFiles &= Chr(0)
EndIf
$aFolderRecursive = _GetFilesFolder_Rekursiv($sFolder, $sExt, 1, 0)
If @error Then
If $sAllFiles <> '' Then
$aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
Else
$iErr = 1
EndIf
Else
$iStep = 100/$aFolderRecursive[0]
For $i = 1 To $aFolderRecursive[0]
GUICtrlSetData($progress, $i*$iStep)
GUICtrlSetData($inProgress, 'Unterordner Einlesen [' & Int($i*$iStep) & '%]')
$sFilesFound = _Multi_FileListToArray($aFolderRecursive[$i], $sExt, 1, 1, '', True)
If @error Then
ContinueLoop
Else
$sAllFiles &= $sFilesFound & Chr(0)
EndIf
Next
GUICtrlSetData($progress, 100)
GUICtrlSetData($inProgress, 'Unterordner Einlesen [100%]')
If $sAllFiles <> '' Then
$aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
EndIf
EndIf
Else
$aFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1)
If @error Then $iErr = 1
EndIf
If $iErr = 1 Then Return
_GetCountFiles($aFiles)GUICtrlSetData($progress, 0)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($inProgress, 'Datei Info Lesen [0%]')
Sleep(300)
Local $sInfo, $sDateTime, $sPath, $sLastPath, $iFolder = 0
$iStep = 100/$aFiles[0]
ReDim $aListview[$aFiles[0]][3]
ReDim $aItemID[$aFiles[0]]
For $i = 1 To $aFiles[0]
GUICtrlSetData($progress, $i*$iStep)
GUICtrlSetData($inProgress, 'Datei Info Lesen [' & Int($i*$iStep) & '%]')
$sInfo = _ImageGetInfo($aFiles[$i])
$sDateTime = _ImageGetParam($sInfo, "DateTime")
If $sDateTime = '' Then
$sDateTime = FileGetTime($aFiles[$i], 1, 1)
If $sDateTime = '' Then
ContinueLoop
Else
$sDateTime = StringRegExpReplace($sDateTime, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$1:$2:$3 $4:$5:$6')
EndIf
EndIf
$sPath = StringLeft($aFiles[$i], StringInStr($aFiles[$i], '\', 1, -1) -1)
If $sPath <> $sLastPath Then
$sLastPath = $sPath
$iFolder += 1
EndIf
$aListview[$i-1][0] = $iFolder
$aListview[$i-1][1] = $sDateTime
$aListview[$i-1][2] = $aFiles[$i]
Next
GUICtrlSetData($inProgress, 'Datei Info Lesen [100%]')
Sleep(500)
GUICtrlSetData($progress, 0)
GUICtrlSetData($inProgress, 'Dateien Laden [0%]')
_ArraySort_2ary($aListview, 0, 0)
Sleep(300)
_GUICtrlListView_BeginUpdate($hLV)
For $i = 0 To UBound($aListview) -1
GUICtrlSetData($progress, ($i+1)*$iStep)
GUICtrlSetData($inProgress, 'Dateien Laden [' & Int(($i+1)*$iStep) & '%]')
$aItemID[$i] = GUICtrlCreateListViewItem($aListview[$i][2] & '|' & $aListview[$i][0] & '|' & $aListview[$i][1], $ListView)
If StringInStr(FileGetAttrib($aListview[$i][2]), 'R') Then
GUICtrlSetColor(-1, 0xFF0000) ; == Test auf Schreibschutz
$sReadOnly &= $i & ' '
$iCntReadOnly += 1
Else
GUICtrlSetColor(-1, 0x00008B)
EndIf
Next
_GUICtrlListView_HideColumn($hLV, 1)
_GUICtrlListView_EndUpdate($hLV)
GUICtrlSetData($progress, 100)
GUICtrlSetData($inProgress, 'Dateien Laden [100%]')
GUICtrlSetState($cbSelAll, $GUI_CHECKED)
GUICtrlSetState($btRename, $GUI_ENABLE)
_CheckAll(True)
EndFuncFunc _CheckAll($_iState)
[/autoit] [autoit][/autoit] [autoit]
Local $iCount = _GUICtrlListView_GetItemCount($hLV)
If $iCount = 0 Then Return
For $i = 0 To $iCount -1
If _StringInList($sReadOnly, String($i)) Then ContinueLoop
_GUICtrlListView_SetItemChecked($hLV, $i, $_iState)
Next
EndFuncFunc _StringInList($_sStr, $_sSub, $_sDelim=' ', $_iCase=0, $_iPart=0)
[/autoit] [autoit][/autoit] [autoit]
Local $aList = StringSplit($_sStr, $_sDelim, 1)
For $i = 1 To $aList[0]
If $_iPart = 1 Then
If StringInStr($aList[$i], $_sSub, $_iCase) Then Return True
Else
If $_iCase = 1 Then
If $aList[$i] == $_sSub Then Return True
Else
If $aList[$i] = $_sSub Then Return True
EndIf
EndIf
Next
Return False
EndFuncFunc _GetCountFiles($_a)
[/autoit] [autoit][/autoit] [autoit]
Local $sExt
For $i = 1 To $_a[0]
$sExt = StringTrimLeft($_a[$i], StringInStr($_a[$i], '.', 1, -1))
If StringInStr($sExtPict, $sExt) Then
$aCountFiles[0] += 1
ContinueLoop
EndIf
If StringInStr($sExtVideo, $sExt) Then $aCountFiles[1] += 1
Next
GUICtrlSetData($lbCntPic, $aCountFiles[0])
GUICtrlSetData($lbCntVid, $aCountFiles[1])
EndFuncFunc WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hLV
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
If $hWndFrom <> $hWndListView Then Return $GUI_RUNDEFMSG
Switch DllStructGetData($tNMHDR, "Code")
Case $NM_DBLCLK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $iItem = DllStructGetData($tInfo, "Index")
If $iItem >= 0 Then ShellExecute(_GUICtrlListView_GetItemText($hLV, $iItem))
Case $NM_RCLICK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $iItem = DllStructGetData($tInfo, "Index")
If $iItem < 0 Then Return $GUI_RUNDEFMSG
If StringInStr(FileGetAttrib(_GUICtrlListView_GetItemText($hLV, $iItem)), 'R') Then
GUICtrlSetState($ConNoRO, $GUI_ENABLE)
Else
GUICtrlSetState($ConNoRO, $GUI_DISABLE)
EndIf
Local $aMPos = MouseGetPos()
WinMove($hContext, '', $aMPos[0]-20, $aMPos[1]-70)
GUISetState(@SW_SHOW, $hContext)
$fShowContext = True
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY;----------------------------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
; Function _ToolTipMouseExit("text", [time [, x=-1 [, y=-1 [, "title" [, icon [, options]]]]]] )
;
; Description usual ToolTip, will be terminate with mouse move, latest after time
;
; Parameter same as used by ToolTip
; if x Or y =-1 then ToolTip will be placed at mouse position
; optional $TIME default is 3000 ms
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
If $TIME = -1 Then $TIME = 3000
Local $start = TimerInit(), $pos0 = MouseGetPos()
If ($x = -1) Or ($y = -1) Then
ToolTip($TEXT, $pos0[0], $pos0[1]-15, $TITLE, $ICON, $OPT)
Else
ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
EndIf
Do
Sleep(50)
$pos = MouseGetPos()
Until (TimerDiff($start) > $TIME) Or _
(Abs($pos[0] - $pos0[0]) > 10 Or _
Abs($pos[1] - $pos0[1]) > 10)
ToolTip('')
EndFunc ;==>_ToolTipMouseExit;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Recursive listing of files and/or folders
; Parameter(s): $sPath Basicpath of listing ('.' -current path, '..' -parent path)
; $sExt Extension for file selection '*' or -1 for all (Default)
; $iDir -1 Files+Folder(Default), 0 only Files, 1 only Folder
; optional: $iRetType 0 for Array, 1 for String as Return
; optional: $sDelim Delimiter for string return
; 0 -@CRLF (Default) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Default) or string with found pathes of files and/or folder
; Array[0] includes count of found files/folder
; 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 $strFiles = '' Then Return SetError(1,0,0)
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]
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;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _Multi_FileListToArray
; Description......: Dateien und/oder Ordner eines Pfades auflisten, mehrere Wildcards möglich
; Parameter(s).....: $_sPath Pfad für Auflistung
; .................: $_sFilter Filter für Dateityp(en), Wildcard ist "*" (Standard), mehrere Filter möglich, trennen mit "," z.B. "jpg,jpeg,gif,png,bmp"
; .................: $_iFlag 0 (Standard) = Dateien u. Ordner, 1 = nur Dateien, 2 = nur Ordner
; .................: $_fFullPath 0 (Standard) = nur Datei/Ordnername, 1 = kpl. Pfad
; .......optional..: $_sDirChar Standard "", Zeichen(folge), die einer Ordnerausgabe vorangestellt werden kann (z.B. "[D] ")
; .......optional..: $_fStrRet 'False' (Standard), mit 'True' Rückgabe eines Chr(0) getrennten Strings, statt eines Arrays
; Return Value(s)..: Erfolg Array mit den Dateien/Ordnern, Anzahl an $a[0]
; .................: Fehler 0 @error: 1-Pfad existiert nicht; 2-Filter fehlerhaft; 3-Flag fehlerhaft; 4-nichts gefunden
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _Multi_FileListToArray($_sPath, $_sFilter='*', $_iFlag=0, $_fFullPath=0, $_sDirChar='', $_fStrRet=False)
If Not FileExists($_sPath) Then Return SetError(1,0,0)
If StringRegExp($_sFilter, '[.;\s]') Then Return SetError(2,0,0)
If $_iFlag < 0 Or $_iFlag > 2 Then Return SetError(3,0,0)
If StringRight($_sPath, 1) <> '\' Then $_sPath &= '\'
Local $fAll = False, $sFiles = '', $aFilter[2] = [1,'*'], $hSearch, $sFound, $aRet, $sSuffix, $sPath = ''
If $_fFullPath Then $sPath = $_sPath
If $_sFilter = '*' Then $fAll = True
If Not $fAll Then $aFilter = StringSplit($_sFilter, ',')
$hSearch = FileFindFirstFile($_sPath & '*.*')
While True
$sFound = FileFindNextFile($hSearch)
If @error Then ExitLoop
Switch $_iFlag
Case 0
If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ; == alle Ordner
$sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
Else ; == Dateien Filtern
If $fAll Then
$sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
Else
For $i = 1 To $aFilter[0] ; == Dateien aus Filter
$sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
If $aFilter[$i] = $sSuffix Then
$sFiles &= $sPath & $sFound & Chr(0)
ExitLoop
EndIf
Next
EndIf
EndIf
Case 1 ; == Dateien
If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
If $fAll Then
$sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
Else
For $i = 1 To $aFilter[0] ; == Dateien aus Filter
$sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
If $aFilter[$i] = $sSuffix Then
$sFiles &= $sPath & $sFound & Chr(0)
ExitLoop
EndIf
Next
EndIf
Case 2 ; == Ordner
If Not StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
$sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
EndSwitch
WEnd
If $_fStrRet And $sFiles <> '' Then Return StringTrimRight($sFiles, 1)
$aRet = StringSplit(StringTrimRight($sFiles, 1), Chr(0))
If @error Then Return SetError(4,0,0)
Return $aRet
EndFunc ;==> _Multi_FileListToArray;------------------------------------------------------------------------------------------------------------
[/autoit]
; Function _ArraySort_2ary(ByRef $ARRAY [, $DIM_1ST=0 [, $DESCENDING=0 [$REVERSE=False]]])
;
; Description sort an 2D-Array 2-ary
; BaseIndex is 0
; sort the whole array
;
; Parameter $ARRAY: Array to sort
; optional $DIM_1ST: MainSortIndex; 1st Dim. [0] or last occurence in 2nd Dim.[all other values] (default 0)
; optional $DESCENDING: Sort ascending[0]/descending[1] (default 0)
; optional $REVERSE: Sort 2nd Dimension reverse to 1st Dimension (default False)
;
; Return Succes ByRef 2-ary sorted Array
; Failure 0 set @error
; @error = 1 given array is not array
; @error = 2 given array has only 1 dimension
;
; Requirements By using numeric entry, be sure that type is "number" for correct sort
; Works with any occurences in 2nd Dimension
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;------------------------------------------------------------------------------------------------------------
Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DESCENDING=0, $REVERSE=False)
If ( Not IsArray($ARRAY) ) Then
SetError(1)
Return 0
EndIf
Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0
Local $UBound2nd = UBound($ARRAY,2)
If @error = 2 Then
SetError(2)
Return 0
EndIf
If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1
Local $arTmp[1][$UBound2nd]
_ArraySort($ARRAY,$DESCENDING,0,0,$DIM_1ST)
If $REVERSE Then
Switch $DESCENDING
Case 0
$DESCENDING = 1
Case 1
$DESCENDING = 0
EndSwitch
EndIf
For $u = 0 To $UBound2nd-1
For $i = 0 To UBound($ARRAY)-1
If $sortYES = 0 Then
If $u > 0 Then
If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _
( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then
$sortYES = 1
$FIRST = $i
EndIf
Else
If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then
$sortYES = 1
$FIRST = $i
EndIf
EndIf
ElseIf $sortYES = 1 Then
If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then
$sortYES = 0
$LAST = $i +1
ReDim $arTmp[$LAST-$FIRST][$UBound2nd]
$tmpFIRST = $FIRST
For $k = 0 To UBound($arTmp)-1
For $l = 0 To $UBound2nd-1
$arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l]
Next
$tmpFIRST += 1
Next
$tmpFIRST = $FIRST
Switch $DIM_1ST
Case 0
If $u = $UBound2nd-1 Then
_ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1)
Else
_ArraySort($arTmp,$DESCENDING,0,0,$u+1)
EndIf
For $k = 0 To UBound($arTmp)-1
For $l = 1 To $UBound2nd-1
$ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
Next
$tmpFIRST += 1
Next
Case $UBound2nd-1
If $u = $UBound2nd-1 Then
_ArraySort($arTmp,$DESCENDING,0,0,0)
Else
_ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1-$u-1)
EndIf
For $k = 0 To UBound($arTmp)-1
For $l = 0 To $UBound2nd-2
$ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
Next
$tmpFIRST += 1
Next
EndSwitch
EndIf
EndIf
Next
$sortYES = 0
Next
EndFunc ;==>_ArraySort_2aryHier noch ein paar Bilder:
[Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer01_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer02_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer03_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer04_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer05_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer06_t.gif]
[Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer4_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer5_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer6_t.gif]DL bisher: 24
-
Also doch bloß Arroganz°! Das hat nichts mit Dünnhäutigkeit meinerseits zu tun.
Es reicht!
Damit hast du den Bogen überspannt.
Verwarnung und [CLOSED] -
Hi,
ich habs mal noch etwas umgebaut und eine Funktion eingefügt (_GuiCtrlTab_ItemStateAble) zum wahlweisen Enablen/Disablen eines (mehrerer) beliebigen Tab-Items.Spoiler anzeigen
[autoit]#include <GuiConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTab.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>OnAutoItExitRegister('OnAutoItExit')
[/autoit] [autoit][/autoit] [autoit]
AdlibRegister('_Check', 50)Global Const $HC_ACTION = 0
[/autoit] [autoit][/autoit] [autoit]Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
[/autoit] [autoit][/autoit] [autoit]
Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)
Global $hHook2 = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
Global $check = False, $IndexMouseOver
Global $aDisableItem[1] = [0] ; == Array zum Speichern der Disable-Item$Form1 = GUICreate("Testfenster", 297, 341, 210, 144)
[/autoit] [autoit][/autoit] [autoit]
$Tab = GUICtrlCreateTab(8, 8, 280, 304)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$tab1 = GUICtrlCreateTabItem("Tab1")
$tab2 = GUICtrlCreateTabItem("Tab2")
$tab3 = GUICtrlCreateTabItem("Tab3")
$tab4 = GUICtrlCreateTabItem("Tab4")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)Global $hookGUI = $Form1, $hookID = $Tab
[/autoit] [autoit][/autoit] [autoit]$countTimer = 0
[/autoit] [autoit][/autoit] [autoit]
$fTimer = True
$timer = TimerInit()
While 1
If $fTimer And TimerDiff($timer) >= 5000 Then
$countTimer += 1
$fTimer = False
Switch $countTimer
Case 1
MsgBox(0, '', 'Disable Tab2 für 5 Sekunden')
_GuiCtrlTab_ItemStateAble($Tab, 1, $GUI_DISABLE)
$timer = TimerInit()
$fTimer = True
Case 2
MsgBox(0, '', 'Enable Tab2 wieder')
_GuiCtrlTab_ItemStateAble($Tab, 1, $GUI_ENABLE)
EndSwitch
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc _GuiCtrlTab_ItemStateAble($_hWnd, $_iIndex, $_iState) ; == $_iState: $GUI_ENABLE / $GUI_DISABLE
[/autoit] [autoit][/autoit] [autoit]
If Not IsHWnd($_hWnd) Then $_hWnd = GUICtrlGetHandle($_hWnd)
Local $iCount = _GUICtrlTab_GetItemCount($_hWnd)
If $_iIndex < 0 Or $_iIndex > $iCount -1 Then Return
If $_iState <> $GUI_ENABLE Then $_iState = $GUI_DISABLE
Switch $_iState
Case $GUI_ENABLE
Local $found = False
For $i = 1 To $aDisableItem[0]
If $aDisableItem[$i] = $i Then
$found = True
ExitLoop
EndIf
Next
If Not $found Then Return
Local $k = 0, $aTmp[$aDisableItem[0]] = [$aDisableItem[0] -1]
For $j = 1 To $aDisableItem[0]
If $j = $i Then ContinueLoop
$k += 1
$aTmp[$k] = $aDisableItem[$j]
Next
$aDisableItem = $aTmp
Case $GUI_DISABLE
For $i = 1 To $aDisableItem[0]
If $aDisableItem[$i] = $_iIndex Then Return
Next
$aDisableItem[0] += 1
ReDim $aDisableItem[$aDisableItem[0]+1]
$aDisableItem[$aDisableItem[0]] = $_iIndex
EndSwitch
EndFuncFunc _MouseProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Select
Case $nCode < 0
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case Not _MouseOverTabItem($hookGUI, $hookID)
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case $wParam = $WM_LBUTTONDOWN
If $nCode = $HC_ACTION Then
$check = True ; Überprüfung aktivieren
Return -1 ; Mausklick wird ignoriert ==> TabItem noch nicht aktiviert
EndIf
EndSelect
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_MouseProcFunc _KeyProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $tKEYHOOKS, $vkCode
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If ControlGetFocus($Form1) <> 'SysTabControl321' Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
$vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
If $wParam = $WM_KEYDOWN Then
Switch $vkCode
Case 0x25, 0x27
$check = True
Return -1
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProcFunc _Check()
[/autoit] [autoit][/autoit] [autoit]
If Not $check Then Return
For $i = 1 To $aDisableItem[0]
If $IndexMouseOver = $i Then
$check = False
Return
EndIf
Next
_GUICtrlTab_SetCurSel(GUICtrlGetHandle($Tab), $IndexMouseOver)
$check = False
EndFunc ;==>_CheckFunc _MouseOverTabItem($GUI, $TabID) ; == True wenn Maus über einem der TabItem
[/autoit] [autoit][/autoit] [autoit]
If Not BitAND(WinGetState($GUI),
Then Return False
Local $old = Opt('MouseCoordMode', 2)
Local $posM = MouseGetPos(), $tMouse = DllStructCreate($tagPOINT)
DllStructSetData($tMouse, 1, $posM[0])
DllStructSetData($tMouse, 2, $posM[1])
Opt('MouseCoordMode', $old)
Local $tTabItem, $iCountItem = _GUICtrlTab_GetItemCount(GUICtrlGetHandle($TabID))
$IndexMouseOver = -1
For $i = 0 To $iCountItem -1
$tTabItem = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $i, 1)
If _WinAPI_PtInRect($tTabItem, $tMouse) Then
$IndexMouseOver = $i
Return True
EndIf
Next
Return False
EndFunc ;==>_MouseOverTabItem;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
; Description: Returns the co-ordinates of a TabItem relatively to the GUI co-ordinates
; Parameter(s): $GUI - window handle
; $TabID - Tab ID (not handle!)
; $iTabItem - TabItem index
; $iReturnType - Return type array=0 (default), RECT-structure=1
; Return Value(s): Array or structure with co-ordinates of a TabItem (left, top, right, bottom)
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
Local $hWnd = GUICtrlGetHandle($TabID)
Local $TabPos = ControlGetPos($GUI, '', $TabID)
Local $tRECT = DllStructCreate("int Left;int Top;int Right;int Bottom")
Local $pRect = DllStructGetPtr($tRECT)
GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
Local $posLeft = $TabPos[0]+2, $posTop = $TabPos[1]+2
Local $width = (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
Local $height = DllStructGetData($tRECT,4) - DllStructGetData($tRECT,2)
If $iTabItem > 0 Then
For $i = 0 To $iTabItem -1
GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
$posLeft += (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
Next
EndIf
If $iReturnType Then
DllCall("user32", 'long', 'SetRect', 'ptr', $pRECT, 'long', $posLeft, _
'long', $posTop, 'long', $posLeft+$width, 'long', $posTop +$height)
Return $tRECT
Else
Local $aOut[4] = [$posLeft, $posTop, $posLeft +$width, $posTop +$height]
Return $aOut
EndIf
EndFunc ;==>_GUICtrlTab_GetItemRectRelativFunc OnAutoItExit()
[/autoit]
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_MouseProc)
_WinAPI_UnhookWindowsHookEx($hHook2)
DllCallbackFree($hStub_KeyProc)
EndFunc ;==>OnAutoItExit -
Ich hatte das, wie folgt gelöst. Im Bsp. ist TAB-Item3 Passwort-geschützt (pass)
Spoiler anzeigen
[autoit]#include <GuiConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTab.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>OnAutoItExitRegister('OnAutoItExit')
[/autoit] [autoit][/autoit] [autoit]
AdlibRegister('_CheckPass', 50)Global Const $HC_ACTION = 0
[/autoit] [autoit][/autoit] [autoit]Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
[/autoit] [autoit][/autoit] [autoit]
Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)
Global $hHook2 = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
Global $hTab, $lastTab = 0, $checkPass = FalseGlobal $Passwort = 'pass', $passItem = 2 ; <== 0-basierter Index des PW-geschützten TabItems
[/autoit] [autoit][/autoit] [autoit]$Form1 = GUICreate("Testfenster", 297, 341, 210, 144)
[/autoit] [autoit][/autoit] [autoit]
$Tab = GUICtrlCreateTab(8, 8, 280, 304)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$tab1 = GUICtrlCreateTabItem("Tab1")
$tab2 = GUICtrlCreateTabItem("Tab2")
$tab3 = GUICtrlCreateTabItem("Tab3")
$tab4 = GUICtrlCreateTabItem("Tab4")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)Global $hookGUI = $Form1, $hookID = $Tab
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Tab
Switch GUICtrlRead($Tab)
Case 0
WinSetTitle($Form1, '', ' >> Tab1 aktiviert <<')
Case 1
WinSetTitle($Form1, '', ' >> Tab2 aktiviert <<')
Case 2
WinSetTitle($Form1, '', ' >> Tab3 aktiviert <<')
Case 3
WinSetTitle($Form1, '', ' >> Tab4 aktiviert <<')
EndSwitch
Sleep(1000)
WinSetTitle($Form1, '', 'Testfenster')
EndSwitch
WEndFunc _MouseProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Select
Case $nCode < 0
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case Not _MouseOverTabItem($hookGUI, $hookID, $passItem)
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
Case $wParam = $WM_LBUTTONDOWN
If $nCode = $HC_ACTION Then
$checkPass = True ; Überprüfung aktivieren
Return -1 ; Mausklick wird ignoriert ==> TabItem noch nicht aktiviert
EndIf
EndSelect
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_MouseProcFunc _KeyProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $tKEYHOOKS, $vkCode
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If ControlGetFocus($Form1) <> 'SysTabControl321' Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
$vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
If $wParam = $WM_KEYDOWN Then
Switch $vkCode
Case 0x25 ; ==> Pfeil li.
If GUICtrlRead($hookID) - 1 = $passItem Then
$checkPass = True ; Überprüfung aktivieren
Return -1 ; Tastendruck wird ignoriert ==> TabItem noch nicht aktiviert
EndIf
Case 0x27 ; ==> Pfeil re.
If GUICtrlRead($hookID) + 1 = $passItem Then
$checkPass = True ; Überprüfung aktivieren
Return -1 ; Tastendruck wird ignoriert ==> TabItem noch nicht aktiviert
EndIf
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProcFunc _CheckPass()
[/autoit] [autoit][/autoit] [autoit]
If Not $checkPass Then Return
If InputBox('Passwort', 'Bitte Passwort eingeben:') == $Passwort Then
_GUICtrlTab_SetCurSel(GUICtrlGetHandle($Tab), $passItem)
Else
MsgBox(0, 'Fehler', 'Falsches Passwort!')
EndIf
$checkPass = 0
EndFunc ;==>_CheckPassFunc _MouseOverTabItem($GUI, $TabID, $iTabItem)
[/autoit] [autoit][/autoit] [autoit]
If Not BitAND(WinGetState($GUI),
Then Return False
Local $old = Opt('MouseCoordMode', 2)
Local $posM = MouseGetPos(), $tMouse = DllStructCreate($tagPOINT)
DllStructSetData($tMouse, 1, $posM[0])
DllStructSetData($tMouse, 2, $posM[1])
Opt('MouseCoordMode', $old)
Local $tTabItem = _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, 1)
If _WinAPI_PtInRect($tTabItem, $tMouse) Then
Return True
Else
Return False
EndIf
EndFunc ;==>_MouseOverTabItem;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
; Description: Returns the co-ordinates of a TabItem relatively to the GUI co-ordinates
; Parameter(s): $GUI - window handle
; $TabID - Tab ID (not handle!)
; $iTabItem - TabItem index
; $iReturnType - Return type array=0 (default), RECT-structure=1
; Return Value(s): Array or structure with co-ordinates of a TabItem (left, top, right, bottom)
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GUICtrlTab_GetItemRectRelativ($GUI, $TabID, $iTabItem, $iReturnType=0)
Local $hWnd = GUICtrlGetHandle($TabID)
Local $TabPos = ControlGetPos($GUI, '', $TabID)
Local $tRECT = DllStructCreate("int Left;int Top;int Right;int Bottom")
Local $pRect = DllStructGetPtr($tRECT)
GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
Local $posLeft = $TabPos[0]+2, $posTop = $TabPos[1]+2
Local $width = (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
Local $height = DllStructGetData($tRECT,4) - DllStructGetData($tRECT,2)
If $iTabItem > 0 Then
For $i = 0 To $iTabItem -1
GUICtrlSendMsg($TabID, $TCM_GETITEMRECT, $iTabItem, $pRect)
$posLeft += (DllStructGetData($tRECT,3) - DllStructGetData($tRECT,1))
Next
EndIf
If $iReturnType Then
DllCall("user32", 'long', 'SetRect', 'ptr', $pRECT, 'long', $posLeft, _
'long', $posTop, 'long', $posLeft+$width, 'long', $posTop +$height)
Return $tRECT
Else
Local $aOut[4] = [$posLeft, $posTop, $posLeft +$width, $posTop +$height]
Return $aOut
EndIf
EndFunc ;==>_GUICtrlTab_GetItemRectRelativFunc OnAutoItExit()
[/autoit] [autoit][/autoit] [autoit][/autoit]
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_MouseProc)
_WinAPI_UnhookWindowsHookEx($hHook2)
DllCallbackFree($hStub_KeyProc)
EndFunc ;==>OnAutoItExit -
OK, nun reicht es.
Wir alle wissen spätestens nach dem krampfhaften Bemühen des TE sein Vorhaben schönzureden, dass es sich um ein Captcha-Auslesen handelt.
Verstoß gegen die Forenregeln --- [CLOSED]