Optimierung Umbenennungstool

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

21 Nov 2019, 18:26

Hallo just me!

Nachdem ich aus dem anderen Thread einiges mitnehmen konnte und auch nochmals im Handbuch gestöbert habe, habe ich das mit den dynamischen Labels mal ausprobiert. Insbesonder Du wolltest ja wissen, wozu die mir nützlich sein sollten. Um das näher darzustellen und weil das noch nicht so klappt, wie es eigentlich nach der Beschreibung zu erwarten wäre, stelle ich den betreffenden Code hier nochmals herein.
Ich habe unter F12 ein Modul erstellt, das bei ausgewählten Bildern, wenn sie bis dahin nur "nackte" Nummern tragen, diese nach der ausgewählten Vorlage trimmt und entsprechende Bestandsnummer AktSign davorsetzt. Das ist nur bestimmt für Dateien ohne Index (StellenIndex = 0). Dafür gibt es eine Prüfung. Zuvor wird aber geprüft, ob überhaupt eine Bestandsvorlage ausgewählt ist. Und an dieser Stelle soll, falls nötig, der Abzweig zum Auswahlfenster und von dort wieder zurück stattfinden.
Das sieht jetzt so aus:

Code: Select all

F12::
If (AktSign = "")
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Lb_Ruecksprung := "Lb_NameErgaenzen_1"
         Goto, Auswahlfenster
         Lb_NameErgaenzen_1:
      }
      else
      return
   }
   
   If !(StellenIndex = "0")
   {
      ;Gosub, Trimmen_mI
      MsgBox, 16, Fehler!,  Sie können keine Signaturen mit Indizes ergänzen!`nBitte wähle Sie eine andere Vorlage aus.
      Lb_Ruecksprung := "Lb_NameErgaenzen_2"
      Goto, Auswahlfenster
      Lb_NameErgaenzen_2:
   }
   else
      
   Clipboard := ""
   SendInput, ^c
   Clipwait, 1
 
   DateienAuslese := Clipboard
   SignStellen := StellenSign
   IndexStellen := StellenIndex
   NewAktname := AktSign
   
   Loop, Parse, Dateienauslese, `n, `r
	{
      SplitPath, A_LoopField, , Verzeichnis, Erweiterung, SignRumpf	
	  
		; Wenn NameArray[2] mit einer oder mehreren Ziffer(n) beginnt und mit einer oder keiner 'Nichtziffer' endet ...
      If RegExMatch(SignRumpf, "^(\d+)(\D?)$", Match) 
      {
         ; MsgBox, % StrLen(Match1) . ": " . Match1 . "   <>   " . Match2
         If (StrLen(Match1) = SignStellen)
            NewSign := SignRumpf
         else
         {
            Match1 += 0 ; führende Nullen entfernen
            If !(StrLen(Match1) > SignStellen)
            {
               NewSign := Format("{:0" . SignStellen . "}", Match1) . Match2
               ; MsgBox, % StrLen(NewSign) . ": " . NewSign . "   <>   " . Match2
               ;FileMove, %A_LoopField%, %Verzeichnis%\%NewAktname%_%NewSign%.%Erweiterung%
            }
         }
         FileMove, %A_LoopField%, %Verzeichnis%\%NewAktname%_%NewSign%.%Erweiterung%
      }      	
   }  	
return
und im letzten der sich nacheinander aufrufenden Module Auswahlfenster incl. ListView, Anwenden und Anzeige steht dann am Schluß der Befehl zu Rücksprung zum letzten abgespeicherten Label:

Code: Select all

Anzeige:
If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, m2 fs12 zh0 ct0000ff CWffffff, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
   VorschauSign := Format("{:0" . StellenSign . "}", 1)
   If (StellenIndex = "0")
   {
      VorschauMsg = %AktSign%_%VorschauSign%
   }
   else
   {
      VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
   }
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Goto, %Lb_Ruecksprung%
Return

ProgressOff:
Progress, Off
Return
Nur bekomme ich immer eine Fehlermeldung
---------------------------

---------------------------
Error: A Goto/Gosub must not jump into a block that doesn't enclose it.

Line#
243: {
244: VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
245: VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
246: }
247: Progress,m2 fs12 zh0 ct0000ff CWffffff B,%VorschauMsg%,,Vorschau,Verdana
248: }
249: SetTimer,ProgressOff,1500
---> 250: Goto,%Lb_Ruecksprung%
251: Return
254: Progress,Off
255: Return
267: ExplorerID := WinExist()
268: ShellWin := 0
269: For Win, in ShellApp.Windows
269: {

The current thread will exit.
---------------------------
OK
---------------------------
(Ab Zeile 267 beginnt ein anderer Teil des Scripts!)
Ich habe keine Ahnung, was ich damit anfangen soll.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

23 Nov 2019, 06:02

Meister Lampe wrote:Insbesonder Du wolltest ja wissen, wozu die mir nützlich sein sollten.
Ich wollte schlichtweg wissen, warum Du glaubst, dynamische Rücksprunglabel zu brauchen. Jetzt sehe ich es. Du springst mit Deinem Ansatz die Subroutine für die Ausgabe des Auswahlfensters mit einem Goto an und hast deshalb keine Möglichkeit, automatisch zum aufrufenden Statement zurückzukehren. Beim Gosub ist das das normale Verhalten. Wozu also Goto?

Und letzlich läuft das Ganze darauf hinaus, dem Benutzer die EIngabe von zwei Hotkeys zu ersparen, wenn er noch keine Auswahl getroffen hat. Ich halte das nach wie vor für überflüssig. Wenn Du das nicht allein hinkriegst, kannst Du mit einiger Wahrscheinlichkeit den Code auch nicht allein warten, falls Anpassungen/Änderungen erforderlich werden, an die Du heute noch nicht denkst.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

23 Nov 2019, 18:00

Hallo just me!

Es handelt sich nicht nur darum, das Tool in der Handhabung noch etwas einfacher zu gestalten - das natürlich auch, sondern es gibt auch andere Gründe:
Erstens wiederholt sich diese Prozedur am Anfang von mehreren Anwendungen: bei der Grundfunktion, dem Umbenennen sowie bei dem Trimmen und hier beim Ergänzen. Immer steht als erstes die Frage nach der Auswahl der Bestandsvorlage. Hätte man das einmal so geschrieben, könnte man es für alle vereinheitlichen.
Zweitens, und das ist - ebenfalls bei allen diesen Anwendungen - wohl bisher die größte Schwierigkeit in der Umsetzung im Code: Wenn ich die Möglickeit zur Auswahl mit Gosub Auswahlfenster aufrufe, dann fängt das Programm nach beim ersten return der drei zusammengehörenden Module (Anzeige der Gui) wieder an weiterzulaufen, noch während der Benutzer mit dem Auswählen beschäftigt ist. Ich muß also direkt nach dem Gosub die Sache wieder mit einem return stoppen. Und ein Gosub-Befehl, der nach dem Zurückkehren nicht weiterläuft (hier weil die eigentliche Subroutine noch gar nicht abgeschlossen ist), kommt schließlich einem Goto gleich.
Könnte man das Script auf andere Weise dort anhalten und das dann mit dem Ende der ganzen Subroutine, also dort, wo ich jetzt den Rückspringbefehl eingebaut habe, wieder lösen, dann wäre das auch eine Möglichkeit.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

25 Nov 2019, 05:39

Meister Lampe wrote:Könnte man das Script auf andere Weise dort anhalten...
Was glaubst Du wohl, was Dir dieser Beitrag zeigen sollte?

Du kannst natürlich nach dem Gui, Show, ... auch eine Variable setzen (wie Z.B. AuswahlFertig := False) und darauf warten, dass sie auf True gesetzt wird:

Code: Select all

...
Gui, Show, ...
AuswahlFertig := False
While !(AuswahlFertig)
   Sleep, 10 ; oder länger
...
Return
Du solltest aber bedenken, dass es mehrere mögliche Fehler gibt:
  1. Keine Auswahl
  2. Auswahl mit falschem Typ
  3. Frühere Auswahl, die hier gar nicht genutzt werden soll.
Und nachdem das Skript aus den Auswahlroutinen zurückkehrt, muss nochmal geprüft werden.

Du solltest deshalb darüber nachdenken, ob Du beim Start von Bearbeitungsroutinen nicht besser immer direkt in die Auswahlroutine verzweigst, wenn Du das weiterhin so realisieren willst.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

11 Dec 2019, 18:00

Hallo just me!
Du solltest deshalb darüber nachdenken, ob Du beim Start von Bearbeitungsroutinen nicht besser immer direkt in die Auswahlroutine verzweigst, wenn Du das weiterhin so realisieren willst.
Vielen Dank, das war ein prima Tipp!
Ich habe den mit der anderen Idee, eine Variable zur Bestätigung der Auswahl zu führen kombiniert und damit auch ein weiteres Problem lösen können.
Der Code sieht jetzt am Anfang einer jeden solchen Anwendung (Trimmen, Ergänzen, Umbenennen, virtuelles Deckblatt etc.) so aus wie hier:

Code: Select all

F12::
If !(ModulAuswahl = 3)
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Gosub Auswahlfenster
         ModulAuswahl := 3
         return
      }
      else
      return
   }
   ...
Lediglich die Variable ModulAuswahl hat dann jeweils einen anderen Wert.
Damit wird beim Start einer Anwendung einmal das Auswahlfenster aufgerufen, bei wiederholter Verwendung aber nicht mehr. Falls aber eine andere dazwischen benutzt wurde, muß die Auswahl wieder neu verifiziert werden.
Ich hatte mir schon längere Zeit Gedanken gemacht, wie ich es einrichte, daß nicht immer ohne Rückfrage die letzte Bestandsvorlage verwendet wird, die ja praktischerweise über das Schließen des Scripts hinaus abgespeichert wird. Falls man dann zwischendurch etwas Anderes für einen anderen Bestand gemacht hat, sollte diese neue AktSign nicht ohne nachzufragen weiterverwendet werden. Zu diesem Zweck hatte ich mich ja auch mal erkundigt nach einer InputBox mit drei Buttons, damit ich darin die aktuelle Vorlage anzeigen kann und der Nutzer die Möglichkeit hätte, über einen separaten Knopf zum Ändern das Auswahlfenster aufzurufen. Jetzt ist dieses Problem also auch gelöst.

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

13 Feb 2020, 17:48

Hallo just me!

Ich habe gerade entdeckt, da0ß jeman anders ein ähnliches Problem mit dem Progress-Fenster hat wie ich: https://www.autohotkey.com/boards/viewtopic.php?f=9&t=72226
Der möchte die Anzeige ebenfalls die ganze Zeit des Programablaufs über sichtbar haben. Wenn ich das richtig verstanden habe, ist der einzige Unterschied wohl, daß er sich aus den vielen sleep-Befehlen die Zeit ausrechnet und ich das so nicht machen kann. ließe sich da trotzdem eine Anregung übernehmen?
Mit meinen derzeitigen Parametern jedenfalls müßte das progress immer im Vordergrund bleiben - dazu bedarf es noch eines "A".

Code: Select all

Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

14 Feb 2020, 05:12

Moin,

wenn es immer noch um ein Progressfenster in einer so aufgebauten Routine geht

Code: Select all

MitIndex:       ; zum Umbenennen, wenn Index vorhanden
   ; 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
   }
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
   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 := ""
Progress, Off
Return
könnte das durchaus in recht kurzer Zeit fertig werden.

Der erste Teil braucht nur Mikrosekunden:

Code: Select all

   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
   }
Der Rest mag wegen COM etwas länger dauern.

Bau doch einfach mal zwei MsgBoxen ein, damit Du eine positive Rückmeldung über den Stand der Dinge erhältst:

Code: Select all

   MsgBox, Gleich geht's los!
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
   ;...
   ;...
   Progress, Off
   MsgBox, Ich habe fertig!
Return
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

03 Mar 2020, 19:22

Hallo just me!

Das Problem ist ja, daß das Progress-Fenster viel früher verschwindet, als die Umbenennung fertig ist. Ich habe die MsgBoxen nach Deinem Tip zum Vergleich mit hereingesetzt. Die zum Abschluß kommt dann auch erst um einiges später. Allerdings auch noch bevor alle Dateien fertig umbenannt sind. Könnte das ein Problem mit der Anzeige sein? Damit man die Bilder auswählen kann, ist es ja vorgesehen, sie im Explorer in einer Miniaturansicht anzuzeigen und nicht nur als Liste. Da geht das Umbenennen ja meistens langsamer. Könnte es sein, daß der AHK schon längs fertig ist, der Rest aber Window-Sache ist? Ich habe allerdings mal die Probe mit der Detailansicht gemacht. Da ging es zwar etwas schneller, aber das Progress-Fenster war auch nur ganz kurz am Anfang zu sehen.
Ich wundere mich halt, da ich bei diesem progress keinen Timer angegeben habe wie bei dem Anzeigemodul und der off-Befehl eben auch ganz am Ende steht. Und im Handbuch steht:
A: Entfernt die Immer-Im-Vordergrund-Eigenschaft des Fensters.
Diesen Parameter habe ich ja auch nicht eingegeben.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

05 Mar 2020, 07:51

Moin,

ich verstehe nicht, warum zwischen dem Verschwinden des Progressfensters und der Anzeige der MsgBox für den Schluss Zeit vergehen soll. Das hört sich eher so an, als ob das Fenster im Hintergrund verschwindet oder unabsichtlich vom Skript geschlossen wird. Du kannst ja mal versuchen, die Anweisungen zu drehen

Code: Select all

   MsgBox, Ich habe fertig!
   Progress, Off
Return
Während der Anzeige der MsgBox kannst Du dann in Ruhe nach dem Progressfenster suchen. Wenn es nicht da ist, liegt der Fehler im Skript.

Außerdem könntest Du probieren, die Anzeige der Änderungen mit

Code: Select all

   ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
   For Index, Item In SelectedItems
      Item := ""
   ShellWin.Refresh() ; <<<<<<<<<< einfügen
   ShellWin := ""
zu beschleunigen.

Und als Letztes:

Code: Select all

Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
Die Kombination der Optionen M2 & B macht für mich keinen Sinn.

Viel Glück!

P.S.:
Ich wundere mich halt, da ich bei diesem progress keinen Timer angegeben habe wie bei dem Anzeigemodul und der off-Befehl eben auch ganz am Ende steht.
Kann es sein, dass trotzdem noch ein Timer läuft?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

07 Mar 2020, 18:31

Hallo just me!
Kann es sein, dass trotzdem noch ein Timer läuft?
Das war der Tipp! :bravo:
Ich habe jetzt das gesamte Tool nocheinmal durchgekämmt. Bei dem Anzeigemodul oben wird ja auch ein Progress-Fenster verwendet, das allerdings anders geschlossen wird, nämlich über einen separaten Befehl:

Code: Select all

; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F7::
Anzeige:
If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, fs12 zh0 ct0000ff CWffffff B2, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
   VorschauSign := Format("{:0" . StellenSign . "}", 1)
   If (StellenIndex = "0")
   {
      VorschauMsg = %AktSign%_%VorschauSign%
   }
   else
   {
      VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
   }
   Progress, fs12 zh0 ct0000ff CWffffff B2, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return
Deshalb und weil das viel weiter oben im Programm steht und eben zu einem eigenen Modul gehört, habe ich gar nicht mehr daran gedacht, noch weniger, daß die zwei interagieren könnten. Ich habe die für das Umbenennungsmodul jetzt in Progress, :2 umbenannt, und jetzt klappt es endlich.
Die Kombination der Optionen M2 & B macht für mich keinen Sinn.
Ich habe nochmal genau nachgesehen, was diese Parameter bewirken sollen und verstehe jetzt auch nicht mehr, wieso ich beide dort hineingesetzt hatte. Nach diesen beiden Korrekturen sieht das bei mir also so aus:

Code: Select all

Progress, 2: fs12 zh0 ct0000ff CWffffff B2, Bin gleich fertig ..., , Vorschau, Verdana
Damit wäre auch dieses Problem endlich gelöst. Vielen Dank!

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

24 Apr 2020, 18:38

Hallo just me!

Durch Kollegen bin ich darauf aufmerksam gemacht worden, daß es doch Signaturen unterschiedlicher Struktur für denselben Bestand geben kann, also auch mit derselben AktSign. Das macht es nötig, die Angaben etwa differenzierter einzugeben und in der ListView nicht nur nach AktSign, sondern auch nach mindestens einem weiteren Argument zu unterscheiden, weil sonst die Eindeutigkeit ("..ist bereits vergeben!") nicht gewährleistet ist. Dasselbe gilt dann auch für die Abspeicherung in der internen Auswahl.txt.
Bis jetzt war die Auswahl und die Umbenennungsroutine ausgelegt für Namen nach dem Schema
A 123--4_001-000, also [Bestandsname][Unterstrich][Signaturname][Bindestrich][laufender Index, beginnt mit 0]
oder
A 123--4_001, also [Bestandsname][Unterstrich][Signaturname]
Es gibt aber noch solche, welche den Index mit Unterstrich abgetrennt haben sollen und ihn mit 1 zu zählen beginnen:
A 123--4_001_001, also [Bestandsname][Unterstrich][Signaturname][Bindestrich][laufender Index, beginnt mit 1]
Um das Problem zu lösen, habe ich die Tabelle 4spaltig gemacht und die weitere Spalte "Bildtyp" genannt. Mein 1. Versuch war dann tatsächlich mithilfe einer CheckBox, mit der ich bei der Eingabe unterscheiden konnte. Dann habe ich den Unterstrich durch eine Variable "BildTypZeichen" ersetzt. Damit läuft auch die Umbenennungsroutine schon ganz gut, nur das eindeutige Abspeichern und Wiederaufrufen geht noch nicht.
Hier ist mal der Code:

Code: Select all

; 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|Bildtyp
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    x137  yp  h25  w70  vSignEingabe, ;%SignVorlage%
Gui, Add, Edit, cblue    x224  yp  h25  w70  vIndexEingabe, ;%IndexVorlage%
Gui, Add, Text, x124     yp+5    h25   w13 , % chr(863)
Gui, Add, Text, x211     yp+4    h25   w13  , % chr(862)

Gui, Add, Checkbox, xm yp+25  h30   w18   vSignTyp,  ;keine vollständige Akte?
Gui, Add, Text, x50 yp h30 w300 , Einzelne Scans oder abweichende Dokumentationsformate 

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)
LV_GetText(BildTyp, Row, 4)
StellenSign := StrLen(SignVorlage)
If (IndexVorlage = "-")
{
   StellenIndex := 0
}
else
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!, Die Indexvorgabe darf nicht leer sein!
   GuiControl, Focus, IndexEingabe
   Return
}

; Alles OK, verarbeiten
AktSignNeu := AktSignEingabe
StellenSignNeu := StrLen(SignEingabe)
SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 0)
If (SignTyp = 0)        ; Trennzeichen für den Index bei ganzen Akten oder Einzelbildern unterscheiden(Check<box)
{
   BildTypNeu := "Ganze Akte"
   BildTypZeichen := "-"
}
else
{
   BildTypNeu := "Einzelscans"
   BildTypZeichen := "_"
}

If (IndexEingabe = "-")
{
   IndexVorlageNeu := "-"
}
else
{  
   StellenIndexNeu := StrLen(IndexEingabe)
   IndexVorlageNeu := Format("{:0" . StellenIndexNeu . "}", 0)
}
FileAppend , `n%AktSignNeu%`t%SignVorlageNeu%`t%IndexVorlageNeu%`t%BildTypNeu%, %VorgabenDatei%

; Auswahldatei updaten
If (IndexVorlageNeu = "-")
{
   VorschauMsgNeu = %AktSignNeu%_%SignVorlageNeu%
   StellenIndex := "-"
   LetzteSign := "-"
}
else
{
   VorschauMsgNeu = %AktSignNeu%_%SignVorlageNeu%%BildTypzeichen%%IndexVorlageNeu%
   StellenIndex := StellenIndexNeu
   LetzteSign := 0
}
AktSign := AktSignNeu
StellenSign := StellenSignNeu

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, 68, , %MsgAnzeige%
   IfMsgBox Yes
      gosub, 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:
If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
   VorschauSign := Format("{:0" . StellenSign . "}", 1)
   If (StellenIndex = "0")
   {
      VorschauMsg = %AktSign%_%VorschauSign%
   }
   else
   {
      VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
   }
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
   ModulAuswahl := 0
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return

;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer

;------------------------------------------------------------------------
; Indexnummerierung auf Eingabebefehl 'Signaturnummer, Startindex' in Inputbox 
; nach Auswahl der Dateien mit der Maus

<!LButton::
; Abklären, ob bereits eine Bestandsvorlage für diese Anwendung ausgewählt wurde
If !(ModulAuswahl = 1 or ModulAuswahl = 0)  
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Gosub Auswahlfenster
         ModulAuswahl := 1
         return
      }
      else
      return
   }
else
   ModulAuswahl := 1

   ; 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%
   
   If (StellenIndex = "0")  ; fragt, ob Index vorhanden und wählt die Routine aus
      Gosub, OhneIndex
   Else
      Gosub, MitIndex
   return
   
MitIndex:       ; zum Umbenennen, wenn Index vorhanden
   ; 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
   }
   Progress, 2: m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
   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
      If (BildTyp = "Einzelscan")
         LetzterIndex := 1     ; setzt Index für Einzelscans auf 1
      else
         LetzterIndex := 0     ; setzt Index auf ganze Akten 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 . BildTypzeichen . LetzterIndex . (ShowExt ? "." . Erweiterung : "")
      LetzterIndex++
   }
;SplashImage, Off
   ; 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 := ""
Progress, 2: Off
Return

OhneIndex:      ; zum Umbenennen, wenn kein Index vorhanden
; Benutzereingaben zum Umbenennen holen
   If (LetzteSign = 0)
      LetzteSign := Format("{:0" . StellenSign . "}", 1)
   else
      LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign) 
   InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%

   If (ErrorLevel) {
      LetzteSign--
      Return
   }
    Progress, 2: m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
   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 Sign, Item In SelectedItems {
      ItemPath := Item.Path
      SplitPath, ItemPath, DateiName, , Erweiterung
      LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign)  ; Setzt Index auf 1 in 2 Ziffern
      Item.Name := AktSign . "_" . LetzteSign . (ShowExt ? "." . Erweiterung : "")
      LetzteSign++
   }
;SplashImage, Off
   ; Fertig
   ; Letzte Datei selektieren
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
   ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
   For Sign, Item In SelectedItems
      Item := ""
   ShellWin := ""
Progress, 2: Off
return
Das war mir dann zu umständlich, weil ich hier 3 verschiedene - eigentlich gleichwertige - Optionen habe, die aber vollig unterschiedlich ausgewählt werden sollen (wenn kein Index dabei ist, soll ja ein Bindestrich in das Indexfeld eingegeben werden). Indbesondere, falls noch weitere Änderungen kommen sollten. Also habe ich es mit einer DropDownList versucht. Und da bin ich aber noch ziemlich am Anfang.
Erstmal der Code für die Gui:

Code: Select all

; 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|Zählart
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")

; Auswahl des Vorlagentyps per DropDownList:
Gui, Add, DropDownList, xm w350 Choose1 vZaehlArtAuswahl gZaehlart, vollständige Akte|Faszikel ohne Deckblatt|abweichende Dokumentationsformate|ohne Indizes
;Gui, submit, nohide

Gui, Add, Edit, cblue    xm  h25   w152  vAktSignEingabe, ;%Auswahl%
Gui, Add, Edit, cblue    x189  yp  h25  w82  vSignEingabe, ;%SignVorlage%
Gui, Add, Edit, cblue  x288 yp  h25  w82  vIndexEingabe, ;%IndexVorlage%
Gui, Add, Text, x176     yp+5    h25   w13 , % chr(863)
Gui, Add, Text, x275     yp+4    h25   w13  , % chr(862)

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

Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "ohne Indizes")
{
   GuiControl, Disable, IndexEingabe
}
else
{
   GuiControl, Enable, IndexEingabe
}
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)
;LV_GetText(BildTyp, Row, 4)
LV_GetText(ZaehlArt, Row, 4)
StellenSign := StrLen(SignVorlage)
;~ If (IndexVorlage = "")
;~ {
   ;~ StellenIndex := 0
;~ }
;~ else
StellenIndex := StrLen(IndexVorlage)
;LetzteSign := 0
; hier müßte wohl auch die externe Abspeicherung stattfinden!
Gosub, VorlagenDefinieren
If (AktSign <> Auswahl)
{
   Auswahl := AktSign
   File := FileOpen(AuswahlDatei, "w")
   File.Write(Auswahl)
   File.Close()
}
;Gosub, VorlagenDefinieren
Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return
Die obige Spalte "Bildtyp" und die Variablen, die damit zusammenhängen, habe ich jetzt allgemeiner in "Zaehlart" umbenannt. Die Ausblendung des Index-Eingabefeldes nach der Auswahl von "ohne Index" klappt jetzt auch. Also nix mit Reisebüro. ;)
Ich habe dann eine Fallunterscheidung aufgestellt, die wie bei den früheren Scripts für die verschiedenen Optionen die Variablen setzt:

Code: Select all

VorlagenDefinieren:
If (ZaehlArtAuswahl = vollständige Akte)
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "-"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 0)
   ZaehlArt := "vollst. Akte"
   }
If (ZaehlArtAuswahl = Faszikel ohne Deckblatt)
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichenn := "-" 
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "ohne Deckblatt"
   }
If (ZaehlArtAuswahl = abweichende Dokumentationsformate)
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "_"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "Einlagen"
   }
Else If (ZaehlArtAuswahl = ohne Indizes)
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1)
   ZaehlArtZeichen := ""
   IndexVorlage := ""
   ZaehlArt := "ohne Index"
   }
 return
Ich hatte gedacht, weil diese Fallunterscheidung je mehrmals auftaucht, sie als Subroutine zu erstellen. Ich weiß aber nicht, ab ich sie dann richtig aufgerufen habe. Im Code gehts dann weiter mit dem Erstellen:

Code: Select all

; 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 and ZaehlArtAuswahl <> "ohne Indizes")
{
   MsgBox, 16, Fehler!, Die Indexvorgabe darf nur bei der Auswahl "ohne Indizes" leer sein!`nWählen Sie eine andere Auswahl oder füllen Sie das Indexfeld!
   GuiControl, Focus, IndexEingabe
   Return
}

