Optimierung Umbenennungstool

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Optimierung Umbenennungstool

Re: Optimierung Umbenennungstool

Post by just me » 29 May 2020, 04:55

... Die zweite ist die Auswahl in der DropDownList. In der Subroutine VorlagenDefinieren werden die beiden dann synchronisiert und auf die interne Variable gleichgesetzt. Ich habe in den Vergleich bei der Eingabe jetzt also ZahlArtAuswahl hineingesetzt: ...
Interessant, beim Neuerstellen einer Vorlage werden Felder über die Auswahl aus der DDL gefüllt? Was sagt denn die MsgBox für die LV-Zeile, die einen Treffer liefern soll?

Re: Optimierung Umbenennungstool

Post by haichen » 29 May 2020, 00:52

Mit MsgBox, % "|" AktSignEingabe "|" könntest du vor dem If mal schauen was in der Variablen steht. Ein bei mir üblicher Verdächtiger wäre ein Absatzzeichen `n.
Das müsstest du mal mit allen Ifs machen.
Du kannst das auch als Else hinter dem If-Zweig machen.

Code: Select all

if()
{
	...
}
else
  	MsgBox, % A_LineNumber " Varname|" Varname"|"

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 28 May 2020, 16:48

Hallo just me!

Also ich hatte das schon einmal getestet und die Variablen auch jetzt nochmal mithilfe des Codes, den Du mir gegeben hast, verglichen. Die eine bleibt zuerst leer, da es sich bei "ZaehlArt" und "ZahlArtAuswahl" um zwei unterschiedliche Variablen für dieselbe Sache handelt. Die erste wird intern benutzt und zum Abspeichern in der Tabelle. Die zweite ist die Auswahl in der DropDownList. In der Subroutine VorlagenDefinieren werden die beiden dann synchronisiert und auf die interne Variable gleichgesetzt. Ich habe in den Vergleich bei der Eingabe jetzt also ZahlArtAuswahl hineingesetzt:

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, 1)
   LV_GetText(ZaehlArtLV, A_Index, 4)
   ;~ MsgBox, "%AktSignEingabe%" <-> "%AktSignLV%"`n"%ZaehlArtAuswahl%" <-> "%ZaehlArtLV%" " / " "Neu Erstellen"
   If (AktSignEingabe = AktSignLV and ZaehlArtAuswahl = 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

   VorschauMsg = %AktSign%_%SignVorlage%%ZaehlArtZeichen%%IndexVorlage%
   Progress, m2 fs12 zh0 ct0000ff CWffffff B, %VorschauMsg%, , Vorschau, Verdana
}
SetTimer, ProgressOff, 1500
Return

ProgressOff:
Progress, Off
Return
Gebracht hat das aber nichts. Das Script läßt immernoch alle neuen Vorlagen durchgehen - auch wenn sie genauso bereits in der Tabelle stehen.
Irgendwie muß das wohl doch an der logischen Formulierung des If-Ausdrucks liegen. Doch ich habe keine Ahnung, wie ich das richtig machen soll.

Viele Grüße von Meister Lampe

Re: Optimierung Umbenennungstool

Post by just me » 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:

Re: Optimierung Umbenennungstool

Post by BNOLI » 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
}

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by BNOLI » 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:

Re: Optimierung Umbenennungstool

Post by just me » 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

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by just me » 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.

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by just me » 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

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by just me » 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?

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by just me » 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

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 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

Re: Optimierung Umbenennungstool

Post by just me » 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.

Top