Page 1 of 8
Optimierung Umbenennungstool
Posted: 20 Jan 2019, 18:18
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 21 Jan 2019, 06:43
by just me
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.
Re: Optimierung Umbenennungstool
Posted: 21 Jan 2019, 13:44
by Meister Lampe
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.
Viele Grüße von Meister Lampe
Re: Optimierung Umbenennungstool
Posted: 22 Jan 2019, 02:58
by just me
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.
Re: Optimierung Umbenennungstool
Posted: 22 Jan 2019, 03:30
by nnnik
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:
Re: Optimierung Umbenennungstool
Posted: 22 Jan 2019, 05:06
by just me
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.
Re: Optimierung Umbenennungstool
Posted: 22 Jan 2019, 18:35
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 23 Jan 2019, 04:03
by nnnik
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.
Re: Optimierung Umbenennungstool
Posted: 23 Jan 2019, 10:21
by just me
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
Re: Optimierung Umbenennungstool
Posted: 23 Jan 2019, 18:05
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 24 Jan 2019, 11:44
by just me
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?
Re: Optimierung Umbenennungstool
Posted: 25 Jan 2019, 13:10
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 25 Jan 2019, 14:54
by gregster
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)...
Re: Optimierung Umbenennungstool
Posted: 26 Jan 2019, 05:09
by just me
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.
Re: Optimierung Umbenennungstool
Posted: 28 Jan 2019, 17:30
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 29 Jan 2019, 03:38
by just me
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%
Re: Optimierung Umbenennungstool
Posted: 31 Jan 2019, 07:59
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 31 Jan 2019, 09:21
by just me
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.
Re: Optimierung Umbenennungstool
Posted: 31 Jan 2019, 16:48
by Meister Lampe
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
Re: Optimierung Umbenennungstool
Posted: 02 Feb 2019, 04:27
by just me
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:
Wenn eine andere Lösung für Dich leichter zu realisieren ist, solltest Du die natürlich umsetzen.