; Alles OK, verarbeiten
AktSignNeu := AktSignEingabe
StellenSignNeu := StrLen(SignEingabe)

Gosub, VorlagenDefinieren
   
FileAppend , `n%AktSignNeu%`t%SignVorlageNeu%`t%IndexVorlageNeu%`t%ZaehlArt%, %VorgabenDatei%

; Auswahldatei updaten
AuswahlNeu = %AktSignEingabe%`t%ZaehlArtauswahl%
If !(AuswahlNeu = Auswahl)
{
   Auswahl := AuswahlNeu
   File := FileOpen(AuswahlDatei, "w")
   File.Write(AuswahlNeu)
   File.Close()
}
; Abschluß-Message
Gui, Destroy
VorschauMsgNeu = %AktSign%_%SignVorlage%%ZaehlArtzeichen%%IndexVorlage%
MsgAnzeige = 
(
Ihre neu erstellte Vorlage %VorschauMsgNeu% wurde abgespeichert.
Möchten Sie zurück zur Vorlagenauswahl?
)
MsgBox, 68, , %MsgAnzeige%
   IfMsgBox Yes
      gosub, 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:

If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
Gosub, VorlagenDefinieren

   ;~ VorschauSign := Format("{:0" . StellenSign . "}", 1)
   ;~ If (StellenIndex = "0")
   ;~ {
      ;~ VorschauMsg = %AktSign%_%VorschauSign%
   ;~ }
   ;~ else
   ;~ {
      ;~ VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      ;~ VorschauMsg = %AktSign%_%VorschauSign%%ZaehlArtZeichen%%VorschauIndex%
   ;~ }
   VorschauMsg = %AktSign%_%SignVorlage%%ZaehlArtzeichen%%IndexVorlage%
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return
Wenn das Neuerstellen/Abspeichern und Auswählen der Vorlagen einmal klappt, dann wird es wohl keine große Schwierigkeit sein, die anderen Routinen, allen voran die zum Umbenennen, entsprechend anzupassen.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

25 Apr 2020, 03:58

Moin Meister,

beim Drüberlesen fällt mir auf, dass Du in zwei Routinen für identische Prüfungen unterschiedliche Schreibweisen gewählt hast:

Code: Select all

Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "ohne Indizes")
   ...
...
VorlagenDefinieren:
If (ZaehlArtAuswahl = vollständige Akte)
   ...
Eine Variante ist fehlerhaft!

Sag nach Korrektur bitte etwas genauer, welche konkreten Teile der Änderungen nicht funktionieren. Ich schaue mir das dann noch einmal an.

Zum Thema 'Umbenennen' darf ich darauf hinweisen, dass meines Wissens für die Bestände - (Bindestrich) und _ (Unterstrich) bisher als gleichwertig behandelt wurden.

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

26 Apr 2020, 16:46

Hallo just me!

Dein Hinweis war wieder einmal ein hilfreicher! In diesem Fall handelt es sich ja um den Inhalt einer Variablen 'Zaehlartauswahl
, die als Auswahl bei der DropDownList herauskommt. Also mußte das in diesem Fall mit Anführungszeichen geschrieben werden. Darauf bin ich den ganzen Code nochmals durchgegangen, um ihn nach ähnlichen Fehlern zu durchforsten und habe dabei ein paar Stellen gefunden, wo Variablennamen verwechselt bzw.der Subroutine gemäß noch nicht angepaßt wurden und deshalb auch nicht übergeben werden konnten. Nach entsprechender Korrektur funktioniert das Script schon um einiges besser, die Abspeicherung in der Tabelle klappt, nur die in der Auswahl.txt noch nicht und die "Erinnerung" im laufenden Programm. Wenn ich also Strg+F7 drücke, um die aktuelle Vorlagenauswahl anzuzeigen, dann wird die zuletzt Erstellte angezeigt - unabhängig davon, ob ich in Zwischenzeit eine andere ausgewählt habe oder nicht.
Hier nochmals der aktuelle Code:

Code: Select all

If FileExist(PfadImStaf)
   Arbeitsdateien := PfadImStaf
else
   Arbeitsdateien := A_ScriptDir . "\Arbeitsdateien AHK-Tool StAF\"

   AuswahlDatei := A_ScriptDir . "\Auswahl.txt"  ; zuletzt verwendeter Vorlagenname, lokal gespeichert
   VorgabenDatei := Arbeitsdateien . "\Bestandsvorgaben4SP.txt"
   Anleitung := Arbeitsdateien . "\Erläuterungen AHK-Tool StAF_" . ToolVersion . ".pdf"
   VD_Vorlage := Arbeitsdateien . "\Deckblattvorlage4.docx"
   ;Wartesymbol := Arbeitsdateien . "\Farbenscheibe.gif"

^!F7::Run, %VorgabenDatei%
!F7::Run, %Anleitung%

;------------------------------------------------------------------------
; Vorlagen und Auswahlen aufrufen und einlesen
F7::
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|Zählart
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")

; Auswahl des Vorlagentyps per DropDownList:
Gui, Add, DropDownList, xm w350 Choose1 vZaehlArtAuswahl gZaehlart, vollständige Akte|Faszikel ohne Deckblatt|abweichende Dokumentationsformate|ohne Indizes
;Gui, submit, nohide

Gui, Add, Edit, cblue    xm  h25   w152  vAktSignEingabe, ;%Auswahl%
Gui, Add, Edit, cblue    x189  yp  h25  w82  vSignEingabe, ;%SignVorlage%
Gui, Add, Edit, cblue  x288 yp  h25  w82  vIndexEingabe, ;%IndexVorlage%
Gui, Add, Text, x176     yp+5    h25   w13 , % chr(863)
Gui, Add, Text, x275     yp+4    h25   w13  , % chr(862)

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

Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "ohne Indizes")
{
   GuiControl, Disable, IndexEingabe
}
else
{
   GuiControl, Enable, IndexEingabe
}
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)
;LV_GetText(BildTyp, Row, 4)
LV_GetText(ZaehlArt, Row, 4)
StellenSign := StrLen(SignVorlage)
;~ If (IndexVorlage = "")
;~ {
   ;~ StellenIndex := 0
;~ }
;~ else
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, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return

;------------------------------------------------------------------------
VorlagenDefinieren:
AktSignNeu := AktSignEingabe
StellenSignNeu := StrLen(SignEingabe)

If (ZaehlArtAuswahl = "vollständige Akte")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "-"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 0)
   ZaehlArt := "vollst. Akte"
   }
If (ZaehlArtAuswahl = "Faszikel ohne Deckblatt")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichenn := "-" 
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "ohne Deckblatt"
   }
If (ZaehlArtAuswahl = "abweichende Dokumentationsformate")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "_"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "Einlagen"
   }
Else If (ZaehlArtAuswahl = "ohne Indizes")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1)
   ZaehlArtZeichen := ""
   IndexVorlage := ""
   ZaehlArt := "ohne Index"
   }
 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 and ZaehlArtAuswahl <> "ohne Indizes")
{
   MsgBox, 16, Fehler!, Die Indexvorgabe darf nur bei der Auswahl "ohne Indizes" leer sein!`nWählen Sie eine andere Auswahl oder füllen Sie das Indexfeld!
   GuiControl, Focus, IndexEingabe
   Return
}

