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 » 26 Nov 2020, 04:20

Moin,

die Option für die Ausgabe einer Zeilennummer solltest Du :arrow: hier finden. Wenn Du allerdings im ListView bzw. in den Vorlagendateien Texte verwendest, ist das kein Selbstgänger

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 25 Nov 2020, 17:24

Hallo just me!

Ich habe das jetzt noch mehrmals durchprobiert und genau verglichen. Es scheint daran zu liegen, daß die Eingaben von der DDL unter ZaehlArtAuswahl nicht bzw. noch nicht früh genug mit denen in der ListView und den in der dahinterliegenden Tabelle unter ZaehlArt abgespeicherten Werten syncronisiert werden.
Zur Ausblendung des Eingabefeldes für den Index bei Signaturen ohne Index hatte ich ja bereits vorher schon erfolgreich ein g-Label gesetzt. Das sah dann so aus:

Code: Select all

Gui, Add, DropDownList, xm w350 Choose1 vZaehlArtAuswahl gZaehlart, vollständige Akte|Faszikel ohne Deckblatt|abweichende Dokumentationsformate|ohne Indizes
.
.
Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "ohne Indizes")
{
   GuiControl, Disable, IndexEingabe
}
else
{
   GuiControl, Enable, IndexEingabe
}
return
Jetzt hatte ich gedacht, ich könnte das zur Synchronisation erweitern:

Code: Select all

Zaehlart:
Gui, submit, nohide
If (ZaehlArtAuswahl = "vollständige Akte") 
   ZaehlArtAuswahl := "vollst. Akte"
If (ZaehlArtAuswahl = "Faszikel ohne Deckblatt")
   ZaehlArtAuswahl := "ohne Deckblatt"
If (ZaehlArtAuswahl = "abweichende Dokumentationsformate")
   ZaehlArtAuswahl := "Einlagen"
If (ZaehlArtAuswahl = "ohne Indizes")
{
   GuiControl, Disable, IndexEingabe
   ZaehlArtAuswahl := "ohne Index"
}
else
   GuiControl, Enable, IndexEingabe
Aber leider hatte ich mich da zu früh gefreut. Die Ausblendung/Deaktivierung des Index-Eingabefeldes klappt weiterhin, aber sonst tut sich nichts.
Da man die Listeneinträge mit choose auch direkt über ihre Zeilennummer auswählen kann, wäre jetzt meine Frage: Geht das auch umgekehrt? Daß also die Listennummer oder eine anderer zweiter Zuordnungswert bei der Auswahl mit ausgegeben werden kann? Dann könnte ich an diese Stelle gleich die Variable ZaehlArt setzen. ZaehlArtAuswahl dient ja im Prinzip lediglich zur Beschriftung der Auswahloptionen.

Viele Grüße von Meister Lampe

Re: Optimierung Umbenennungstool

Post by just me » 18 Nov 2020, 05:20

Moin Meister,

das ist immer noch sehr zäh. Wenn Du keine Meldung für mehrfach vergebene Werte bekommst, wird die Bedingung der If-Abfrage nicht erfüllt. Warum das so ist, kann niemand prüfen, der nicht Dein komplettes Skript und auch Deine Daten/Dateien hat.

Die von mir gemeinte MsgBox sollte Dir die Prüfung erleichtern, weil sie alle relevanten Werte anzeigt. Wenn Du beim Testen auf eine Kombination triffst, die Deiner Meinung nach abgewiesen werden sollte aber nicht abgewiesen wird, musst Du Dir den Inhalt der betroffenen Variablen etwas genauer anschauen.

... Ich habe jetzt außerdem noch - wie in den anderen Fällen auch - bei dem LV_GetText die Spaltennummer mit eingefügt. ...
Das hatten wir doch schon vor längerer Zeit abgehakt. :roll:

Re: Optimierung Umbenennungstool

Post by gregster » 17 Nov 2020, 14:32

BoBo wrote:
17 Nov 2020, 13:36
Falls ich nicht irre, wird in einer Bedingung wie folgt verglichen "==", wohingegen bei Variablenzuweisung ein einfaches "=" verwendet wird?!
Wie, bist du neu? :)

