Hallo just me!
Ich habe jetztmal einiges probiert und ein paar Veränderungen unternommen. Dazu erst einmal der vollständige neue Code, in der sich unten anschließenden Erläuterungen dazu werde ich auch auf Deine Anregungen aus Deinem letzten Post eingehen.
Code: Select all
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance force
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetTitleMatchMode, RegEx
SetBatchLines, -1
;------------------------------------------------------------------------
; Shell-Objekt erzeugen
ShellApp := ComObjCreate("Shell.Application")
;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
GroupAdd, Explorer, ahk_class ExploreWClass
GroupAdd, Explorer, ahk_class CabinetWClass
;------------------------------------------------------------------------
; Dateien
AuswahlDatei := A_ScriptDir . "\Auswahl.txt" ; A_AppData
VorgabenDatei := A_ScriptDir . "\Bestandsvorgaben.txt"
Auswahl := FileExist(AuswahlDatei) ? FileOpen(AuswahlDatei, "r").Read() : ""
If !(File := FileOpen(VorgabenDatei, "r")){
MsgBox, 16, Fehler!, Die Datei %VorgabenDatei% konnte nicht geöffnet werden!
; ExitApp
}
Vorgaben := StrSplit(File.Read(), "`n", "`r")
File.Close()
;------------------------------------------------------------------------
; Auswahlfenster erstellen
F8::
Rows := (L := Vorgaben.Length()) > 10 ? 10 : L
GuiText_1 := "Wählen Sie hier den Standard für das nächste Umbenennungsprojekt aus!"
Gui, Margin, 20, 20
Gui, Font, s10 , Verdana
Gui, Add, Text, xm w350, %GuiText_1%
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
For Each, Vorgabe In Vorgaben
{
Felder := StrSplit(Vorgabe, "`t")
Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
LV_ModifyCol(A_Index, "AutoHdr")
Gui, Add, Edit, cblue xm h25 w100 , %Auswahl%
Gui, Add, Edit, cblue x135 yp h25 w70 , %SignVorlage%
Gui, Add, Edit, cblue x220 yp h25 w70 , %IndexVorlage%
Gui, Add, Text, x123 yp+5 h25 w15 , _
Gui, Add, Text, x210 yp h25 w15 , -
Gui, Add, Button, xm h30 w100 Default gAnwenden, Anwenden
Gui, Add, Button, x145 yp h30 w100 gNeuerstellen, Neu Erstellen
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen
/*
Gosub, Auswahl
Return
;------------------------------------------------------------------------
; Auswahlfenster anzeigen
F8::
Auswahl:
*/
Menu, Tray, Icon, , , 1
;Suspend, On
GuiControl, Focus, BestandAuswahl
Gui, Show, x100 y100, Signierungsvorlagen
Return
;------------------------------------------------------------------------
; Auswahl übernehmen
Anwenden:
If !(Row := LV_GetNext())
{
MsgBox, 16, Fehler!, Bitte wählen Sie einen Bestand aus!
GuiControl, Focus, BestandAuswahl
Return
}
LV_GetText(AktSign, Row, 1)
LV_GetText(SignVorlage, Row, 2)
LV_GetText(IndexVorlage, Row, 3)
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
; hier müßte wohl auch die externe Abspeicherung stattfinden!
If (AktSign <> Auswahl)
{
Auswahl := AktSign
File := FileOpen(AuswahlDatei, "w")
File.Write(Auswahl)
File.Close()
}
Gui, Cancel
Gosub, Anzeige
;Suspend, Off
Menu, Tray, Icon, , , 0
Return
;------------------------------------------------------------------------
; Neue Vorlage abspeichern
Neuerstellen:
Gui, Cancel
MsgBox, Ihre neu erstellte Vorlage wurde abgespeichert.
return
;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Cancel
;ExitApp
return
;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F8::
Anzeige:
VorschauSign := Format("{:0" . StellenSign . "}", 1)
VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
Progress, m2 fs12 zh0 ct0000ff CWffffff, %VorschauMsg%, , Vorschau, Verdana
SetTimer, ProgressOff, 2000
Return
ProgressOff:
Progress, Off
Return
;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer
<!LButton::
; Explorerfenster bestimmen
ExplorerID := WinExist()
ShellWin := 0
For Win In ShellApp.Windows {
If (Win.HWND = ExplorerID) {
ShellWin := Win
Break
}
}
If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
Return
; Auswahl nach unten erweitern
Send, +{LButton}
; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
MsgBox, Sie müssen mindestens eine Datei markieren!
Return
}
SelectedItems := []
For Item In ShellWin.Document.SelectedItems
SelectedItems.Push(Item)
LetzteDatei := SelectedItems.RemoveAt(1) ; erste (bzw. letzte) Datei aus dem Array entfernen ...
SelectedItems.Push(LetzteDatei) ; ... und wieder anhängen
Anzahl := SelectedItems.Length()
; Prüfen, ob die Dateinamenserweiterungen angezeigt werden
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-viewoptions
ShowExt := (ShellWin.Document.ViewOptions & 2) ; SFVVO_SHOWEXTENSIONS (0x00000002)
; MsgBox, 0, ShowExt, %ShowExt%
; Benutzereingaben zum Umbenennen holen
LetzteSign := Format("{:0" . StellenSign . "}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%
If (ErrorLevel) {
LetzteSign--
Return
}
If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
LetzteSign := Format("{:0" . StellenSign . "}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := 0 ; Setzt Index auf 0
}
Else {
StringSplit, BoxArray, BoxSign, `,
If (BoxArray1 = "")
LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
Else
LetzteSign := Format("{:0" . StellenSign . "}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := BoxArray2
}
; Dateien umbenennen
ShellWin.Document.SelectItem(SelectedItems[1], 4)
For Index, Item In SelectedItems {
ItemPath := Item.Path
SplitPath, ItemPath, DateiName, , Erweiterung
LetzterIndex := Format("{:0" . StellenIndex . "}", LetzterIndex) ; Setzt Index auf 1 in 2 Ziffern
Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex . (ShowExt ? "." . Erweiterung : "")
LetzterIndex++
}
; Fertig
; Letzte Datei selektieren
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
For Index, Item In SelectedItems
Item := ""
ShellWin := ""
Return
#If ; Ende des bedingten HotKey
;------------------------------------------------------------------------
; Beenden des Scriptes
Escape::
ExitApp
Return
1.) Ich habe die sort-Option für die
ListView eingefügt, das klappt prima.
2.) Ich habe jetzt alle
Gui, Destroy durch
Gui, Cancel, ersetzt, jetzt kann ich die Gui auch beim laufenden Script wieder aufrufen.
3.) Ich habe die
Suspend-Befehle auskommentiert und merke keinen Unterschied. Ich weiß nicht, was die bewirken sollten.
4.) Ich habe die Gui erweitert um die bereits in meinem letzten Post angedeutete Eingabezeile, wie sie in der alten auch war und dafür gesorgt, daß der letzte Bestandsname ("AktSign" bzw. "Auswahl") gleich mit angezeigt wird. Bei den anderen Werten geht das ja noch nicht, weil sie in der
Auswahl.txt ja nicht mit abgespeichert werden. Aber auch hier wird der Wert nur erneuert, wenn ich das Script reloade. Also selbst wenn in der Auswahl-Datei bereits etwas anderes steht, wird noch der Wert angezeigt.
5.) Ich habe einen weiteren Button eingefügt, dem ich den Namen "Neu erstellen" gegeben habe. Dahinter steht vorerst nur eine
MsgBox, später soll dann darüber das Abspeichern von neuen Datensätzen für Vorlagen ausgelöst werden. Es ist immernoch am einfachsten, wenn die berechtigten Personen das direkt über das AHK-Tool erledigen können. Dann muß die Vorlagendatei nicht jedesmal dazu in unserem Netz gesucht separat geöffnet werden und es bedarf u.a. auch keiner weiteren genaueren Anleitung durch mich.
6.) Ich habe die beiden Module "Auswahlfenster erstellen" und "Auswahlfenster anzeigen" zusammengezogen, indem ich am Ende des einen das
Gosub, Auswahl und am Anfang des anderen
Auswahl: auskommentiert habe und den Hotkey F8 ganz oben an die Erstellung der Gui gesetzt habe. Neu ist dadurch:
a) Die Gui erscheint nicht mehr automatisch beim Start oder Reload des Scripts. Das war ja auch so gewollt.
b) Beim ersten Drücken von F8 öffnet sich auch wie vorgesehen das Fenster zur Auswahl mit der sortierten Liste.
c) Möchte ich die Gui aber ein weiteres Mal aufrufen, kommt jedesmal die Fehlermeldung
"Error: The same variable cannot be used for more than one control.
Specifically: vBestandAuswahl Sort"
mit Verweis (Pfeilchen) auf die Zeile mit dem Code
Code: Select all
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
an dieser Zeile habe ich aber gar nichts verändert! Und hier ist auch keine Variable, die ich doppelt eingesetzt hätte.
Ich habe keine Ahnung, was das zu bedeuten hat.
Du schlägst u.a. vor:
Das Auswahlfenster wird am Anfang der Routine für das Umbenennen angezeigt.
Im Prinzip ist das ja so vorgesehen. Wenn man was umzubenennen hat, holt man sich mit F8 die Auswahl und sucht sich für den aktuellen Bestand die Vorgaben aus.
Viele Grüße von Meister Lampe