; Alles OK, verarbeiten
;~ AktSignNeu := AktSignEingabe
;~ StellenSignNeu := StrLen(SignEingabe)

Gosub, VorlagenDefinieren
   
FileAppend , `n%AktSignNeu%`t%SignVorlage%`t%IndexVorlage%`t%ZaehlArt%, %VorgabenDatei%

; Auswahldatei updaten
AuswahlNeu = %AktSignEingabe%`t%ZaehlArtauswahl%
If !(AuswahlNeu = Auswahl)
{
   Auswahl := AuswahlNeu
   File := FileOpen(AuswahlDatei, "w")
   File.Write(AuswahlNeu)
   File.Close()
}
; Abschluß-Message
Gui, Destroy
VorschauMsgNeu = %AktSignNeu%_%SignVorlage%%ZaehlArtZeichen%%IndexVorlage%
MsgAnzeige = 
(
Ihre neu erstellte Vorlage %VorschauMsgNeu% wurde abgespeichert.
Möchten Sie zurück zur Vorlagenauswahl?
)
MsgBox, 68, , %MsgAnzeige%
   IfMsgBox Yes
      gosub, Auswahlfenster
   else
      gosub, Anzeige
Return

;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
return

;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F7::
Anzeige:

If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
Gosub, VorlagenDefinieren

   ;~ VorschauSign := Format("{:0" . StellenSign . "}", 1)
   ;~ If (StellenIndex = "0")
   ;~ {
      ;~ VorschauMsg = %AktSign%_%VorschauSign%
   ;~ }
   ;~ else
   ;~ {
      ;~ VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      ;~ VorschauMsg = %AktSign%_%VorschauSign%%ZaehlArtZeichen%%VorschauIndex%
   ;~ }
   VorschauMsg = %AktSign%_%SignVorlage%%ZaehlArtZeichen%%IndexVorlage%
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return
Ich glaube, der Kern des Problems, liegt an der Stelle "; Auswahldatei updaten". Nur habe ich keine Ahnung, wie man das dort anpacken soll. Man müßte ja zwei Auswahlkriterien abspeichern, den Bestandsnamen und die Zaehlart. Das hatte ich auch darübergeschrieben.
Und oben, Innerhalb des Moduls 'Anwenden' gibt es bereits eine ähnliche Stelle, da müßte das aber wohl anders gelöst werden, weil die Variablen noch nicht so beschrieben sind.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

27 Apr 2020, 04:24

Moin Meister,

Speichern und Einlesen/Auswerten gehören ja zu den einfachen Aktionen. Lass Dir mal per MsgBox anzeigen, was in den beteiligten Variablen steht. Dann sollte sich Dir von selbst erschließen, was Du ändern musst.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

14 May 2020, 16:39

Hallo just me!

Mein aktuelles Problem dreht sich mehr um das externe Abspeichern der Variablen in den Dateien Auswahl.txt und Bestandsvorgaben4SP.txt, als um das Füllen von den internen Variablen. Klar, daß das vorher dafür richtig gemacht werden muß. Zur Kontrolle habe ich aber den Einblick in diese externen Dateien.
Was ich benötige, ist die Abspeicherung des Inhalts der 4.Spalte ("Zaehlart") zusammen mit dem Bestandsnahmen ("AktSign"), damit auch verschiedene Zählschemata für unterschiedliche Objekte denselben Bestandes verwedet werden können und die Meldung "Der Bestandsname ist bereits vergeben!" entsprechend nur noch bei deckungsgleichen Namen auftaucht. Umgekehrt geht es darum, die Vorlagen wiederzuerkennen und auszulesen, jetzt nicht nur nach einem, sondern zwei Kriterien.
Ich habe das jetzt mal versucht, indem ich mir dafür noch eine weitere Textdatei angelegt habe. Für die Variable AktSign (Bestandsname) gibt es jetzt AuswahlSP1.txt (1.Spalte in der Tabelle) und für die Variable ZaehlArt (Vorlagenformat) heißt sie AuswahlSP4 (4.Spalte). Vielleicht hätte man die auch - wahrscheinlich sogar eleganter - zusammen in einer Datei speichern können, aber ich hatte keine Ahnung, wie.
Das Erstellen neuer Vorlagen und das Updaten von den Auswahldateien scheint jetzt zu klappen. Was noch nicht funktioniert, ist die Warnung, daß die Vorlage nicht zweimal vergeben werden darf.
Bis jetzt stand dort:

Code: Select all

; 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
   }
}
Ich habe es jetzt mal versucht mit:

Code: Select all

; AktSignEingabe darf nicht bereits vergeben sein
Loop, % LV_GetCount()
{
   LV_GetText(AktSignLV, A_Index)
   LV_GetText(ZaehlArtLV, A_Index)
   If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
   {
      MsgBox, 16, Fehler!, Die Vorlage ist bereits vergeben!
      GuiControl, Focus, AktSignEingabe
      Return
   }
}
Aber jetzt werden gleiche Vorlagen doppelt und sogar mehrmals zugelassen.
Muß man für beide Spalten getrennte Loops erstellen und dann womöglich ineinander verschachteln?

Hier also der neue Code (der Teil für die Gui und die Vorlagenauswahl und -erstellung):

Code: Select all

; Vorlagendateien zum Abspeichern definieren und deren Pfad bestimmen

If FileExist(PfadImStaf)
{
   Arbeitsdateien := PfadImStaf
   AuswahlDateiSP1 := A_ScriptDir . "\AuswahlSP1.txt"  ; zuletzt verwendeter Vorlagenname, lokal gespeichert
   AuswahlDateiSP4 := A_ScriptDir . "\AuswahlSP4.txt"  ; zuletzt verwendete Zählart, lokal gespeichert
}
else
{
   Arbeitsdateien := A_ScriptDir . "\Arbeitsdateien AHK-Tool StAF\"
   AuswahlDateiSP1 := Arbeitsdateien . "\AuswahlSP1.txt"  ; zuletzt verwendeter Vorlagenname, lokal gespeichert
   AuswahlDateiSP4 := Arbeitsdateien . "\AuswahlSP4.txt"  ; zuletzt verwendete Zählart, lokal gespeichert
}
   
   VorgabenDatei := Arbeitsdateien . "\Bestandsvorgaben4SP.txt"
   Anleitung := Arbeitsdateien . "\Erläuterungen AHK-Tool StAF_" . ToolVersion . ".pdf"
   VD_Vorlage := Arbeitsdateien . "\Deckblattvorlage4.docx"
   ;Wartesymbol := Arbeitsdateien . "\Farbenscheibe.gif"

^!F7::Run, %VorgabenDatei%
!F7::Run, %Anleitung%
;+^F7::Run, %AuswahlDatei%
;------------------------------------------------------------------------
; Vorlagen und Auswahlen aufrufen und einlesen
F7::
Auswahlfenster:
AuswahlSP1 := FileExist(AuswahlDateiSP1) ? FileOpen(AuswahlDateiSP1, "r").Read() : ""
AuswahlSP4 := FileExist(AuswahlDateiSP4) ? FileOpen(AuswahlDateiSP4, "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|Zählart
For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = AuswahlSP1 and Felder[4] = AuswahlSP4) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")

; Auswahl des Vorlagentyps per DropDownList:
Gui, Add, DropDownList, xm w350 Choose1 vZaehlArtAuswahl gZaehlart, vollständige Akte|Faszikel ohne Deckblatt|abweichende Dokumentationsformate|ohne Indizes
;Gui, submit, nohide

Gui, Add, Edit, cblue    xm  h25   w152  vAktSignEingabe, ;%Auswahl%
Gui, Add, Edit, cblue    x189  yp  h25  w82  vSignEingabe, ;%SignVorlage%
Gui, Add, Edit, cblue  x288 yp  h25  w82  vIndexEingabe, ;%IndexVorlage%
Gui, Add, Text, x176     yp+5    h25   w13 , % chr(863)
Gui, Add, Text, x275     yp+4    h25   w13  , % chr(862)

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

Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "ohne Indizes")
{
   GuiControl, Disable, IndexEingabe
}
else
{
   GuiControl, Enable, IndexEingabe
}
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)
;LV_GetText(BildTyp, Row, 4)
LV_GetText(ZaehlArt, Row, 4)
;~ StellenSign := StrLen(SignVorlage)
StellenSignNeu := StrLen(SignVorlage)
;~ If (IndexVorlage = "")
;~ {
   ;~ StellenIndex := 0
;~ }
;~ else
;~ StellenIndex := StrLen(IndexVorlage)
StellenIndexNeu := StrLen(IndexVorlage)
AktSignNeu := AktSign
;~ ZaehlArtAuswahl := ZaehlArt
; hier müßte wohl auch die externe Abspeicherung stattfinden!

If (AktSign <> AuswahlSP1 or ZaehlArt <> AuswahlSP4)
{
   AuswahlSP1 := AktSign
   AuswahlSP4 := ZaehlArt
   File := FileOpen(AuswahlDateiSP1, "w")
   File.Write(AuswahlSP1)
   File.Close()
   File := FileOpen(AuswahlDateiSP4, "w")
   File.Write(AuswahlSP4)
   File.Close()   
}

Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return

;------------------------------------------------------------------------
VorlagenDefinieren:
;~ AktSignNeu := AktSignEingabe
;~ StellenSignNeu := StrLen(SignEingabe)
;~ StellenIndexNeu := StrLen(IndexEingabe)

If (ZaehlArtAuswahl = "vollständige Akte" or ZaehlArt = "vollst. Akte")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "-"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 0)
   ZaehlArt := "vollst. Akte"
   }
If (ZaehlArtAuswahl = "Faszikel ohne Deckblatt" or ZaehlArt = "ohne Deckblatt")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichenn := "-" 
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "ohne Deckblatt"
   }
If (ZaehlArtAuswahl = "abweichende Dokumentationsformate" or ZaehlArt = "Einlagen")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "_"
   IndexVorlage := Format("{:0" . StellenIndexNeu . "}", 1)
   ZaehlArt := "Einlagen"
   }
Else If (ZaehlArtAuswahl = "ohne Indizes" or ZaehlArt = "ohne Index")
   {
   SignVorlage := Format("{:0" . StellenSignNeu . "}", 1)
   ZaehlArtZeichen := ""
   IndexVorlage := ""
   ZaehlArt := "ohne Index"
   }
 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)
   LV_GetText(ZaehlArtLV, A_Index)
   If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
   {
      MsgBox, 16, Fehler!, Die Vorlage 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 and ZaehlArtAuswahl <> "ohne Indizes")
{
   MsgBox, 16, Fehler!, Die Indexvorgabe darf nur bei der Auswahl "ohne Indizes" leer sein!`nWählen Sie eine andere Auswahl oder füllen Sie das Indexfeld!
   GuiControl, Focus, IndexEingabe
   Return
}