= ist doch der "normale" Gleichheits-Operator in AHK-Ausdrücken, == ist zusätzlich case-sensitive (achtet zusätzlich auf Groß-/Kleinschreibung, falls vorhanden) - aber k. A., ob hier relevant; bin nicht im Topic eingearbeitet.
Klar gibts (leider immer noch) das legacy-assignment via = (jedoch unter anderen Voraussetzungen), aber der Walross-Operator := wurde ja nicht umsonst eingeführt.

Re: Optimierung Umbenennungstool

Post by BoBo » 17 Nov 2020, 13:36

Falls ich nicht irre, wird in einer Bedingung wie folgt verglichen "==", wohingegen bei Variablenzuweisung ein einfaches "=" verwendet wird?!
If (AktSignEingabe == AktSignLV) && (ZaehlArtAuswahl == ZaehlArtLV) btw, sind die Variablen alle "gefüllt"?

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 17 Nov 2020, 13:13

Hallo just me!

Wohl wieder derselbe Fehler - nur andersrum. :?
Ich habe jetzt beide MsgBox mal versucht, die die haichen empfohlen hatte und die von dir (Natürlich nicht gleichzeitig.) Ich habe jetzt außerdem noch - wie in den anderen Fällen auch - bei dem LV_GetText die Spaltennummer mit eingefügt.

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 "|"
   ;~ 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
   }
}
Das Ergebnis:
Mit der Schleife wird brav die Tabelle Zeile für Zeile durchgegangen und anschließend der neue Datensatz abgespeichert. Allerdings meldet sich keine Warnung bzw. Fehlermeldung, falls die eingegebenen neuen Werte für AktSign und die ZaehlArt identisch sind mit denen in einem bereits vorhandenen Datensatz. Ich kann den also mehrmals abspeichern, da die If-Abfrage ignoriert wird. Anscheinend ist der Ausdruck darin logisch nicht korrekt. Ich wüßte aber nicht, wie man das anders schreiben soll.

Viele Grüße von Meister Lampe

Re: Optimierung Umbenennungstool

Post by just me » 16 Nov 2020, 04:14

Moin,

die von Dir zitierte Bemerkung bezog sich auf diesen Beitrag. Und meine Frage nach der MsgBox auf die hier auskommentierte Zeile:

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"%ZaehlArtAuswahl%" <-> "%ZaehlArtLV%" " / " "Neu Erstellen" ; <<<<<<<<<<
   If (AktSignEingabe = AktSignLV and ZaehlArtAuswahl = ZaehlArtLV)
   {
      MsgBox, 16, Fehler!, Die Vorlage ist bereits vergeben!
      GuiControl, Focus, AktSignEingabe
      Return
   }
}
Du hast bisher nichts dazu gesagt, ob der Fehler inzwischen behoben ist.

Wenn man in einer Variablen mehrere Werte speichern will, die direkt abgerufen werden können, benutzt man dafür i.d.R. ein AHK-Objekt. Man braucht aber immer einen eindeutigen Bezeichner, um an die einzelnen Werte zu kommen.

Wenn Du nur die Werte aus ZaehlArt und ZaehlArtAuswahl zusammenführen willst, solltest Du erst noch einmal darüber nachdenken, ob Du wirklich beide Werte benötigst.

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 15 Nov 2020, 17:42

Hallo just me!
Eine Subroutine ist und bleibt auch in anderen Sprachen eine Subroutine, soweit Subroutinen unterstützt werden.
Das hatte ich wohl etwas ungeschick formuliert. Natürlich meinte ich nicht die Suroutine selbst, sondern das, was sie produzieren soll. Oder noch etwas präziser: Die Möglichkeit, in der einen Variablen ZaehlArt gleich ein Bündel von mehreren Eigenschaften eines Elementes zusammenzufassen, um sie später als Charakteristika abrufen zu können, ohne sie einzeln abfragen zu müssen.
Hier ist etwas falsch. Mittlerweile solltest Du den Fehler selbst korrigieren können.
Hier muß ich mich bei Dir entschuldigen, denn ich hatte in meinem letzten Post leider versehentlich aus einer älteren Version meines Scripts zitiert. In der aktuellen sieht das dann so aus:

Code: Select all

