Ja, aber diesmal anscheinend besonders gemein. Oben die
funtionierten ohne Prozentzeichen. Jetzt klappt es aber.
Ein anscheinend ähnliches Problem habe ich jetzt wieder, aber da klappt es weder mit noch ohne Prozentzeichen. Um leichter prüfen zu können, ob und wie sich die Datei verändert hat, hatte ich oben noch folgende Zeile eingefügt:
wird nicht aufgerufen. Auch wenn ich den Namen in Prozentzeichen setze.
Ich habe am Ende der Subroutine "Neuerstellen" jetzt eine MsgBox gesetzt, in der man sich entscheiden kann, ob man zurück zum Auswahlfenster (also der Gui mit der Listview) gehen möchte, z.B. falls man weitere neue Vorlagen eingeben möchte oder ob man den Vorgang abschließen möchte, um z.B. gleich mit dem Signieren zu beginnen. Dann wird jeweils die Gui (die jetzt auch den Namen "Auswahlfenster" erhalten hat) bzw. die Anzeige aufgerufen. Meine Frage dazu: Was eignet sich besser zu diesem Zweck -
? Ich will ja weitergehen zu diesen anderen Modulen, aber ich muß ja von dort nach deren Ablauf nicht wieder zurückkehren.
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
;------------------------------------------------------------------------
; Vorlagendateien zum Abspeichern definieren
AuswahlDatei := A_ScriptDir . "\Auswahl.txt" ; zuletzt verwendeter Vorlagenname, lokal gespeichert
; Auflistung im Intranetordner des Archivs:
;VorgabenDatei := "Pfad ... \Bestandsvorgaben.txt"
; Auflistung zum Ausprobieren:
VorgabenDatei := A_ScriptDir . "\Bestandsvorgaben.txt"
^!F8::Run, Notepad.exe, %VorgabenDatei%
; Vorlagen und Auswahlen aufrufen und einlesen
F8::
Auswahlfenster:
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 und anzeigen
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 vAktSignEingabe, ;%Auswahl%
Gui, Add, Edit, cblue x135 yp h25 w70 vSignEingabe, ;%SignVorlage%
Gui, Add, Edit, cblue x220 yp h25 w70 vIndexEingabe, ;%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
; Button "Neu Erstellen" wird in der Standardversion auskommentiert
Gui, Add, Button, x145 yp h30 w100 gNeuerstellen, Neu Erstellen
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen
Menu, Tray, Icon, , , 1
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)
LetzteSign := 0
; hier müßte wohl auch die externe Abspeicherung stattfinden!
If (AktSign <> Auswahl)
{
Auswahl := AktSign
File := FileOpen(AuswahlDatei, "w")
File.Write(Auswahl)
File.Close()
}
Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return
;------------------------------------------------------------------------
; Neue Vorlage abspeichern
Neuerstellen:
Gui, Submit, NoHide ; Speichert die Benutzereingaben für eine neue Vorlage
; AktSignEingabe darf nicht leer sein
AktSignEingabe := Trim(AktSignEingabe)
If (StrLen(AktSignEingabe) = 0)
{
MsgBox, 16, Fehler!, Der Bestandsname darf nicht leer sein!
GuiControl, Focus, AktSignEingabe
Return
}
; AktSignEingabe darf nicht bereits vergeben sein
Loop, % LV_GetCount()
{
LV_GetText(AktSignLV, A_Index)
If (AktSignEingabe = AktSignLV)
{
MsgBox, 16, Fehler!, Der Bestandsname ist bereits vergeben!
GuiControl, Focus, AktSignEingabe
Return
}
}
; SignEingabe darf nicht leer sein
SignEingabe := Trim(SignEingabe)
If (StrLen(SignEingabe) = 0)
{
MsgBox, 16, Fehler!, Die Signaturvorgabe darf nicht leer sein!
GuiControl, Focus, SignEingabe
Return
}
; IndexEingabe darf nicht leer sein
IndexEingabe := Trim(IndexEingabe)
If (StrLen(IndexEingabe) = 0)
{
MsgBox, 16, Fehler!, Der Indexvorgabe darf nicht leer sein!
GuiControl, Focus, IndexEingabe
Return
}
; Alles OK, verarbeiten
AktSignNeu := AktSignEingabe
StellenSignNeu := StrLen(SignEingabe)
StellenIndexNeu := StrLen(IndexEingabe)
SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 0)
IndexVorlageNeu := Format("{:0" . StellenIndexNeu . "}", 0)
FileAppend , `n%AktSignNeu% `t%SignVorlageNeu% `t%IndexVorlageNeu%, %VorgabenDatei%
; Auswahldatei updaten
VorschauMsgNeu = %AktSignNeu%_%SignVorlageNeu%-%IndexVorlageNeu%
AktSign := AktSignNeu
StellenSign := StellenSignNeu
StellenIndex := StellenIndexNeu
If (AktSign <> Auswahl)
{
Auswahl := AktSign
File := FileOpen(AuswahlDatei, "w")
File.Write(Auswahl)
File.Close()
}
; Abschluß-Message
Gui, Destroy
MsgAnzeige =
(
Ihre neu erstellte Vorlage %VorschauMsgNeu% wurde abgespeichert.
Möchten Sie zurück zur Vorlagenauswahl?
)
MsgBox, 4, , %MsgAnzeige%
IfMsgBox Yes
goto, Auswahlfenster
else
gosub, Anzeige
Return
;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
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, 1500
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