; Alles OK, verarbeiten
AktSignNeu := AktSignEingabe
StellenSignNeu := StrLen(SignEingabe)
StellenIndexNeu := StrLen(IndexEingabe)

Gosub, VorlagenDefinieren
   
FileAppend , `n%AktSignNeu%`t%SignVorlage%`t%IndexVorlage%`t%ZaehlArt%, %VorgabenDatei%

; Auswahldatei updaten
;~ AuswahlNeu = %AktSignNeu%`t%ZaehlArtauswahl%
;~ If !(AuswahlNeu = Auswahl)
;~ {
   ;~ Auswahl := AuswahlNeu
   ;~ File := FileOpen(AuswahlDatei, "w")
   ;~ File.Write(AuswahlNeu)
   ;~ File.Close()
;~ }

If (AktSignNeu <> AuswahlSP1 or ZaehlArt <> AuswahlSP4)
{
   AuswahlSP1 := AktSignNeu
   AuswahlSP4 := ZaehlArt
   File := FileOpen(AuswahlDateiSP1, "w")
   File.Write(AuswahlSP1)
   File.Close()
   File := FileOpen(AuswahlDateiSP4, "w")
   File.Write(AuswahlSP4)
   File.Close()   
}
; Abschluß-Message
Gui, Destroy
VorschauMsgNeu = %AktSignNeu%_%SignVorlage%%ZaehlArtZeichen%%IndexVorlage%
MsgAnzeige = 
(
Ihre neu erstellte Vorlage %VorschauMsgNeu% wurde abgespeichert.
Möchten Sie zurück zur Vorlagenauswahl?
)
MsgBox, 68, , %MsgAnzeige%
   IfMsgBox Yes
      gosub, Auswahlfenster
   else
      gosub, Anzeige
Return

;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
return

;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F7::
Anzeige:

If (AktSign = "")
{
   LeerAnzeige = Es ist keine Bestandsvorlage ausgewählt! 
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %LeerAnzeige%, , Vorschau, Verdana
}
else
{
Gosub, VorlagenDefinieren

   ;~ VorschauSign := Format("{:0" . StellenSign . "}", 1)
   ;~ If (StellenIndex = "0")
   ;~ {
      ;~ VorschauMsg = %AktSign%_%VorschauSign%
   ;~ }
   ;~ else
   ;~ {
      ;~ VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
      ;~ VorschauMsg = %AktSign%_%VorschauSign%%ZaehlArtZeichen%%VorschauIndex%
   ;~ }
   VorschauMsg = %AktSign%_%SignVorlage%%ZaehlArtZeichen%%IndexVorlage%
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return
Wenn diese Module um die Gui und die Vorlagen erstmal funktionieren, kann ich mich daran machen, die Anderen, insbesondere die Umbenennungsroutinen, für die Differenzierung nach den unterschiedlichen Vorlagen fit zu machen.

Viele Grüße von Meister Lampe
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

15 May 2020, 04:01

Moin,

es geht hier um das Befüllen interner Variablen, Beispiel:

Code: Select all

; AktSignEingabe darf nicht bereits vergeben sein
Loop, % LV_GetCount()
{
   LV_GetText(AktSignLV, A_Index)
   LV_GetText(ZaehlArtLV, A_Index)
   If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
   {
      MsgBox, 16, Fehler!, Die Vorlage ist bereits vergeben!
      GuiControl, Focus, AktSignEingabe
      Return
   }
}
Wenn Du hinter dem zweiten LV_GetText() mal MsgBox, %AktSignLV% - %ZaehlArtLV% eingebaut hättest und anschließend Deine Syntax mit der der Hilfedatei verglichen hättest, wüsstest Du wahscheinlich schon, wo es brennt. Computer machen in der Regel was sie sollen, aber nur dann, wenn man Ihnen die korrekten Anweisungen gibt. Und wenn es ein Problem gibt, sind MsgBox und ToolTip einfache Mittel, den Fehler zu lokalisieren.

Vielleicht schaust Du Dir mal :arrow: tMsg() von @BNOLI an.

Viel Glück, just me
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Optimierung Umbenennungstool

15 May 2020, 11:04

@just me Danke für die Erwähnung :) Der perfekte Anlaß um die aktuell(er)e Version auf die Menschheit loszulassen ... :mrgreen:
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

20 May 2020, 17:34

Hallo just me!

Jetz verstehe ich, was Du meinst. Hatte gemeint, das zweite LV_GetText ganz analog anfügen zu können, ohne zu wissen, daß man dann zwischen den verschiedenen Spalten unterscheiden muß. Das habe ich zwar jetzt korrigiert:

Code: Select all

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, 1)
   LV_GetText(ZaehlArtLV, A_Index, 4)
   ;MsgBox, %AktSignLV% - %ZaehlArtLV%
   If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
   {
      MsgBox, 16, Fehler!, Die Vorlage 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 and ZaehlArtAuswahl <> "ohne Indizes")
{
   MsgBox, 16, Fehler!, Die Indexvorgabe darf nur bei der Auswahl "ohne Indizes" leer sein!`nWählen Sie eine andere Auswahl oder füllen Sie das Indexfeld!
   GuiControl, Focus, IndexEingabe
   Return
}
Jetzt stehen auch die richtigen Variableninhalte in den zugehörigen externen Speicherdateien, aber die Warnung bei einer bereits vergebenen Vorlage kommt immernoch nicht wie gewollt. Genauer gesagt, nie. Ich hatte zuerst gedacht, das wäre vielleicht ein Problem mit der logischen Formulierung der Abfrage