VorlagenDefinieren:
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
Und hier noch zur Erläuterung, denn ich glaube, daß es das war, was Dich noch irritiert hat:
Mit der DDl werden keine Felder aus der Gui ausgefüllt. Die für die Definition von Bestand, Signatur und ggf. Index müssen weiterhin über die Tastatur gefüllt werden. Es dreht sich darum, wie die nachher miteinander verbunden werden sollen.
Die Variable ZaehlArt ist der Name für die ausgewählte Differenzierung von unterschiedlichen Startindizes und Trennzeichen bei gleicher AktSign. Diese wird in der Tabelle abgespeicher, in der ListBox angezeigt und soll auch in die Erinnerungsdatei zu letzten Auswahl mit aufgenommen werden.
Die Variable ZaehlArtAuswahl beinhaltet die - ausführlichere - Beschreibung, die als Inhalt der DDL zur Auswahl steht.
Beides steht aber letztlich für dieselbe Sache und wird in der Subroutine VorlagenDefinieren: dann sychronisiert.

Ich hoffe, Dir das jetzt etwas verständlicher beschrieben zu haben, als letztes Mal.

Viele Grüße von Meister Lampe

Re: Optimierung Umbenennungstool

Post by just me » 11 Nov 2020, 04:18

Moin,

Meister Lampe wrote:... Wenn ich mich nicht irre, ist das letztlich das, was man in anderen Sprachen "Klassen" nennt. ...
Eine Subroutine ist und bleibt auch in anderen Sprachen eine Subroutine, soweit Subroutinen unterstützt werden.

Code: Select all

If (ZaehlArtAuswahl = vollständige Akte)
Hier ist etwas falsch. Mittlerweile solltest Du den Fehler selbst korrigieren können.

Code: Select all

...
   SignTyp := "vollst. Akte"
...
   ZaehlArt := "ohne Deckblatt"
Hier steckt möglicherweise auch ein Fehler. Das kannst nur Du wissen.

Du hast übrigens bisher nur eine von zwei meiner Fragen beantwortet.

Re: Optimierung Umbenennungstool

Post by Meister Lampe » 10 Nov 2020, 14:09

Hallo zusammen!

Endlich habe ich wieder Zeit, mich um dieses Projekt zu kümmern.

just me fragt:
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?
Nein, das ist nicht so gemeint. Die DDL bietet unterschiedliche Strukturen an, wie die Durchnumerierung nachher stattfinden soll: beginnend mit 0 im Index oder 1, davon abhängig wird auch der Index mit Unterstrich oder Bindestrich abgesetzt, ganz ohne Index etc. In der 4. Spalte der LV werden diese Vorlagen (ich habe sie "Zählarten" genannt) unter einem Namen abgespeichert. Das ist nötig, da jetzt die Variable AktSign mehrmals vorkommen kann und deshalb kein eindeutiges Kriterium mehr ist. Deshalb muß die Variable Zaehlart dann später auch in der externen AuswahlDatei zur letzten Auswahl mit abgespeichert werden.
In einem Abschnitt des Scripts soll das dann entsprechend deklariert werden:

Code: Select all

If (ZaehlArtAuswahl = vollständige Akte)
   {
   SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 0) 
   ZaehlArtZeichen := "-"
   SignTyp := "vollst. Akte"
   }
If (ZaehlArtAuswahl = Faszikel ohne Deckblatt)
   {
   SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichenn := "-"  
   ZaehlArt := "ohne Deckblatt"
   }
If (ZaehlArtAuswahl = abweichende Dokumentationsformate)
   {
   SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 1) 
   ZaehlArtZeichen := "_"
   ZaehlArt := "Einlagen"
   }
Else If (ZaehlArtAuswahl = ohne Indizes)
   {
   SignVorlageNeu := Format("{:0" . StellenSignNeu . "}", 1)
   ZaehlArt := "ohne Index"
   }
Ich weiß nicht, an welche Stelle im Script ich das am besten setzen soll, wahrscheinlich sogar an mehreren, dann sollte ich das als Subroutine auslagern und von diesen Stellen aufrufen. Wenn ich mich nicht irre, ist das letztlich das, was man in anderen Sprachen "Klassen" nennt. Gibt es dazu noch bessere Möglichkeiten in AHK?

Viele Grüße von Meister Lampe

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.

Top