Optimierung Umbenennungstool

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Optimierung Umbenennungstool

20 Jan 2019, 18:18

Hallo liebes Forum!

Dank Eurer Hilfe im Thread Mehrere Objekte mit der Maus markieren habe ich ein schönes Werkzeug ur Umbenennung von Bildern im Windows Explorer nach meinen Bedürfnissen erstellen können (Anforderungen und Funktionsweise des Scrips sind im erwähnten Thread im Post vom 20.10.2018/20:05 beschrieben).
Es kommt mir jetzt durch eine Mischung aus Freude am Programmieren, Neugierde, was man noch alles mit dem AHK machen kann, aus Ehrgeiz und Perfektionsfimmel, der Reiz, daran weiterzubasteln. Dazu kommt - natürlich - auch die Möglichkeit, das Tool in seiner Leistungsfähigkeit zu erweitern und effektiver nutzen zu können.
Ich sehe also durchaus noch "Luft nach Oben", wie man so schön sagt, und werde in diesem Thread einige konkrete Fragen dazu haben.

Zuerst nochmals das vollständige und funktionstüchtige Script zur Einsicht:

Code: Select all

;
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force

SetTitleMatchMode, RegEx
;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
;------------------------------------------------------------------------
GroupAdd, Explorer, ahk_class ExploreWClass 
GroupAdd, Explorer, ahk_class CabinetWClass
;------------------------------------------------------------------------

SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "A 96--1"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
Return
; --------------------------------------------------------------------------------------------------
#IfWinActive ahk_group Explorer

