Post by Meister Lampe » 08 Nov 2019, 18:54
Hallo!
Ihr müßt bedenken, daß in meinem vorgesehenen Programm - im Gegensatz zu meinem Beispiel oben - das Script nach dem Gui weitergehen und nicht mit einer Ausgabe aufhören soll. Die eingegebenen Werte sollen im Programm als Variablen verwendet werden oder es im Ablauf entsprechend beeinflussen. Auf jeden Fall endet das nicht mit dem Schließen der Gui, sondern muß ins Hauptprogramm zurück.
Die Gui, die ich benützen möchte, ist etwas komplizierter. Sie ist zur Auswahl aus in einer externen Liste gesammelten Datensätzen über eine ListView gedacht. In meinem Script habe ich mehrere Anwedungen, die alle diese Datensätze aus dieser Liste benötigen, weshalb sie zuerst dort ausgewählt werden müssen. Deshalb soll dann am Anfang immer eine Abfrage stehen, die den aktuell vorhandenen bzw. als letztes noch verwendeten Datensatz angibt, dazu die Optionen
Weiter ,
Ändern und
Abbrechen bietet (übrigens auch eines der Probleme, die ich angesprochen habe!). Bei Ändern soll dann die Subroutine mit der Gui aufgerufen werden.
So sieht die berites fertige Gui aus:
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
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, Button, xm h30 w100 Default gAnwenden, Anwenden
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)
StellenSign := StrLen(SignVorlage)
If (IndexVorlage = "-")
{
StellenIndex := 0
}
else
StellenIndex := StrLen(IndexVorlage)
LetzteSign := 0
If (AktSign <> Auswahl)
{
Auswahl := AktSign
File := FileOpen(AuswahlDatei, "w")
File.Write(Auswahl)
File.Close()
}
Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return
Und so sieht die Abfrage am Anfang solch einer Anwendung aus:
Code: Select all
If (AktSign = "")
{
MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
IfMsgBox Ok
{
Gosub Auswahlfenster
; Hierher sollte der Programmzeiger eigentlich wieder zurückkommen
}
else
return
}
; und hier sollte das Script weiterlaufen, wenn es von der Gui zurückgekommen ist
.
.
return
Alleine ohne die externe Datei läuft das natürlich nicht, aber dieser Code kann Euch vielleicht Aufschluß geben, über den Zweck meiner Frage.
Da die Subroutine
Auswahlfenster von verschiedenen Stellen aus aufgerufen werden soll und auch separat über
F8, kann ich auch keinen Sprungbefehl mit einem einfachen Label einsetzen.
Wie umgehe ich das Dilemma?
Viele Grüße von Meister Lampe
Hallo!
Ihr müßt bedenken, daß in meinem vorgesehenen Programm - im Gegensatz zu meinem Beispiel oben - das Script nach dem Gui weitergehen und nicht mit einer Ausgabe aufhören soll. Die eingegebenen Werte sollen im Programm als Variablen verwendet werden oder es im Ablauf entsprechend beeinflussen. Auf jeden Fall endet das nicht mit dem Schließen der Gui, sondern muß ins Hauptprogramm zurück.
Die Gui, die ich benützen möchte, ist etwas komplizierter. Sie ist zur Auswahl aus in einer externen Liste gesammelten Datensätzen über eine ListView gedacht. In meinem Script habe ich mehrere Anwedungen, die alle diese Datensätze aus dieser Liste benötigen, weshalb sie zuerst dort ausgewählt werden müssen. Deshalb soll dann am Anfang immer eine Abfrage stehen, die den aktuell vorhandenen bzw. als letztes noch verwendeten Datensatz angibt, dazu die Optionen [c]Weiter [/c], [c]Ändern [/c]und [c]Abbrechen[/c] bietet (übrigens auch eines der Probleme, die ich angesprochen habe!). Bei Ändern soll dann die Subroutine mit der Gui aufgerufen werden.
So sieht die berites fertige Gui aus:
[code]; 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
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, Button, xm h30 w100 Default gAnwenden, Anwenden
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)
StellenSign := StrLen(SignVorlage)
If (IndexVorlage = "-")
{
StellenIndex := 0
}
else
StellenIndex := StrLen(IndexVorlage)
LetzteSign := 0
If (AktSign <> Auswahl)
{
Auswahl := AktSign
File := FileOpen(AuswahlDatei, "w")
File.Write(Auswahl)
File.Close()
}
Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return
[/code]
Und so sieht die Abfrage am Anfang solch einer Anwendung aus:
[code]If (AktSign = "")
{
MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
IfMsgBox Ok
{
Gosub Auswahlfenster
; Hierher sollte der Programmzeiger eigentlich wieder zurückkommen
}
else
return
}
; und hier sollte das Script weiterlaufen, wenn es von der Gui zurückgekommen ist
.
.
return
[/code]
Alleine ohne die externe Datei läuft das natürlich nicht, aber dieser Code kann Euch vielleicht Aufschluß geben, über den Zweck meiner Frage.
Da die Subroutine [c]Auswahlfenster[/c] von verschiedenen Stellen aus aufgerufen werden soll und auch separat über [c]F8[/c], kann ich auch keinen Sprungbefehl mit einem einfachen Label einsetzen.
Wie umgehe ich das Dilemma?
Viele Grüße von Meister Lampe