Code: Select all

If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
Die Bedingung soll ja lauten "Wenn der Inhalt der Spalte 1 und der Inhalt der Spalte 4 sich beide mit denen einer bereits vorhandenen Vorlage decken". Aber wenn man das jetzt versucht, scheint die Bedingung ganz egal zu sein. Ob ich verschiedene oder gleiche oder nur ein einer Spalte oder ganz genau dieselben Eingaben mache - es wird alles geschluckt und die Klammern mit der MsgBox und der Fehlermeldung übergangen. Ich habe aber auch mal das and gegen ein or getauscht. Das ließ dann aber wieder keine unterschiedlichen Vorlage für dieselbe AktSign zu.
Kann bzw. sollte man in der If-Abfrage die Bedingungen anders formulieren? In mehreren Klammern? Unter Zuhilfenahme von Negation?

Viele Grüße von Meister Lampe
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Optimierung Umbenennungstool

21 May 2020, 00:56

Ohne das tohuwabohu auch nur im Ansatz zu durchblicken ...

Code: Select all

if (AktSignEingabe = AktSignLV) && (ZaehlArt = ZaehlArtLV) ? msg("Bedingung 4: true") : msg("Bedingung 4: false")

msg(prgSchritt) {
    SoundBeep
    Tooltip % prgSchritt
    Sleep 400
    ToolTip
}
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

21 May 2020, 04:37

Hallo Meister,

ich verstehe nicht, wie man auf die Idee kommen kann, das zwei Zugriffe auf den Inhalt eines LV mit bis auf die Ausgabevariable identischen Parametern unterschiedliche Werte liefern können. Das wäre ein klassischer Bug. Und wenn man unsicher ist, kann man das in der Doku überprüfen.

An der Fehlerbedingung

Code: Select all

If (AktSignEingabe = AktSignLV and ZaehlArt = ZaehlArtLV)
ist nichts falsch, wenn die Variablen enthalten, was sie sollen. Zur Prüfung eignet sich auch hier tMsg() oder eine simple einzelne MsgBox.

Code: Select all

; AktSignEingabe darf nicht bereits vergeben sein
Loop, % LV_GetCount()
{
   LV_GetText(AktSignLV, A_Index, 1)
   LV_GetText(ZaehlArtLV, A_Index, 4)
   MsgBox, "%AktSignEingabe%" <-> "%AktSignLV%"`n"%ZaehlArt%" <-> "%ZaehlArtLV%"
   ...
Irgendwie bist Du sehr 'beratungsresistent'. :roll:

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Helmut2 and 29 guests