!LButton::
   ; Explorerfenster bestimmen
   ExplorerID := WinExist()
   ShellWin := 0
   For Win In ShellApp.Windows {
      If (Win.HWND = ExplorerID) {
         ShellWin := Win
         Break
      }
   }
   If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
      Return
   ; Auswahl nach unten erweitern
   Send, +{LButton}
   ; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
   If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
      MsgBox, Sie müssen mindestens eine Datei markieren!
      Return
   }
   SelectedItems := []
   For Item In ShellWin.Document.SelectedItems
      SelectedItems.Push(Item)
   LetzteDatei := SelectedItems.RemoveAt(1)  ; erste (bzw. letzte) Datei aus dem Array entfernen ...
   SelectedItems.Push(LetzteDatei)           ; ... und wieder anhängen
   Anzahl := SelectedItems.Length()
   ; Benutzereingaben zum Umbenennen holen
   LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
   InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%
   If (ErrorLevel) {
      LetzteSign--
      Return
   }
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
      LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := 0 ; Setzt Index auf 0
   }
   Else {
      StringSplit, BoxArray, BoxSign, `,
      If (BoxArray1 = "")
         LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
      Else
         LetzteSign := Format("{:04}", 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("{:03}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
	  Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex
      LetzterIndex++
   }
   
   ; Fertig
   ; Letzte Datei selektieren
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
   ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
   For Index, Item In SelectedItems
	Item := ""
   ShellWin := ""
Return
#IfWinActive
Die erste Frage dreht sich um die Dateinamenerweiterungen:
Das Programm funktioniert nur einwandfrei, wenn diese ausgeblendet sind. Ansonsten werden sie ein zweites Mal hinten angehängt. Nun werden sie bei unseren PCs im Büro aber standardmäßig eingeblendet, und zwar über eine Funktion des internen Netzwerkes. Das bedeutet, daß wir die Dateinamenerweiterungen nur temporär ausblenden können, sie aber nach einiger Zeit (ca. 2h) unvorhergesehen wieder da sind. Das kann sogar passieren, während die Umbenennung läuft. Dabei wird zwar um Glück nichts zerstört, sondern der Vorgang nur abgebrochen und kann nach erneutem Ausblenden der Erweiterungen wiederholt werden, aber es ist lästig. Und das vor allem, weil geplant ist, daß auch andere Kollegen damit mal arbeiten sollen. Dann muß das natürlich ohne solche Umstände funktionieren.

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

Re: Optimierung Umbenennungstool

21 Jan 2019, 06:43

Moin,

hast Du das 'richtige' Skript eingestellt? In diesem erfolgt das Umbenennen ja hier

Code: Select all

   For Index, Item In SelectedItems {
      ItemPath := Item.Path
      SplitPath, ItemPath, DateiName, , Erweiterung
      LetzterIndex := Format("{:03}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
	  Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex
      LetzterIndex++
   }
Ich kann nicht erkennen, wie sich dabei die Erweiterung 'verdoppeln' soll. Die Ausgaben von SplitPath werden nicht weiter verarbeitet.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

21 Jan 2019, 13:44

Hallo just me!

Du hast recht, dieser Fehler trat bei einer der Vorgängerversionen auf. Bei der hier vorliegenden ist es umgekehrt: Es kommt die Meldung, daß die Dateien durch das Ändern der Erweiterungen unbrauchbar werden könnten. Klickt man diese weg, dann stehen die Bilder quasi nackt da und das Format ist nicht mehr zu erkennen. Sie sind zwar immernoch zu öffnen, aber in den Eigenschaften steht nur noch "Datei" und nicht mehr "BMP-Datei" oder so.

Also ist das Script auch weiterhin nur mit ausgeblendeten Dateinamenerweiterungen zu genießen. :problem:

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

Re: Optimierung Umbenennungstool

22 Jan 2019, 02:58

Moin,
just me wrote:
21 Jan 2019, 06:43
... Die Ausgaben von SplitPath werden nicht weiter verarbeitet.

Die Dateinamenserweiterung ist Bestandteil des Dateinamens. Den bildest Du beim Umbenennen mit

Code: Select all

	  Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex
Eine Dateinamenserweiterung sehe ich da nicht.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Optimierung Umbenennungstool

22 Jan 2019, 03:30

Das Problem liegt wohl im Item.name Attribut welches die Erweiterung beeinflusst, wenn diese im Explorer aktiviert/deaktiviert ist.
Es würde sich lohnen zu überprüfen ob diese auch mit ausgegeben wird, wenn du das Attribut ausliest:

Code: Select all

Msgbox % Item.Name
Recommends AHK Studio
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

22 Jan 2019, 05:06

Moin,

Item.Name enthält bei mir auf Win 10 keine Erweiterung, wenn die Erweiterung im Explorerfenster ausgeblendet ist. Die Erweiterung steht aber noch in Item.Path.

Code: Select all

ItemPath := Item.Path
SplitPath, ItemPath, DateiName, , Erweiterung
liefert deshalb die ursprüngliche Erweiterung. Wenn beim Umbenennen über Item.Name eine fehlende Erweiterung nicht automatisch durch die ursprüngliche ersetzt wird, würde ich das händisch versuchen:

Code: Select all

   For Index, Item In SelectedItems {
      ItemPath := Item.Path
      SplitPath, ItemPath, DateiName, , Erweiterung
      LetzterIndex := Format("{:03}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
	  Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex . "." . Erweiterung ; <<<<< geändert
      LetzterIndex++
   }
Möglicherweise ist diese Art des Umbenennens über Item.Name aber auch nicht im Sinne des Erfinders der ShellFolderItems.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

22 Jan 2019, 18:35

Hallo just me & nnnik!

Ich habe es jetzt wie oben vorgeschlagen versucht und die Erweiterung zum Namen noch dazugefügt. Dabei habe ich mich daran erinnert, daß ich genau das bereits schon einmal hatte: Das nämlich war die Version, welche die Namen dann doppelt hinten anfügte.
Bei eingeblendeten Dateinamerweiterungen klappt es mit dem angefügten Codeschnipsel . "." . Erweiterung . Ansonsten verschwinden sie ganz.
Wenn sie ausgeblendet sind, funtioniert es nur ohne diesen Code, sonst werden sie verdoppelt.
Das SplitPath scheint sich einzig um den sichtbaren Namen zu kümmern. Wenn es da nichts abzuschneiden gibt, wird es in Ruhe gelassen, ist was da, wird es kopiert.
Könnte es daran liegen, daß die Funktion SplitPath nicht spezifisch nach den Dateiendungen sucht, sondern einfach nur die Punkte sucht und dort abtrennt?
Und muß man den Punkt überhaupt noch zusätzlich einfügen oder gehört der nicht schon automatisch zur Erweiterung - im Gegensatz zu den anderen Trennzeichen wie den Binde- und Unterstrichen?
Zumindest habe ich jetzt für beide Fälle einen funktionierenden Code. Schade nur, daß ich nicht denselben dafür verwenden kann.
Falls man das nicht hinbekommt, könnte man vielleicht ganz am Anfang des Scripts prüfen, welche Einstellung gerade aktiviert ist und über eine If-Abfrage unterschiedliche Umbenennungsschleifen ansteuern.

Viele Grüße von Meister Lampe
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Optimierung Umbenennungstool

23 Jan 2019, 04:03

OK da habe ich mich wohl klar ausgedrückt:
Was ich meinte war, dass du die Erweiterung anhängen musst wenn sie im Explorer aktiviert ist, und das lassen musst wenn sie deaktiviert ist.
Das was du berichtest bestätigt meine Vermutung. Was allerdings wichtig zu wissen wäre ob diese Einstellung sich auch auf dem .name Attribut des Item Objektes wiederspiegelt.
Daher wäre es interessant zu wissen, was Msgbox % item.name ausgibt wenn die Einstellung deaktiviert ist und was es ausgibt wenn sie aktiviert ist.
just me hat bei der deaktivierten Einstellung keine eingeblendeten Dateinamen. Nun müssen wir wissen ob die Erweiterung eingeblendet wird, bei der aktivierten Einstellung.
Dann müssten wir nur den letzten Teil vom .path Attribut mit dem letzten Teil des .name Attributs vergleichen und daraufhin eine Erweiterung anhängen oder nicht.
Recommends AHK Studio
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

23 Jan 2019, 10:21

Moin,

ich glaube, ich habe jetzt auch begriffen, wo der Schuh drückt. Auf meinem Rechner ist die Erweiterung bei ausgeblendeten Dateierweiterungen im Feld Item.Name nicht enthalten, wohl aber im Feld Item.Path. Wie nnnik vorschlägt, könnte man deshalb über den Vergleich des Dateinamens aus SplitPath, ItemPath, DateiName, , Erweiterung mit dem Namen aus Item.Name ermitteln, ob dem neuen Namen die Erweiterung angehängt werden muss, oder nicht. Das unter Shell.Document verborgene ShellFolderView Objekt kennt aber die Eigenschaft ViewOptions, über die man direkt auf die Einstellung zurückgreifen kann. Das habe ich im folgenden Code versucht und es scheint auch zu klappen:

Code: Select all

;
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force

SetTitleMatchMode, RegEx
;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
;------------------------------------------------------------------------
GroupAdd, Explorer, ahk_class ExploreWClass
GroupAdd, Explorer, ahk_class CabinetWClass
;------------------------------------------------------------------------

SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "A 96--1"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
Return
; --------------------------------------------------------------------------------------------------
#IfWinActive ahk_group Explorer

!LButton::
   ; Explorerfenster bestimmen
   ExplorerID := WinExist()
   ShellWin := 0
   For Win In ShellApp.Windows {
      If (Win.HWND = ExplorerID) {
         ShellWin := Win
         Break
      }
   }
   If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
      Return
   ; Auswahl nach unten erweitern
   Send, +{LButton}
   ; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
   If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
      MsgBox, Sie müssen mindestens eine Datei markieren!
      Return
   }
   SelectedItems := []
   For Item In ShellWin.Document.SelectedItems
      SelectedItems.Push(Item)
   LetzteDatei := SelectedItems.RemoveAt(1)  ; erste (bzw. letzte) Datei aus dem Array entfernen ...
   SelectedItems.Push(LetzteDatei)           ; ... und wieder anhängen
   Anzahl := SelectedItems.Length()
   ; Prüfen, ob die Dateinamenserweiterungen angezeigt werden
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-viewoptions
   ShowExt := (ShellWin.Document.ViewOptions & 2) ; SFVVO_SHOWEXTENSIONS (0x00000002)
   ; MsgBox, 0, ShowExt, %ShowExt%
   ; Benutzereingaben zum Umbenennen holen
   LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
   InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%
   If (ErrorLevel) {
      LetzteSign--
      Return
   }
   If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
      LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
      LetzterIndex := 0 ; Setzt Index auf 0
   }
   Else {
      StringSplit, BoxArray, BoxSign, `,
      If (BoxArray1 = "")
         LetzteSign := Format("{:04}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
      Else
         LetzteSign := Format("{:04}", 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("{:03}", LetzterIndex)  ; Setzt Index auf 1 in 2 Ziffern
      Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex . (ShowExt ? "." . Erweiterung : "")
      LetzterIndex++
   }

   ; Fertig
   ; Letzte Datei selektieren
   ; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
   ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
   For Index, Item In SelectedItems
      Item := ""
   ShellWin := ""
Return
#IfWinActive
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

23 Jan 2019, 18:05

Hallo just me!

Das klappt jetzt prima - mit und ohne Erweiterungen. Vielen Dank.

Jetzt mal eine Frage nebenbei: Verändert Dein Editor oder der hier von der Webseite den Code eigentlich automatisch? In meinen Scripts z.B. fange ich für geklammerte Blöcke wie Schleifen immer eine neue Zeile an. Wenn der Code dann von Dir zurückkommt, dann stehen die öffnenden Klammern am Ende der jeweils letzten Zeile. Die Funktionstüchtigkeit bleibt davon ab er anscheinend unberührt. Trotzdem würde mich interessieren, wie das zustande kommt.

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

Re: Optimierung Umbenennungstool

24 Jan 2019, 11:44

Meister Lampe wrote:
23 Jan 2019, 18:05
... Jetzt mal eine Frage nebenbei: Verändert Dein Editor oder der hier von der Webseite den Code eigentlich automatisch? ...

Moin, das verstehe ich nicht. Kannst Du mal ein konkretes Beispiel geben?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

25 Jan 2019, 13:10

Hallo just me!

Dann muß das wohl am Editor des Forums liegen:
Der Anfang meines Scriptes, das ich hier eingefügt hatte, sah so aus (kann ich jetzt leider nur als Text hereinsetzen):

!LButton::
; Explorerfenster bestimmen
ExplorerID := WinExist()
ShellWin := 0
For Win In ShellApp.Windows
{
If (Win.HWND = ExplorerID)
{
ShellWin := Win
Break
}
}
If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
Return

; Auswahl nach unten erweitern
Send, +{LButton}
; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
If !(ShellWin.Document.SelectedItems.Count > 0) ; keine Auswahl
{
MsgBox, Sie müssen mindestens eine Datei markieren!
Return
}
Auswahl := []

Im Code- Editor wird dann das daraus:

Code: Select all

!LButton::
; Explorerfenster bestimmen
ExplorerID := WinExist()
ShellWin := 0
For Win In ShellApp.Windows 
{
	If (Win.HWND = ExplorerID)
	{
		ShellWin := Win
		Break
	}
}
	If !(ShellWin) 									; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
Return

; Auswahl nach unten erweitern
Send, +{LButton}
; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
If !(ShellWin.Document.SelectedItems.Count > 0) 	; keine Auswahl 
{ 
	MsgBox, Sie müssen mindestens eine Datei markieren!
	Return
}
Auswahl := []
In der Vorschau sieht das noch so aus wie das Original, aber anscheinend ändert sich das beim Senden und die Zeilenumbrüche werden neu gesetzt, Klammern anders zusammengefaßt und Kommentare verschoben.

Viele Grüße von Meister Lampe
gregster
Posts: 8921
Joined: 30 Sep 2013, 06:48

Re: Optimierung Umbenennungstool

25 Jan 2019, 14:54

Mir ist nur aufgefallen, dass im Textbereich (inkl Zitate) der Posts reinkopierte Tabstops - im Gegensatz zur Codebox - ignoriert werden. Beim Drücken der Tab-Taste wechselt man allerdings sowieso zum nächsten Steuerelement (eben außer in der Codebox, wo ein Tabstop eingefügt wird).

Daher geht in der Darstellung des eigentlichen Posts beim Code die Einrückung visuell verloren, die du im Editfield ggf. siehst. Kann sein, dass die Codebox noch weitere Formatierungsregeln hat, die aber von den Admins per Skript beeinflusst werden können. Ich bezweifle aber, dass die Codebox irgendwas einrückt, was nicht sowieso im Rohtext eingerückt worden ist. Eher umgekehrt, außerhalb der Codebox wird jede Einrückung, die im Rohtext vorhanden ist (inkl. mehrfache Leerzeichen) ignoriert.
Ich fände es ja gut, wenn im normalen Text auch Tabs respektiert würden (vielleicht geht das auch mit irgendwelchen Tricks)...
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

26 Jan 2019, 05:09

Moin,

für mich unterscheiden sich die beiden Versionen auch nur durch die Einrückungen. Siehst Du mehr Unterschiede?

Wenn ich Fremdcode bearbeite, verändere ich manchmal die Blockklammern

Code: Select all

; aus
If (...)
{
   ...
}
; wird
If (...) {
   ...
}
Außerdem verändere ich manchmal Codezeilen und/oder die Position von Kommentaren, wenn mir die Zeilen unübersichtlich lang erscheinen.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

28 Jan 2019, 17:30

Hallo just me!
Wenn ich Fremdcode bearbeite, verändere ich manchmal die Blockklammern...
Außerdem verändere ich manchmal Codezeilen und/oder die Position von Kommentaren, wenn mir die Zeilen unübersichtlich lang erscheinen.
Ja, genau das war's, was mich irritiert hatte. Da hat wohl jeder seine eigene Vorstellung von Übersichtlichkeit. Ich fange halt grundsätzlich für jeden Block und Befehl eine neue Zeile an. Meine erste Programmiersprache war Turbo Pascal, da gab's auch noch keine Klammern...

So, jetzt aber zur nächsten Frage:
Mit diesem (von Dir vorgeschlagenen) Code

Code: Select all

LetzteSign := Format("{:04}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
formatiere ich die Signaturen und Indizes auf eine definierte Stellenzahl, in diesem Falle 4.
Kann ich stattdessen auch eine Variable eingeben? Und wenn ja, wie?
Dann könnte ich das Tool auch für andere Bestände als diesen verwenden, ohne es jedesmal umschreiben zu müssen. Eine Inputbox um den Bestandsnamen (Variable "AktSign") zu verändern, habe ich bereits erstellt. Das nächste wäre dann eine Gui.

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

Re: Optimierung Umbenennungstool

29 Jan 2019, 03:38

Moin Meister Lampe,

wie in Ausdrücken üblich. Man bricht den Textparameter an der entscheidenden Stelle auf und ersetzt die im Text vorgegebene Zahl durch eine Variable:

Code: Select all

Stellen := 4
BoxSign := 2
LetzteSign := Format("{:0" . Stellen . "}", BoxSign) ; Setzt neue Signatur auf 'Stellen' Ziffern
MsgBox, %LetzteSign%
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

31 Jan 2019, 07:59

Hallo just me!

Ja, prima. Genauso habe ich es mir gedacht. Nur bisher etwas naiver daran herumeperimentiert.

Ich habe mittlerweile eine Gui erstellt, in die man die nötigen Einstellungen eingeben kann:

Code: Select all

; Standardvorlage:
StellenSign := 4
StellenIndex := 4
SignVorlage := 0000
IndexVorlage := 0000

F7::
Ansagen:
Gui,1: New,,
Gui,1: Show, x100   y100    h195  w375, Signierungsvorlage
Gui,1: Font, s10 , Verdana

GuiText_1 = Geben Sie hier den Standard für das nächste Umbenennungsprojekt ein!
Gui,1: Add, Text, x20      y20    h45   w350           , %GuiText_1% 
Gui,1: Add, Text, x20      y65    h30   w60            , Bestand:
Gui,1: Add, Text, x115     y65    h30   w60            , Signatur:
Gui,1: Add, Text, x190     y65    h30   w90            , Index:
Gui,1: Add, Text, x123     y95    h25   w15            , _
Gui,1: Add, Text, x210     y95    h25   w15            , -

Gui,1: Add, Edit, cblue    x20    y90     h25   w100      vBestandAuswahl, %AktSign%
Gui,1: Add, Edit, cblue    x135   y90     h25  w70      vSignVorlage, %SignVorlage%
Gui,1: Add, Edit, cblue    x220   y90     h25  w70      vIndexVorlage, %IndexVorlage%
GuiControl, Focus, BestandAuswahl

Gui,1: Add, Button,       x20    y135    h30   w100     Default, Speichern ; ButtonOK-Label (wenn vorhanden) wird ausgeführt, wenn der Button gedrückt wird.
Gui,1: Add, Button,       x150   y135    h30   w100     gAbbrechen, Abbrechen

return  ; Ende des automatischen Ausführungsbereichs. Das Skript ist solange im Leerlauf, bis der Benutzer irgendetwas macht.

Abbrechen:
Gui, Cancel
return

GuiClose:
ButtonSpeichern:
Gui, Submit  ; Speichert die Benutzereingaben in die entsprechenden Steuerelementvariablen.
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
AktSign := BestandAuswahl
return
Schön wäre es jetzt, wenn ich neu eingegebene Einstellungen auch über die Schließung des Script hinaus abspeichern und später wieder aufrufen könnte. Wenn ich richtig im Tutorial gelesen habe, gäbe es dafür sogar gleich mehrere ähnliche Möglichkeiten. ListView habe ich mir einmal angesehen, das scheint sich aber mehr auf die Auflistung von Dateien, nicht von Datensätzen zu beziehen. Ich müßte dazu ja irgendeine Art von Tabelle kreieren.
Wie geht das am Besten?

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

Re: Optimierung Umbenennungstool

31 Jan 2019, 09:21

Moin,

den Zusammenhang zwischen der Speicherung von Einstellungen und einem ListView verstehe ich nicht. Wenn es eine übersichtliche Zahl von Einstellungsparametern gibt, ist die normale Lösung eine INI-Datei.

Praktisch könnte das so aussehen:
Schreiben:

Code: Select all

IniDatei := A_ScriptDir . "\MeinSkriptName.ini"
...
; Syntax: IniWrite, Wert, Dateiname, Sektion, Key
IniWrite, %StellenSign%, %IniDatei%, Einstellungen, StellenSign
Lesen:

Code: Select all

IniDatei := A_ScriptDir . "\MeinSkriptName.ini"
...
; Syntax: IniRead, AusgabeVar, Dateiname, Sektion, Key [, Standardwert]
IniRead, StellenSign, %IniDatei%, Einstellungen, StellenSign, 4 ; vier ist der Vorgabewert, falls die Datei oder der Eintrag noch nicht existieren.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

31 Jan 2019, 16:48

Hallo just me!

Das mit dem ListView habe ich aus demTutorial falsch herausgelesen. Und Dir auch etwas undeutlich gesagt, was ich mit "Einstellungen" meine. Es sind die Parameter, mit denen die Signaturvergabe nach ihrer Eingabe in die Gui laufen soll.
Durch die Eingabe in der Gui erhalte ich Werte für die Variablen %AktSign% (=Bestandsname), %StellenSign% (=Stellenanzahl Signatur), %StellenIndex% (=Stellenanzahl Index). Es geht nun darum, diese in einer Art von erweiterbarer Tabelle als Datensatz abzulegen, damit ich sie später wieder aufrufen und benutzen kann (mit einer ComboBox o.ä.).
Sollte ich dazu erstmal eine Excel (oder andere) Tabelle erstellen, auf die AHK dann zurückgreifen kann?
Oder wird sowas besser über ein Array gelöst?

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

Re: Optimierung Umbenennungstool

02 Feb 2019, 04:27

Moin,

wenn Du mehrere Sätze logisch zusammenhängender Parameter wie AktSign, StellenSign und StellenIndex zur Auswahl vorhalten willst, geht das auch über eine INI-Datei. In diesem Fall kann man dem Parametersatz einen Namen geben und den als Section-Namen verwenden. Innerhalb der Sections gbt es dann immer die drei o.a. Keys mit zugeordneten Werten.

Man kann das auch mit einfachen Textdateien im "CSV"-Format machen. Pro Satz gäbe es dann z.B. 4 durch Tab getrennte Felder wie Name, Aktsign, StellenSign und StellenIndex:

Code: Select all

EinName	EinSign	4	6
Wenn eine andere Lösung für Dich leichter zu realisieren ist, solltest Du die natürlich umsetzen.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 35 guests