; Gui's mal kurz erstellen mit Grund-Funktionalität

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

; Gui's mal kurz erstellen mit Grund-Funktionalität

27 Jan 2019, 16:39

für

Code: Select all

#Include *i %A_ScriptDir%\Includes\IncludeMaster.ahk
FlexWin(ByRef Opt,Elemente*){
	static	; muss zwingend in der ersten Funktions-Zeile stehen.
	global Mem,GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1
	; ,11GuiButton1
	KorrekturX := 10
	RelLageOpt :=
	if NOT KorrekturYEingelesen
	{
		IfExist %A_Temp%\GuiYEich.txt
		{
			FileRead,KorrekturY,%A_Temp%\GuiYEich.txt
			if NOT ErrorLevel
				KorrekturYEingelesen := true
		}
	}
	if(KorrekturY="")
		KorrekturY := 48	; Priv 4K-Laptop
;	KorrekturY := 30	; Gesch-Laptop-Gr
	if (GuiNr = "")
		GuiNr := 10
	if (NOT IsObject(Mem))
		Mem := {}
	if (NOT IsObject(GuiHwnd))
		GuiHwnd := {}
	if (NOT IsObject(oGuiNr))
		oGuiNr := {}
	if(Opt.Close)
	{
		if(Opt.GuiHwnd <> "")
		{
			DieseGuiNr := oGuiNr[Opt.GuiHwnd]
			Gui,%DieseGuiNr%:Destroy
			; + ggf. Aufraeumen bei den Daten
		}
		else
		{
			; gosub Schlussabwicklungen
			ExitApp
		}
	}
	else if(Opt.New)
	{
		++GuiNr
		DieserGuiName := Opt.GuiName
		GuiNewOpt := Opt.GuiNewOpt
		if(InStr(GuiNewOpt,"-DPIScale"))
		{
			DPIScale:=false
			ScreenDPI := 96
			DieseKorrekturY := 0			
		}
		else
		{
			DPIScale:=true
			ScreenDPI := A_ScreenDPI
			DieseKorrekturY := KorrekturY
		}
		if(Opt.RelLage <> "")	; bspw. "Y|wieVor"
		{
			if(InStr(Opt.RelLage,"|"))
			{
				zeichen_von:= StrSplit(Opt.RelLage,"|",A_Space)
				Lagewort := zeichen_von.1
				HwndTest := zeichen_von.2
				if(zeichen_von.2="LastGui")
				{
					Zeichen := StrSplit(zeichen_von.1)
					Loop % Zeichen.MaxIndex()
					{
						temp := zeichen_von.2 Zeichen[A_Index]
						RelLageOpt .= Zeichen[A_Index] %temp% A_Space
					}
				}
				else if HwndTest is Integer
				{
					IfWinExist,ahk_id %HwndTest%
					{
						DieseWinhwnd := HwndTest
						WinGetPos,WinX1,WinY1,WinW,WinH,ahk_id %DieseWinhwnd%
						WinX2 := WinX1 + WinW
						WinY2 := WinY1 + WinH
						if(Lagewort = "RechtsVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else if(Lagewort = "LinksVon")
						{
							WinNeuX2 := WinX1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuX1	WinNeuX2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "OberhalbVon")
						{
							WinNeuY2 := WinY1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuY1	WinNeuY2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "UnterhalbVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
					}
				}
				else
					MsgBox Opt.RelLage ... | %HwndTest% wird noch nicht unterestuetzt!
			}
			else
				MsgBox Opt.RelLage ohne | wird noch nicht unterestuetzt!
		}
		Gui,%GuiNr%:New, %GuiNewOpt% +HwndGui%GuiNr%WinHwnd, %DieserGuiName%
		DiesesGuiHwnd := GuiHwnd[GuiNr] := Gui%GuiNr%WinHwnd
		Mem[DiesesGuiHwnd] := {}
		Mem[DiesesGuiHwnd].Elements := {}
		oGuiNr[DiesesGuiHwnd] := GuiNr
		EditNr := 1
		StaticNr := 1
		ButtonNr := 1
		InclOut :=
		InclOutFI :=
		for index,Element in Elemente
		{
			; Ele[A_Index] := Element
			if(NOT IsObject(Element))
			{
				MsgBox Elemente werden als Objekt erwartet. Stopp
				return
			}
			else
			{
				Mem[DiesesGuiHwnd].Elements[index] := Element
				if(NOT KorrekturYEingelesen AND A_Index=1)
				{
					if (Element.Opt="")
					{
						Element.Opt:= " y6 "
						EichAnfY := 6
					}
				}
				if(Element.RelLage = "YwieVor")
				{
					temp1 := (LastX+LastWidth+KorrekturX)/ScreenDPI*96
					temp2 := (LastY-KorrekturY)/ScreenDPI*96
					; temp2:=1
					DynOpt := " X" temp1 " Y" temp2  " "
					; DynOpt := " X" 1 " Y" 51  " "
				}
				else
					DynOpt :=
				if(Element.Witch = "Edit")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Edit, %DynOpt% g%GuiNr%GuiEdit%EditNr% v%GuiNr%GuiEdit%EditNr% Hwnd%GuiNr%HwndEdit%EditNr% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Edit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndEdit%EditNr%
					++EditNr
				}
				else if(Element.Witch = "Text")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Text, %DynOpt%  Hwnd%GuiNr%HwndStatic%StaticNr%  %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Static" StaticNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiStatic" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndStatic%StaticNr%
					++StaticNr
				}
				else if(Element.Witch = "Button")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Button,g%GuiNr%GuiButton%ButtonNr% v%GuiNr%GuiButton%ButtonNr% Hwnd%GuiNr%HwndButton%ButtonNr% %DynOpt% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Button" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndButton%ButtonNr%
					++ButtonNr
				}
				Gui,%GuiNr%:Show,AutoSize
				ControlGetPos,DiesesX,DiesesY,DiesesWidth,DiesesHeight,%DiesesControl%,ahk_id %DiesesGuiHwnd%
				if(Element.RelLage = "YwieVor")
				{
					if(LastY <> DiesesY)
						ControlMove,%DiesesControl%,,%LastY%,,,ahk_id %DiesesGuiHwnd%
				}
				if(EichAnfY>0 AND NOT KorrekturYEingelesen AND DiesesY<>"" AND DPIScale)
				{
					vorlKorrekturY := Round(DiesesY-ScreenDPI*EichAnfY/96)
					if vorlKorrekturY is Integer
					{
						KorrekturY := vorlKorrekturY
						FileAppend,%KorrekturY%,%A_Temp%\GuiYEich.txt
						KorrekturYEingelesen := true
						MsgBox Die Eichung KorrekturY ist mit dem Eichwert %KorrekturY% erfolgt.
					}
					else
						EichAnfY :=
				}
				if(Element.AutoXYWH <> "")
				{
					; MsgBox % Element.AutoXYWH 
					InclOut .= A_Tab A_Tab A_Tab 	"ControlHwnd := MemGuiHwnd.Elements[" index "].ControlHwnd" "`r`n"
					InclOut .= A_Tab A_Tab A_Tab 	"AutoXYWH(""" Element.AutoXYWH """, ControlHwnd)" "`r`n"
					; MsgBox % InclOut
				}
				LastGuiHwnd := DiesesGuiHwnd
				LastX := DiesesX
				LastY := DiesesY
				LastWidth := DiesesWidth
				LastHeight := DiesesHeight
				if(LastControlHwnd = Mem[DiesesGuiHwnd].Elements[index].ControlHwnd)
				{
					MsgBox %A_LineNumber%  Zwei Hwnd's dürfen nicht gleich sein!`n%Index%
					ListVars
				}

			}
		}
		DiesesGuiOpt := Opt.GuiOpt
		Gui,%GuiNr%:Show,AutoSize %DiesesGuiOpt% %RelLageOpt% ; <--hier kann AutoSize verwendet werden
; MsgBox %DiesesGuiOpt% # %RelLageOpt%
		WinGetPos,LastGuiX,LastGuiY,LastGuiW,LastGuiH,ahk_id %DiesesGuiHwnd%
		InclOutFI =
(
%GuiNr%GuiSize(MemGuiHwnd="",GuiNr="",GuiHwnd=""){
	global EndeHaupPrg
	if EndeHaupPrg
	{
		if(IsObject(MemGuiHwnd))
		{
%InclOut%
		}
	}
}
)
		IfNotExist % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
		{
			IfNotExist % A_ScriptDir "\includes"
				FileCreateDir,  % A_ScriptDir "\includes"
			FileAppend,%InclOutFI%, % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
			if NOT ErrorLevel
				FileAppend, #include *i %A_ScriptDir%\Includes\%GuiNr%GuiSize.ahk`r`n,%A_ScriptDir%\Includes\IncludeMaster.ahk
		}
			
		; MsgBox % InclOutFI
	}
	Mem[DiesesGuiHwnd].Opt := Opt
	
	if(Opt.GuiHwnd = "")
		Opt.GuiHwnd := DiesesGuiHwnd
	Opt :=
	return DiesesGuiHwnd
	
11GuiEdit1:
11GuiEdit2:
11GuiEdit3:
12GuiEdit1:
12GuiEdit2:
12GuiEdit3:
13GuiEdit1:
13GuiEdit2:
13GuiEdit3:
14GuiEdit1:
14GuiEdit2:
14GuiEdit3:
15GuiEdit1:
15GuiEdit2:
15GuiEdit3:
if (IsFunc("GuiEditAction"))
	{
		GuiNr:=SubStr(A_ThisLabel,1,2)
		Gui,%GuiNr%:Submit, NoHide		; wird benoetigt sonst wird vVariable nicht aktualisiert beim Schreiben
		DieserEditVarName := SubStr(A_ThisLabel,1,2) "GuiEdit" SubStr(A_ThisLabel,0)
		DieserfuncName := "GuiEditAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel,%DieserEditVarName%)
	}

return

11GuiButton1:
11GuiButton2:
11GuiButton3:
12GuiButton1:
12GuiButton2:
12GuiButton3:
13GuiButton1:
13GuiButton2:
13GuiButton3:
14GuiButton1:
14GuiButton2:
14GuiButton3:
15GuiButton1:
15GuiButton2:
15GuiButton3:
	if (IsFunc("GuiButtonAction"))
	{
		DieserfuncName := "GuiButtonAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel)
	}
return

11GuiClose:
12GuiClose:
13GuiClose:
14GuiClose:
15GuiClose:
	if (IsFunc("GuiCloseAction"))
	{
		DieserfuncName := "GuiCloseAction"
		SchliessHwnd := GuiHwnd[SubStr(A_ThisLabel,1,2)]
		%DieserfuncName%(SchliessHwnd,A_ThisLabel)
	}
return

11GuiSize:
12GuiSize:
13GuiSize:
14GuiSize:
15GuiSize:
if EndeHaupPrg
{
	DieseGuiNr := SubStr(A_ThisLabel,1,2)
	; MsgBox %DieseGuiNr%	%A_ThisLabel%
	DiesesGuiHwnd := GuiHwnd[DieseGuiNr]
	; MsgBox % DiesesGuiHwnd
	df := Func(A_ThisLabel)
	df.Call(Mem[DiesesGuiHwnd],DieseGuiNr,DiesesGuiHwnd)
}
return

}
; =================================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable 
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; ---------------------------------------------------------------------------------
; Version: 2015-5-29 / Added 'reset' option (by tmplinshi)
;          2014-7-03 / toralf
;          2014-1-2  / tmplinshi
; requires AHK version : 1.1.13.01+
; =================================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}
 
  If (DimSize = "reset")
    Return cInfo := {}
 
  For i, ctrl in cList {
    ctrlID := A_Gui ":" ctrl
    If ( cInfo[ctrlID].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
        fx := fy := fw := fh := 0
        For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]")))
            If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%)
              f%dim% := 1
        cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD}
    }Else If ( cInfo[ctrlID].a.1) {
        dgx := dgw := A_GuiWidth  - cInfo[ctrlID].gw  , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
        For i, dim in cInfo[ctrlID]["a"]
            Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space
        GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options
} } }
global GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1,EndeHaupPrg
; MsgBox % 96/A_ScreenDPI
; --------------------------------------------------------------------------------
Opt := {}
Opt.New := true
; Opt.GuiNewOpt := " +resize " ; -DPIScale"
Opt.GuiNewOpt := " +resize  -DPIScale"
Opt.GuiName := "Name"
Opt.GuiOpt := " x6 y6 " 
Elem1 := {}
Elem1.Witch := "Text"
Elem1.Txt := "Name eingeben"
Elem2 := {}
Elem2.Witch := "Edit"
Elem2.AutoXYWH := "WH"
temp = 
(
Vorname [zweiter Vorname] Name
weitere Vornamen
Spitz-Name
Künstler-Name

Privat:
Straße	Hausnummer
Zusatz
D-12345	Meinestadt
Deutschland
Tel. Festnetz
Tel. Mobil
Fax
E-Mail
HomePage
Sonstiges

Privat:
Straße	Hausnummer
Zusatz
D-12345	Meinestadt
Deutschland
Tel. Festnetz
Tel. Mobil
Fax
E-Mail
HomePage
Sonstiges

)
Elem2.Txt := temp
Elem3 := {}
Elem3.Witch := "Button"
Elem3.AutoXYWH := "Y"
Elem3.Txt := "Name speichern"
Elem4 := {}
Elem4.RelLage := "YwieVor"
Elem4.Witch := "Button"
Elem4.AutoXYWH := "XY"
Elem4.Opt := "X260"
Elem4.Txt := "überspringen"
FirstWinHwnd := FlexWin(Opt,Elem1,Elem2,Elem3,Elem4)
; MsgBox vor Resize
; AutoXYWH("Resize")
; --------------------------------------------------------------------------------
Opt := {}
Opt.New := true
Opt.GuiNewOpt := " +resize "
Opt.GuiName := "Suche"
Opt.RelLage := "X|LastGui"	; (relative-)Laage	geplant: FreieStelle, X/Y/W/H|wieVor X/Y/W/H|Hwnd rechts/links/ueber/unter|Hwnd
                            ; dito fuerd Elem#.
; Opt.GuiOpt := " x1 y1 " 	; oder Zeile drueberRelLage
Elem1 := {}
Elem1.Witch := "Edit"
Elem1.Txt := "Vor-Filter                     "
Elem2 := {}
Elem2.RelLage := "YwieVor"
Elem2.Witch := "Edit"
Elem2.AutoXYWH := "W"
Elem2.Txt := "End-Filter                                                                "
Elem3 := {}
Elem3.Opt := " x10 "
Elem3.Witch := "Button"
Elem3.Txt := "Suche"
Elem4 := {}
Elem4.RelLage := "YwieVor"
Elem4.Witch := "Button"
Elem4.Txt := "öffnen"
Elem5 := {}
Elem5.RelLage := "YwieVor"
Elem5.Witch := "Button"
Elem5.Txt := "einfügen"
Elem6 := {}
Elem6.Witch := "Edit" 
Elem6.AutoXYWH := "WH"
Elem6.Opt := " x10 "
temp = 
(
; --------------------------------------------------------------------------------
; Gui's mal kurz erstellen mit Grund-Funktionalität
						; Window / Gui erstellen
Opt := {}						; Objekt Opt anlegen
Opt.New := true					; Opt füllen
Opt.GuiNewOpt := " +resize "				; Gui Optionen bei Bedarf
Opt.RelLage := "REchtsVon|" FirstWinHwnd		; (relative-)Laage Hwnd von vorigem Gui
Opt.GuiOpt := " y6 " 				; Optional oben
;						; Control's einfügen
Elem1 := {}					; Objekt Elem1 anlegen
Elem1.Witch := "Edit"				; Element füllen   hier ein Edit-Feld 
Elem1.Txt := "Vor-Filter            	         "		; Text reinschreiben
Elem2 := {}					; weitere Element-Objekte anlegen
Elem2.Witch := "Text"				; hier statischer Text
Elem2.Txt := "Dieses Gui dient nur zur Demonstration"
Elem3 := {}
Elem3.Witch := "Button"				; hier Button 
Elem3.Txt := "OK"
Elem3.AutoXYWH := "XY"
Elem3.Opt := " x300 "
FlexWin(Opt,Elem1,Elem2,Elem3)	; 		Gui zeichnen und mit Grundfunktionen
;						 - GuiClose
;						 - GuiSize
;						   ...
;						 versehen
; --------------------------------------------------------------------------------
)
Elem6.Txt := temp
FlexWin(Opt,Elem1,Elem2,Elem3,Elem4,Elem5,Elem6)
; --------------------------------------------------------------------------------
; Gui's mal kurz erstellen mit Grund-Funktionalität
						; Window / Gui erstellen
Opt := {}						; Objekt Opt anlegen
Opt.New := true					; Opt füllen
Opt.GuiNewOpt := " +resize "				; Gui Optionen bei Bedarf
Opt.RelLage := "REchtsVon|" FirstWinHwnd		; (relative-)Laage Hwnd von vorigem Gui
Opt.GuiOpt := " y6 " 				; Optional oben
;						; Control's einfügen
Elem1 := {}					; Objekt Elem1 anlegen
Elem1.Witch := "Edit"				; Element füllen   hier ein Edit-Feld 
Elem1.Txt := "Vor-Filter            	         "		; Text reinschreiben
Elem2 := {}					; weitere Element-Objekte anlegen
Elem2.Witch := "Text"				; hier statischer Text
Elem2.Txt := "Dieses Gui dient nur zur Demonstration"
Elem3 := {}
Elem3.Witch := "Button"				; hier Button 
Elem3.Txt := "OK"
Elem3.AutoXYWH := "XY"
Elem3.Opt := " x300 "
FlexWin(Opt,Elem1,Elem2,Elem3)	; 		Gui zeichnen und mit Grundfunktionen
;						 - GuiClose
;						 - GuiSize
;						   ...
;						 versehen
; --------------------------------------------------------------------------------
Opt := {}
Opt.New := true
Opt.GuiName := "Schluss"
xVersatz := A_ScreenWidth/4
yVersatz := A_ScreenHeight/4
Opt.GuiOpt := " x" xVersatz " y" yVersatz
Elem1 := {}
Elem1.Witch := "Text"
Elem1.Txt := "Stop"
Elem2 := {}
Elem2.Witch := "Edit"
Elem2.Txt := "Mit dem Button`r`nwird das Skript vollstaendig beendet"
Elem3 := {}
Elem3.Witch := "Button"
Elem3.Txt := "ExitApp"
CloseAllHwnd := FlexWin(Opt,Elem1,Elem2,Elem3)
; --------------------------------------------------------------------------------
EndeHaupPrg := true
return
; --------------------------------------------------------------------------------
#q::
for DieseHwnd,GuiNr in oGuiNr
{
	Opt.GuiHwnd := DieseHwnd
	Opt.Close := true
	
	FlexWin(Opt)
	ExitApp
}
return
GuiClose: 
Exitapp 
TooltipWeg:
ToolTip
return
GuiEditAction(DiesesHwnd,DiesesLabel,Text){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	ToolTip %DiesesHwnd%	%DiesesLabel%`r`n%Text%
	SetTimer, TooltipWeg,-3000
	return
}

GuiButtonAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	MsgBox %DiesesHwnd%	%DiesesLabel%
	return
}

GuiCloseAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	MsgBox, 8228, Fenster schließen, Möchten Sie das Fenster %DiesesHwnd% wirklich schließen
	IfMsgBox,Yes
	{
		Opt := {}
		Opt.GuiHwnd := DiesesHwnd
		Opt.Close := true
		FlexWin(Opt)
	}		
	else
		return
	; MsgBox Fenster zu %DiesesHwnd%	%DiesesLabel%
	return
}
suche ich:
Intressenten
Helfer
Übernahmekandidaten
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

28 Jan 2019, 06:14

So soll's weitergehen:
dieses GUI

Code: Select all

#Include *i %A_ScriptDir%\Includes\IncludeMaster.ahk
FlexWin(ByRef Opt,Elemente*){
	static	; muss zwingend in der ersten Funktions-Zeile stehen.
	global Mem,GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1
	; ,11GuiButton1
	KorrekturX := 10
	RelLageOpt :=
	if NOT KorrekturYEingelesen
	{
		IfExist %A_Temp%\GuiYEich.txt
		{
			FileRead,KorrekturY,%A_Temp%\GuiYEich.txt
			if NOT ErrorLevel
				KorrekturYEingelesen := true
		}
	}
	if(KorrekturY="")
		KorrekturY := 48	; Priv 4K-Laptop
;	KorrekturY := 30	; Gesch-Laptop-Gr
	if (GuiNr = "")
		GuiNr := 10
	if (NOT IsObject(Mem))
		Mem := {}
	if (NOT IsObject(GuiHwnd))
		GuiHwnd := {}
	if (NOT IsObject(oGuiNr))
		oGuiNr := {}
	if(Opt.Close)
	{
		if(Opt.GuiHwnd <> "")
		{
			DieseGuiNr := oGuiNr[Opt.GuiHwnd]
			Gui,%DieseGuiNr%:Destroy
			; + ggf. Aufraeumen bei den Daten
		}
		else
		{
			; gosub Schlussabwicklungen
			ExitApp
		}
	}
	else if(Opt.New)
	{
		++GuiNr
		DieserGuiName := Opt.GuiName
		GuiNewOpt := Opt.GuiNewOpt
		if(InStr(GuiNewOpt,"-DPIScale"))
		{
			DPIScale:=false
			ScreenDPI := 96
			DieseKorrekturY := 0			
		}
		else
		{
			DPIScale:=true
			ScreenDPI := A_ScreenDPI
			DieseKorrekturY := KorrekturY
		}
		if(Opt.RelLage <> "")	; bspw. "Y|wieVor"
		{
			if(InStr(Opt.RelLage,"|"))
			{
				zeichen_von:= StrSplit(Opt.RelLage,"|",A_Space)
				Lagewort := zeichen_von.1
				HwndTest := zeichen_von.2
				if(zeichen_von.2="LastGui")
				{
					Zeichen := StrSplit(zeichen_von.1)
					Loop % Zeichen.MaxIndex()
					{
						temp := zeichen_von.2 Zeichen[A_Index]
						RelLageOpt .= Zeichen[A_Index] %temp% A_Space
					}
				}
				else if HwndTest is Integer
				{
					IfWinExist,ahk_id %HwndTest%
					{
						DieseWinhwnd := HwndTest
						WinGetPos,WinX1,WinY1,WinW,WinH,ahk_id %DieseWinhwnd%
						WinX2 := WinX1 + WinW
						WinY2 := WinY1 + WinH
						if(Lagewort = "RechtsVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else if(Lagewort = "LinksVon")
						{
							WinNeuX2 := WinX1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuX1	WinNeuX2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "OberhalbVon")
						{
							WinNeuY2 := WinY1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuY1	WinNeuY2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "UnterhalbVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
					}
				}
				else
					MsgBox Opt.RelLage ... | %HwndTest% wird noch nicht unterestuetzt!
			}
			else
				MsgBox Opt.RelLage ohne | wird noch nicht unterestuetzt!
		}
		Gui,%GuiNr%:New, %GuiNewOpt% +HwndGui%GuiNr%WinHwnd, %DieserGuiName%
		DiesesGuiHwnd := GuiHwnd[GuiNr] := Gui%GuiNr%WinHwnd
		Mem[DiesesGuiHwnd] := {}
		Mem[DiesesGuiHwnd].Elements := {}
		oGuiNr[DiesesGuiHwnd] := GuiNr
		EditNr := 1
		StaticNr := 1
		ButtonNr := 1
		InclOut :=
		InclOutFI :=
		for index,Element in Elemente
		{
			; Ele[A_Index] := Element
			if(NOT IsObject(Element))
			{
				MsgBox Elemente werden als Objekt erwartet. Stopp
				return
			}
			else
			{
				Mem[DiesesGuiHwnd].Elements[index] := Element
				if(NOT KorrekturYEingelesen AND A_Index=1)
				{
					if (Element.Opt="")
					{
						Element.Opt:= " y6 "
						EichAnfY := 6
					}
				}
				if(Element.RelLage = "YwieVor")
				{
					temp1 := (LastX+LastWidth+KorrekturX)/ScreenDPI*96
					temp2 := (LastY-KorrekturY)/ScreenDPI*96
					; temp2:=1
					DynOpt := " X" temp1 " Y" temp2  " "
					; DynOpt := " X" 1 " Y" 51  " "
				}
				else
					DynOpt :=
				if(Element.Witch = "Edit")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Edit, %DynOpt% g%GuiNr%GuiEdit%EditNr% v%GuiNr%GuiEdit%EditNr% Hwnd%GuiNr%HwndEdit%EditNr% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Edit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndEdit%EditNr%
					++EditNr
				}
				else if(Element.Witch = "Text")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Text, %DynOpt%  Hwnd%GuiNr%HwndStatic%StaticNr%  %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Static" StaticNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiStatic" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndStatic%StaticNr%
					++StaticNr
				}
				else if(Element.Witch = "Button")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Button,g%GuiNr%GuiButton%ButtonNr% v%GuiNr%GuiButton%ButtonNr% Hwnd%GuiNr%HwndButton%ButtonNr% %DynOpt% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Button" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndButton%ButtonNr%
					++ButtonNr
				}
				Gui,%GuiNr%:Show,AutoSize
				ControlGetPos,DiesesX,DiesesY,DiesesWidth,DiesesHeight,%DiesesControl%,ahk_id %DiesesGuiHwnd%
				if(Element.RelLage = "YwieVor")
				{
					if(LastY <> DiesesY)
						ControlMove,%DiesesControl%,,%LastY%,,,ahk_id %DiesesGuiHwnd%
				}
				if(EichAnfY>0 AND NOT KorrekturYEingelesen AND DiesesY<>"" AND DPIScale)
				{
					vorlKorrekturY := Round(DiesesY-ScreenDPI*EichAnfY/96)
					if vorlKorrekturY is Integer
					{
						KorrekturY := vorlKorrekturY
						FileAppend,%KorrekturY%,%A_Temp%\GuiYEich.txt
						KorrekturYEingelesen := true
						MsgBox Die Eichung KorrekturY ist mit dem Eichwert %KorrekturY% erfolgt.
					}
					else
						EichAnfY :=
				}
				if(Element.AutoXYWH <> "")
				{
					; MsgBox % Element.AutoXYWH 
					InclOut .= A_Tab A_Tab A_Tab 	"ControlHwnd := MemGuiHwnd.Elements[" index "].ControlHwnd" "`r`n"
					InclOut .= A_Tab A_Tab A_Tab 	"AutoXYWH(""" Element.AutoXYWH """, ControlHwnd)" "`r`n"
					; MsgBox % InclOut
				}
				LastGuiHwnd := DiesesGuiHwnd
				LastX := DiesesX
				LastY := DiesesY
				LastWidth := DiesesWidth
				LastHeight := DiesesHeight
				if(LastControlHwnd = Mem[DiesesGuiHwnd].Elements[index].ControlHwnd)
				{
					MsgBox %A_LineNumber%  Zwei Hwnd's dürfen nicht gleich sein!`n%Index%
					ListVars
				}

			}
		}
		DiesesGuiOpt := Opt.GuiOpt
		Gui,%GuiNr%:Show,AutoSize %DiesesGuiOpt% %RelLageOpt% ; <--hier kann AutoSize verwendet werden
; MsgBox %DiesesGuiOpt% # %RelLageOpt%
		WinGetPos,LastGuiX,LastGuiY,LastGuiW,LastGuiH,ahk_id %DiesesGuiHwnd%
		InclOutFI =
(
%GuiNr%GuiSize(MemGuiHwnd="",GuiNr="",GuiHwnd=""){
	global EndeHaupPrg
	if EndeHaupPrg
	{
		if(IsObject(MemGuiHwnd))
		{
%InclOut%
		}
	}
}
)
		IfNotExist % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
		{
			IfNotExist % A_ScriptDir "\includes"
				FileCreateDir,  % A_ScriptDir "\includes"
			FileAppend,%InclOutFI%, % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
			if NOT ErrorLevel
				FileAppend, #include *i %A_ScriptDir%\Includes\%GuiNr%GuiSize.ahk`r`n,%A_ScriptDir%\Includes\IncludeMaster.ahk
		}
			
		; MsgBox % InclOutFI
	}
	Mem[DiesesGuiHwnd].Opt := Opt
	
	if(Opt.GuiHwnd = "")
		Opt.GuiHwnd := DiesesGuiHwnd
	Opt :=
	return DiesesGuiHwnd
	
11GuiEdit1:
11GuiEdit2:
11GuiEdit3:
11GuiEdit4:
11GuiEdit5:
11GuiEdit6:
11GuiEdit7:
11GuiEdit8:
11GuiEdit9:
11GuiEdit10:
11GuiEdit11:
11GuiEdit12:
11GuiEdit13:
11GuiEdit14:
11GuiEdit15:
11GuiEdit16:
11GuiEdit17:
11GuiEdit18:
11GuiEdit19:

12GuiEdit1:
12GuiEdit2:
12GuiEdit3:
13GuiEdit1:
13GuiEdit2:
13GuiEdit3:
14GuiEdit1:
14GuiEdit2:
14GuiEdit3:
15GuiEdit1:
15GuiEdit2:
15GuiEdit3:
if (IsFunc("GuiEditAction"))
	{
		GuiNr:=SubStr(A_ThisLabel,1,2)
		Gui,%GuiNr%:Submit, NoHide		; wird benoetigt sonst wird vVariable nicht aktualisiert beim Schreiben
		DieserEditVarName := SubStr(A_ThisLabel,1,2) "GuiEdit" SubStr(A_ThisLabel,0)
		DieserfuncName := "GuiEditAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel,%DieserEditVarName%)
	}

return

11GuiButton1:
11GuiButton2:
11GuiButton3:
11GuiButton4:
11GuiButton5:
11GuiButton6:
11GuiButton7:
11GuiButton8:
11GuiButton9:
11GuiButton10:
11GuiButton11:
11GuiButton12:
11GuiButton13:
11GuiButton14:
11GuiButton15:
11GuiButton16:
11GuiButton17:
11GuiButton18:
11GuiButton19:

12GuiButton1:
12GuiButton2:
12GuiButton3:
13GuiButton1:
13GuiButton2:
13GuiButton3:
14GuiButton1:
14GuiButton2:
14GuiButton3:
15GuiButton1:
15GuiButton2:
15GuiButton3:
	if (IsFunc("GuiButtonAction"))
	{
		DieserfuncName := "GuiButtonAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel)
	}
return

11GuiClose:
12GuiClose:
13GuiClose:
14GuiClose:
15GuiClose:
	if (IsFunc("GuiCloseAction"))
	{
		DieserfuncName := "GuiCloseAction"
		SchliessHwnd := GuiHwnd[SubStr(A_ThisLabel,1,2)]
		%DieserfuncName%(SchliessHwnd,A_ThisLabel)
	}
return

11GuiSize:
12GuiSize:
13GuiSize:
14GuiSize:
15GuiSize:
if EndeHaupPrg
{
	DieseGuiNr := SubStr(A_ThisLabel,1,2)
	; MsgBox %DieseGuiNr%	%A_ThisLabel%
	DiesesGuiHwnd := GuiHwnd[DieseGuiNr]
	; MsgBox % DiesesGuiHwnd
	df := Func(A_ThisLabel)
	df.Call(Mem[DiesesGuiHwnd],DieseGuiNr,DiesesGuiHwnd)
}
return

}
; =================================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable 
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; ---------------------------------------------------------------------------------
; Version: 2015-5-29 / Added 'reset' option (by tmplinshi)
;          2014-7-03 / toralf
;          2014-1-2  / tmplinshi
; requires AHK version : 1.1.13.01+
; =================================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}
 
  If (DimSize = "reset")
    Return cInfo := {}
 
  For i, ctrl in cList {
    ctrlID := A_Gui ":" ctrl
    If ( cInfo[ctrlID].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
        fx := fy := fw := fh := 0
        For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]")))
            If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%)
              f%dim% := 1
        cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD}
    }Else If ( cInfo[ctrlID].a.1) {
        dgx := dgw := A_GuiWidth  - cInfo[ctrlID].gw  , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
        For i, dim in cInfo[ctrlID]["a"]
            Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space
        GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options
} } }
global GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1,EndeHaupPrg
; MsgBox % 96/A_ScreenDPI
; --------------------------------------------------------------------------------
; #Include *i %A_ScriptDir%\FlexGui.ahk
; #Include *i %A_ScriptDir%\InclGuiGui.ahk
Opt := {}
Opt.New := true
Opt.GuiNewOpt := " +resize  " ; -DPIScale"
Opt.GuiName := "Name"
Opt.GuiOpt := " x6 y6 " 
Elem1 := {}
Elem1.Witch := "Button"
Elem1.Txt := " Neues GUI "

Elem2 := {}
Elem2.RelLage := "YwieVor"
Elem2.Witch := "Button"
Elem2.Txt := "links"

Elem3 := {}
Elem3.RelLage := "YwieVor"
Elem3.Witch := "Button"
Elem3.Txt := "oben"

Elem4 := {}
Elem4.RelLage := "YwieVor"
Elem4.AutoXYWH := "X"
Elem4.Witch := "Button"
Elem4.Opt := " X240 "
Elem4.Txt := "      aktualisieren      "

Elem5 := {}
Elem5.AutoXYWH := "W"
Elem5.Witch := "Edit"
Elem5.Opt := " X60 "
Elem5.Txt := "WinTitle                                    "

Elem6 := {}
Elem6.RelLage := "YwieVor"
Elem6.AutoXYWH := "W"
Elem6.Witch := "Edit"
; Elem6.Opt := "X60"
Elem6.Txt := "WinOpt                          "

Elem7 := {}
Elem7.Witch := "Text"
Elem7.Opt := " X6 "
Elem7.Txt := "`r`nDas GUI soll folgende Control's enthalten"


Elem8 := {}
Elem8.Witch := "Button"
Elem8.Txt := "Neuer statischer Text"

Elem9 := {}
Elem9.RelLage := "YwieVor"
Elem9.AutoXYWH := "W"
Elem9.Witch := "Edit"
Elem9.Txt := "Text                                                              "

Elem10 := {}
Elem10.Witch := "Button"
Elem10.Opt := " X60 "
Elem10.Txt := "| Neu"

Elem11 := {}
Elem11.RelLage := "YwieVor"
Elem11.Witch := "Button"
; Elem11.Opt := " X60 "
Elem11.Txt := "Alt Neu"

Elem12 := {}
Elem12.RelLage := "YwieVor"
Elem12.Witch := "Button"
; Elem11.Opt := " X6 "
Elem12.Txt := "Alt`nNeu"

Elem13 := {}
Elem13.RelLage := "YwieVor"
Elem13.AutoXYWH := "W"
Elem13.Witch := "Edit"
; Elem6.Opt := "X60"
Elem13.Txt := "ContOpt                                    "


Elem14 := {}
Elem14.Witch := "Button"
Elem14.Opt := " X6 "
Elem14.Txt := "Neuer editierbarer Text"

Elem15 := {}
Elem15.RelLage := "YwieVor"
Elem15.AutoXYWH := "W"
Elem15.Witch := "Edit"
Elem15.Txt := "Text                                                      `r`n`r`n"

Elem16 := {}
Elem16.Witch := "Button"
Elem16.Opt := " X60 "
Elem16.Txt := "| Neu"

Elem17 := {}
Elem17.RelLage := "YwieVor"
Elem17.Witch := "Button"
; Elem11.Opt := " X60 "
Elem17.Txt := "Alt Neu"

Elem18 := {}
Elem18.RelLage := "YwieVor"
Elem18.Witch := "Button"
; Elel11.Opt := " X6 "
Elem18.Txt := "Alt`nNeu"

Elem19 := {}
Elem19.RelLage := "YwieVor"
Elem19.AutoXYWH := "W"
Elem19.Witch := "Edit"
; Elem6.Opt := "X60"
Elem19.Txt := "ContOpt                                   "


Elem20 := {}
Elem20.Witch := "Button"
Elem20.Opt := " X6 "
Elem20.Txt := "Neuer Button"

Elem21 := {}
Elem21.RelLage := "YwieVor"
Elem21.AutoXYWH := "W"
Elem21.Witch := "Edit"
Elem21.Txt := "Text                                                                     `r`n"

Elem22 := {}
Elem22.Witch := "Button"
Elem22.Opt := " X60 "
Elem22.Txt := "| Neu"

Elem23 := {}
Elem23.RelLage := "YwieVor"
Elem23.Witch := "Button"
; Elem11.Opt := " X60 "
Elem23.Txt := "Alt Neu"

Elem24 := {}
Elem24.RelLage := "YwieVor"
Elem24.Witch := "Button"
; Elel11.Opt := " X6 "
Elem24.Txt := "Alt`nNeu"

Elem25 := {}
Elem25.RelLage := "YwieVor"
Elem25.AutoXYWH := "W"
Elem25.Witch := "Edit"
; Elem6.Opt := "X60"
Elem25.Txt := "ContOpt                                    "

Elem26 := {}
Elem26.Witch := "Text"
Elem26.Opt := " X6 "
Elem26.Txt := "`r`nweitere Control's in Planung`r`n..."


FirstWinHwnd := FlexWin(Opt,Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8,Elem9,Elem10,Elem11,Elem12,Elem13,Elem14,Elem15,Elem16,Elem17,Elem18,Elem19,Elem20,Elem21,Elem22,Elem23,Elem24,Elem25,Elem26) ; ,Elem27,Elem28,Elem29)
FirstWinHwnd := FlexWin(Opt,Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8,Elem9,Elem10,Elem11,Elem12,Elem13,Elem14,Elem15,Elem16,Elem17,Elem18,Elem19,Elem20,Elem21,Elem22,Elem23,Elem24,Elem25,Elem26) ; ,Elem27,Elem28,Elem29)

EndeHaupPrg := true
return
; --------------------------------------------------------------------------------
^q::
Reload
return
#q::
for DieseHwnd,GuiNr in oGuiNr
{
	Opt.GuiHwnd := DieseHwnd
	Opt.Close := true
	
	FlexWin(Opt)
	ExitApp
}
return
GuiClose: 
Exitapp 
TooltipWeg:
ToolTip
return
GuiEditAction(DiesesHwnd,DiesesLabel,Text){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	ToolTip %DiesesHwnd%	%DiesesLabel%`r`n%Text%
	SetTimer, TooltipWeg,-3000
	return
}

GuiButtonAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	MsgBox %DiesesHwnd%	%DiesesLabel%
	return
}

GuiCloseAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	MsgBox, 8228, Fenster schließen, Möchten Sie das Fenster %DiesesHwnd% wirklich schließen
	IfMsgBox,Yes
	{
		Opt := {}
		Opt.GuiHwnd := DiesesHwnd
		Opt.Close := true
		FlexWin(Opt)
	}		
	else
		return
	; MsgBox Fenster zu %DiesesHwnd%	%DiesesLabel%
	return
}
muss noch "verdrahtet" und so eingebunden werden werden, dass damit Skelette neuer GUI's erstellt werden können.

PS der Ordner includes muss wenn vorhanden gelöscht werden und das Skript 2 mal gestartet werden.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

29 Jan 2019, 05:06

Moin,

ich bin gern bereit, als Helfer mitzuwirken. Allerdings stehe ich dem Konzept etwas skeptisch gegenüber.

Generelle Anmerkungen:
  • Auf Guinummern bzw. -namen würde ich verzichten. AHK kann schon seit längerer Zeit allein mit den HWNDs von Guis und Controls arbeiten. Wenn Bezeichner zur Unterscheidung der Fenster oder Controls dennoch benötigt werden, sollten sie unter dem jeweiligen HWND in (globalen) Objekten abgelegt werden.
  • Damit entfällt auch die Notwendigkeit von Codesequenzen wie

    Code: Select all

    11GuiEdit1:
    11GuiEdit2:
    11GuiEdit3:
    11GuiEdit4:
    11GuiEdit5:
    11GuiEdit6:
    11GuiEdit7:
    11GuiEdit8:
    11GuiEdit9:
    11GuiEdit10:
    11GuiEdit11:
    11GuiEdit12:
    11GuiEdit13:
    11GuiEdit14:
    11GuiEdit15:
    11GuiEdit16:
    11GuiEdit17:
    11GuiEdit18:
    11GuiEdit19:
    
    12GuiEdit1:
    12GuiEdit2:
    12GuiEdit3:
    13GuiEdit1:
    13GuiEdit2:
    13GuiEdit3:
    14GuiEdit1:
    14GuiEdit2:
    14GuiEdit3:
    15GuiEdit1:
    15GuiEdit2:
    15GuiEdit3:
    
    Die sorgen meiner Meinung nach ohnehin nur dafür, dass FlexWin() nicht wirklich flexibel ist.
  • Der Zweck Deines letzten Beispiels ist mir auch unklar. Ein Fenster zur Steuerung von FlexWin() würde ich immer ohne FlexWin() erstellen. Fenster für eine konkrete Aufgabe sind ja in der Regel nicht 'flexibel'.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

29 Jan 2019, 06:42

Danke Just Me,
habe speziell bei der ListView eh gehofft Unterstützung bzw. Federführung von Dir zu erhalten.
Auf Guinummern bzw. -namen würde ich verzichten.
Die waren aus performance- Gründen drinn, weil ich auch Gui's unterstuetzen wollte, welche die Größe abhängig von den Inhalten verändern.
Aber außer einer Clipboard-Anzeige fallen mir dazu nicht viel sinnvolle Beispiele ein.
Damit entfällt auch die Notwendigkeit von Codesequenzen wie
Die sind auch drinn, weil ich die Interpreter-Meldungen wegen fehlender Labels nicht loswurde. Ohne die Information zu verlieren, welches Control den Thread begonnen hat. Aber dafür gibt es sicherlich kürzere Lösungen.
Der Zweck Deines letzten Beispiels ist mir auch unklar. Ein Fenster zur Steuerung von FlexWin() würde ich immer ohne FlexWin() erstellen. Fenster für eine konkrete Aufgabe sind ja in der Regel nicht 'flexibel'.
Mit dem letzten Beispiel wollte ich nicht FlexWin() steuern, sondern ein Tool zur Verfügung stellen um Gui-Erstellungs und Sizeinformationen zusammenklicken können. Also die Opt- und die Element-Objekte. Diese Informationen hätte ich dann entweder via include FlexWin() (welches nur als Funktion in einem größeren Kontext vorgesehen war) oder zur Erzeugung von Gui-Quelltext verwendet. FlexWin() hätte bei Letzterem ausgedient.

Ich werde sobald ich dazu komme genauer auf die Ziele bzw. eine Anforderungsliste von FlexWin() posten.

Anbei die Überarbeitung des Skriptes, die allerdings noch keine Anregungen von Just Me enthält.
Wesentliche Neuerung "rechtsbündig".

Code: Select all

#Include *i %A_ScriptDir%\Includes\IncludeMaster.ahk
FlexWin(ByRef Opt,Elemente*){
	static	; muss zwingend in der ersten Funktions-Zeile stehen.
	global Mem,GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1
	; ,11GuiButton1
	KorrekturX := 10
	RelLageOpt :=
	if NOT KorrekturYEingelesen
	{
		IfExist %A_ScriptDir%\includes\GuiYEich.txt
		{
			FileRead,KorrekturY,%A_ScriptDir%\includes\GuiYEich.txt
			if NOT ErrorLevel
				KorrekturYEingelesen := true
		}
	}
	if(KorrekturY="")
		KorrekturY := Round(29.333333*A_ScreenDPI/96)
	if (GuiNr = "")
		GuiNr := 10
	if (NOT IsObject(Mem))
		Mem := {}
	if (NOT IsObject(GuiHwnd))
		GuiHwnd := {}
	if (NOT IsObject(oGuiNr))
		oGuiNr := {}
	if(Opt.Close)
	{
		if(Opt.GuiHwnd <> "")
		{
			DieseGuiNr := oGuiNr[Opt.GuiHwnd]
			Gui,%DieseGuiNr%:Destroy
			; + ggf. Aufraeumen bei den Daten
		}
		else
		{
			; gosub Schlussabwicklungen
			ExitApp
		}
	}
	else if(Opt.New)
	{
		++GuiNr
		DieserGuiName := Opt.GuiName
		GuiNewOpt := Opt.GuiNewOpt
		if(InStr(GuiNewOpt,"-DPIScale"))
		{
			DPIScale:=false
			; ScreenDPI := 96
			DpiFakt:=1
			DieseKorrekturY := 0			
		}
		else
		{
			DPIScale:=true
			DpiFakt:=A_ScreenDPI/96
			; ScreenDPI := A_ScreenDPI
			DieseKorrekturY := KorrekturY
		}
		if(Opt.RelLage <> "")	; bspw. "Y|wieVor"
		{
			if(InStr(Opt.RelLage,"|"))
			{
				zeichen_von:= StrSplit(Opt.RelLage,"|",A_Space)
				Lagewort := zeichen_von.1
				HwndTest := zeichen_von.2
				if(zeichen_von.2="LastGui")
				{
					Zeichen := StrSplit(zeichen_von.1)
					Loop % Zeichen.MaxIndex()
					{
						temp := zeichen_von.2 Zeichen[A_Index]
						RelLageOpt .= Zeichen[A_Index] %temp% A_Space
					}
				}
				else if HwndTest is Integer
				{
					IfWinExist,ahk_id %HwndTest%
					{
						DieseWinhwnd := HwndTest
						WinGetPos,WinX1,WinY1,WinW,WinH,ahk_id %DieseWinhwnd%
						WinX2 := WinX1 + WinW
						WinY2 := WinY1 + WinH
						if(Lagewort = "RechtsVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else if(Lagewort = "LinksVon")
						{
							WinNeuX2 := WinX1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuX1	WinNeuX2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "OberhalbVon")
						{
							WinNeuY2 := WinY1 -6
							; RelLageOpt muss spaeter befuellt werden.
							; RelLageOpt := berechne	WinNeuY1	WinNeuY2
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
						}
						else if(Lagewort = "UnterhalbVon")
						{
							temp := WinX2+6
							RelLageOpt .= A_Space "X" temp  A_Space
						}
						else
							MsgBox Opt.RelLage %Lagewort% | ... wird noch nicht unterestuetzt!
					}
				}
				else
					MsgBox Opt.RelLage ... | %HwndTest% wird noch nicht unterestuetzt!
			}
			else
				MsgBox Opt.RelLage ohne | wird noch nicht unterestuetzt!
		}
		Gui,%GuiNr%:New, %GuiNewOpt% +HwndGui%GuiNr%WinHwnd, %DieserGuiName%
		DiesesGuiHwnd := GuiHwnd[GuiNr] := Gui%GuiNr%WinHwnd
		Mem[DiesesGuiHwnd] := {}
		Mem[DiesesGuiHwnd].Elements := {}
		oGuiNr[DiesesGuiHwnd] := GuiNr
		EditNr := 1
		StaticNr := 1
		ButtonNr := 1
		InclOut :=
		InclOutFI :=
		W_Mess :=
		W_Mess := {}
		LageReBuend :=
		LageReBuend := {}
		for index,Element in Elemente
		{
			; Ele[A_Index] := Element
			if(NOT IsObject(Element))
			{
				MsgBox Elemente werden als Objekt erwartet. Stopp
				return
			}
			else
			{
				Mem[DiesesGuiHwnd].Elements[index] := Element
				if(NOT KorrekturYEingelesen AND A_Index=1)
				{
					if (Element.Opt="")
					{
						Element.Opt:= " y6 "
						EichAnfY := 6
					}
				}
				if(Element.RelLage = "YwieVor")
				{
					temp1 := (LastX+LastWidth+KorrekturX)/DpiFakt
					temp2 := (LastY-KorrekturY)/DpiFakt
					; temp2:=1
					DynOpt := " X" temp1 " Y" temp2  " "
					; DynOpt := " X" 1 " Y" 51  " "
				}
				else
					DynOpt :=
				if(Element.Witch = "Edit")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Edit, %DynOpt% g%GuiNr%GuiEdit%EditNr% v%GuiNr%GuiEdit%EditNr% Hwnd%GuiNr%HwndEdit%EditNr% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Edit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiEdit" EditNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndEdit%EditNr%
					++EditNr
				}
				else if(Element.Witch = "Text")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Text, %DynOpt%  Hwnd%GuiNr%HwndStatic%StaticNr%  %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Static" StaticNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiStatic" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndStatic%StaticNr%
					++StaticNr
				}
				else if(Element.Witch = "Button")
				{
					DiesesElementOpt := Element.Opt
					DiesesElementTxt := Element.Txt
					Gui,%GuiNr%:Add,Button,g%GuiNr%GuiButton%ButtonNr% v%GuiNr%GuiButton%ButtonNr% Hwnd%GuiNr%HwndButton%ButtonNr% %DynOpt% %DiesesElementOpt%,%DiesesElementTxt%
					DiesesControl := "Button" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlName := DiesesControl
					Mem[DiesesGuiHwnd].Elements[index].KeyName := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlVar := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlLabel := GuiNr "GuiButton" ButtonNr
					Mem[DiesesGuiHwnd].Elements[index].ControlHwnd := %GuiNr%HwndButton%ButtonNr%
					++ButtonNr
				}
				Gui,%GuiNr%:Show,AutoSize
				ControlGetPos,DiesesX,DiesesY,DiesesWidth,DiesesHeight,%DiesesControl%,ahk_id %DiesesGuiHwnd%
				if(Element.RelLage = "YwieVor")
				{
					if(LastY <> DiesesY)
						ControlMove,%DiesesControl%,,%LastY%,,,ahk_id %DiesesGuiHwnd%
				}
				if(Element.Lage <> "")	; Bsp. ; Elem30.Lage := "X+W|ReBuend_6"
				{
					LageReBuendB := false
					if(InStr(Element.Lage,"|"))
					{
						zeichen_von:= StrSplit(Element.Lage,"|",A_Space)
						LageZeichen := zeichen_von.1
						Rand := zeichen_von.2
						if(SubStr(Rand,1,7)="ReBuend")
						{
							Womit_Abstand := StrSplit(Rand,"_")
							; if(LageZeichen="XW")
							{
								; alles bekannt
								temp := Mem[DiesesGuiHwnd].Elements[index].ControlHwnd
								LageReBuend[temp] := {}
								W_Mess[temp] := {}
								LageReBuend[temp].LZ := LageZeichen
								W_Mess[temp].X := DiesesX
								W_Mess[temp].W := DiesesWidth
								W_Mess[temp].A := Womit_Abstand.2
								LageReBuendB := true
							}
						}
					}
					if NOT LageReBuendB
						MsgBox % "Element.Lage " Element.Lage " wird noch nicht unterestuetzt!"
				}
				if(EichAnfY>0 AND NOT KorrekturYEingelesen AND DiesesY<>"" AND DPIScale)
				{
					vorlKorrekturY := Round(DiesesY-DpiFakt*EichAnfY-0.499999999)
					if vorlKorrekturY is Integer
					{
						KorrekturY := vorlKorrekturY
						IfNotExist %A_ScriptDir%\includes
							FileCreateDir,%A_ScriptDir%\includes
						FileAppend,%KorrekturY%,%A_ScriptDir%\includes\GuiYEich.txt
						KorrekturYEingelesen := true
						MsgBox Die Eichung KorrekturY ist mit dem Eichwert %KorrekturY% erfolgt.
					}
					else
						EichAnfY :=
				}
				if(Element.AutoXYWH <> "")
				{
					; MsgBox % Element.AutoXYWH 
					InclOut .= A_Tab A_Tab A_Tab 	"ControlHwnd := MemGuiHwnd.Elements[" index "].ControlHwnd" "`r`n"
					InclOut .= A_Tab A_Tab A_Tab 	"AutoXYWH(""" Element.AutoXYWH """, ControlHwnd)" "`r`n"
					; MsgBox % InclOut
				}
				LastGuiHwnd := DiesesGuiHwnd
				LastX := DiesesX
				LastY := DiesesY
				LastWidth := DiesesWidth
				LastHeight := DiesesHeight
				if(LastControlHwnd = Mem[DiesesGuiHwnd].Elements[index].ControlHwnd)
				{
					MsgBox %A_LineNumber%  Zwei Hwnd's dürfen nicht gleich sein!`n%Index%
					ListVars
				}

			}
		}
		DiesesGuiOpt := Opt.GuiOpt
		Gui,%GuiNr%:Show,AutoSize %DiesesGuiOpt% %RelLageOpt% 
		WinGetPos,LastGuiX,LastGuiY,LastGuiW,LastGuiH,ahk_id %DiesesGuiHwnd%

		for ContHwnd,ControlXW in W_Mess
		{
			; MsgBox % ContHwnd A_Tab ControlXW.X A_Tab ControlXW.W  A_Tab ControlXW.A
			DiesesX := LastGuiW-ControlXW.W-ControlXW.A-13
			DieseW  :=  LastGuiW-ControlXW.X-ControlXW.A-13
			if( NOT InStr(LageReBuend[ContHwnd].LZ,"X"))
				DiesesX := 
			if( NOT InStr(LageReBuend[ContHwnd].LZ,"W"))
				DieseW := 
			ControlMove,,DiesesX,,DieseW,,ahk_id %ContHwnd%
			; äääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääää
		}
		InclOutFI =
(
%GuiNr%GuiSize(MemGuiHwnd="",GuiNr="",GuiHwnd=""){
	global EndeHaupPrg
	if EndeHaupPrg
	{
		if(IsObject(MemGuiHwnd))
		{
%InclOut%
		}
	}
}
)
		IfNotExist % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
		{
			IfNotExist % A_ScriptDir "\includes"
				FileCreateDir,  % A_ScriptDir "\includes"
			FileAppend,%InclOutFI%, % A_ScriptDir "\includes\" GuiNr "GuiSize.ahk"
			if NOT ErrorLevel
				FileAppend, #include *i %A_ScriptDir%\Includes\%GuiNr%GuiSize.ahk`r`n,%A_ScriptDir%\Includes\IncludeMaster.ahk
		}
			
		; MsgBox % InclOutFI
	}
	Mem[DiesesGuiHwnd].Opt := Opt
	
	if(Opt.GuiHwnd = "")
		Opt.GuiHwnd := DiesesGuiHwnd
	Opt :=
	return DiesesGuiHwnd
	
11GuiEdit1:
11GuiEdit2:
11GuiEdit3:
11GuiEdit4:
11GuiEdit5:
11GuiEdit6:
11GuiEdit7:
11GuiEdit8:
11GuiEdit9:
11GuiEdit10:
11GuiEdit11:
11GuiEdit12:
11GuiEdit13:
11GuiEdit14:
11GuiEdit15:
11GuiEdit16:
11GuiEdit17:
11GuiEdit18:
11GuiEdit19:

12GuiEdit1:
12GuiEdit2:
12GuiEdit3:
13GuiEdit1:
13GuiEdit2:
13GuiEdit3:
14GuiEdit1:
14GuiEdit2:
14GuiEdit3:
15GuiEdit1:
15GuiEdit2:
15GuiEdit3:
if (IsFunc("GuiEditAction"))
	{
		GuiNr:=SubStr(A_ThisLabel,1,2)
		Gui,%GuiNr%:Submit, NoHide		; wird benoetigt sonst wird vVariable nicht aktualisiert beim Schreiben
		DieserEditVarName := SubStr(A_ThisLabel,1,2) "GuiEdit" SubStr(A_ThisLabel,0)
		DieserfuncName := "GuiEditAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel,%DieserEditVarName%)
	}

return

11GuiButton1:
11GuiButton2:
11GuiButton3:
11GuiButton4:
11GuiButton5:
11GuiButton6:
11GuiButton7:
11GuiButton8:
11GuiButton9:
11GuiButton10:
11GuiButton11:
11GuiButton12:
11GuiButton13:
11GuiButton14:
11GuiButton15:
11GuiButton16:
11GuiButton17:
11GuiButton18:
11GuiButton19:
11GuiButton20:

12GuiButton1:
12GuiButton2:
12GuiButton3:
13GuiButton1:
13GuiButton2:
13GuiButton3:
14GuiButton1:
14GuiButton2:
14GuiButton3:
15GuiButton1:
15GuiButton2:
15GuiButton3:
	if (IsFunc("GuiButtonAction"))
	{
		DieserfuncName := "GuiButtonAction"
		%DieserfuncName%(GuiHwnd[SubStr(A_ThisLabel,1,2)],A_ThisLabel)
	}
return

11GuiClose:
12GuiClose:
13GuiClose:
14GuiClose:
15GuiClose:
	if (IsFunc("GuiCloseAction"))
	{
		DieserfuncName := "GuiCloseAction"
		SchliessHwnd := GuiHwnd[SubStr(A_ThisLabel,1,2)]
		%DieserfuncName%(SchliessHwnd,A_ThisLabel)
	}
return

11GuiSize:
12GuiSize:
13GuiSize:
14GuiSize:
15GuiSize:
if EndeHaupPrg
{
	DieseGuiNr := SubStr(A_ThisLabel,1,2)
	; MsgBox %DieseGuiNr%	%A_ThisLabel%
	DiesesGuiHwnd := GuiHwnd[DieseGuiNr]
	; MsgBox % DiesesGuiHwnd
	df := Func(A_ThisLabel)
	df.Call(Mem[DiesesGuiHwnd],DieseGuiNr,DiesesGuiHwnd)
}
return

}
; =================================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable 
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; ---------------------------------------------------------------------------------
; Version: 2015-5-29 / Added 'reset' option (by tmplinshi)
;          2014-7-03 / toralf
;          2014-1-2  / tmplinshi
; requires AHK version : 1.1.13.01+
; =================================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}
 
  If (DimSize = "reset")
    Return cInfo := {}
 
  For i, ctrl in cList {
    ctrlID := A_Gui ":" ctrl
    If ( cInfo[ctrlID].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
        fx := fy := fw := fh := 0
        For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]")))
            If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%)
              f%dim% := 1
        cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD}
    }Else If ( cInfo[ctrlID].a.1) {
        dgx := dgw := A_GuiWidth  - cInfo[ctrlID].gw  , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
        For i, dim in cInfo[ctrlID]["a"]
            Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space
        GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options
} } }
global GuiHwnd,oGuiNr,11GuiEdit1,12GuiEdit1,13GuiEdit1,14GuiEdit1,15GuiEdit1,EndeHaupPrg
; MsgBox % 96/A_ScreenDPI
; --------------------------------------------------------------------------------
; #Include *i %A_ScriptDir%\FlexGui.ahk
; #Include *i %A_ScriptDir%\InclGuiGui.ahk
Opt := {}
Opt.New := true
; Opt.GuiNewOpt := " +resize   -DPIScale"
 Opt.GuiNewOpt := " +resize  " ; -DPIScale"
Opt.GuiName := "Name"
Opt.GuiOpt := " x6 y6 " 

Elem10 := {}
Elem10.Opt := " X6 "
Elem10.Witch := "Button"
Elem10.Txt := " Neues`r`nGUI "

Elem20 := {}
Elem20.RelLage := "YwieVor"
Elem20.Witch := "Button"
Elem20.Txt := "links"

Elem30 := {}
Elem30.RelLage := "YwieVor"
Elem30.Witch := "Button"
Elem30.Txt := "oben"

Elem40 := {}
Elem40.RelLage := "YwieVor"
Elem40.Lage := "X|ReBuend_10"
Elem40.AutoXYWH := "X"
Elem40.Witch := "Button"
Elem40.Opt := " X240 "
Elem40.Txt := " GUI`r`naktualisieren "

Elem50 := {}
Elem50.AutoXYWH := "W0.4"
Elem50.Witch := "Edit"
Elem50.Opt := " X60 "
Elem50.Txt := "WinTitle                                    "

Elem60 := {}
Elem60.RelLage := "YwieVor"
Elem60.Lage := "W|ReBuend_10"
Elem60.AutoXYWH := "X0.4W0.6"
Elem60.Witch := "Edit"
; Elem6.Opt := "X60"
Elem60.Txt := "WinOpt                          "

Elem70 := {}
Elem70.Witch := "Text"
Elem70.Opt := " X6 "
Elem70.Txt := "`r`nDas GUI soll folgende Control's enthalten"


Elem80 := {}
Elem80.Witch := "Button"
Elem80.Txt := "Neuer statischer Text"

Elem90 := {}
Elem90.RelLage := "YwieVor"
Elem90.Lage := "W|ReBuend_10"
Elem90.AutoXYWH := "W"
Elem90.Witch := "Edit"
Elem90.Txt := "Text                                                              "

Elem100 := {}
Elem100.Witch := "Button"
Elem100.Opt := " X60 "
Elem100.Txt := "| Neu"

Elem105 := {}
Elem105.RelLage := "YwieVor"
Elem105.Witch := "Button"
; Elem105.Opt := " X60 "
Elem105.Txt := "Neu |"

Elem110 := {}
Elem110.RelLage := "YwieVor"
Elem110.Witch := "Button"
; Elem11.Opt := " X60 "
Elem110.Txt := "Alt Neu"

Elem120 := {}
Elem120.RelLage := "YwieVor"
Elem120.Witch := "Button"
; Elem11.Opt := " X6 "
Elem120.Txt := "Alt`nNeu"

Elem130 := {}
Elem130.RelLage := "YwieVor"
Elem130.Lage := "W|ReBuend_10"
Elem130.AutoXYWH := "W"
Elem130.Witch := "Edit"
; Elem6.Opt := "X60"
Elem130.Txt := "ContOpt                     "


Elem140 := {}
Elem140.Witch := "Button"
Elem140.Opt := " X6 "
Elem140.Txt := "Neuer editierbarer Text"

Elem150 := {}
Elem150.RelLage := "YwieVor"
Elem150.Lage := "W|ReBuend_10"
Elem150.AutoXYWH := "W"
Elem150.Witch := "Edit"
Elem150.Txt := "Text                                                      `r`n`r`n"

Elem160 := {}
Elem160.Witch := "Button"
Elem160.Opt := " X60 "
Elem160.Txt := "| Neu"

Elem165 := {}
Elem165.RelLage := "YwieVor"
Elem165.Witch := "Button"
; Elem105.Opt := " X60 "
Elem165.Txt := "Neu |"

Elem170 := {}
Elem170.RelLage := "YwieVor"
Elem170.Witch := "Button"
; Elem11.Opt := " X60 "
Elem170.Txt := "Alt Neu"

Elem180 := {}
Elem180.RelLage := "YwieVor"
Elem180.Witch := "Button"
; Elel11.Opt := " X6 "
Elem180.Txt := "Alt`nNeu"

Elem190 := {}
Elem190.RelLage := "YwieVor"
Elem190.Lage := "W|ReBuend_10"
Elem190.AutoXYWH := "W"
Elem190.Witch := "Edit"
; Elem6.Opt := "X60"
Elem190.Txt := "ContOpt                     "


Elem200 := {}
Elem200.Witch := "Button"
Elem200.Opt := " X6 "
Elem200.Txt := "Neuer Button"

Elem210 := {}
Elem210.RelLage := "YwieVor"
Elem210.Lage := "W|ReBuend_10"
Elem210.AutoXYWH := "W"
Elem210.Witch := "Edit"
Elem210.Txt := "Text                                                                     `r`n"

Elem220 := {}
Elem220.Witch := "Button"
Elem220.Opt := " X60 "
Elem220.Txt := "| Neu"

Elem225 := {}
Elem225.RelLage := "YwieVor"
Elem225.Witch := "Button"
; Elem105.Opt := " X60 "
Elem225.Txt := "Neu |"

Elem230 := {}
Elem230.RelLage := "YwieVor"
Elem230.Witch := "Button"
; Elem11.Opt := " X60 "
Elem230.Txt := "Alt Neu"

Elem240 := {}
Elem240.RelLage := "YwieVor"
Elem240.Witch := "Button"
; Elel11.Opt := " X6 "
Elem240.Txt := "Alt`nNeu"

Elem250 := {}
Elem250.RelLage := "YwieVor"
Elem250.Lage := "W|ReBuend_10"
Elem250.AutoXYWH := "W"
Elem250.Witch := "Edit"
; Elem6.Opt := "X60"
Elem250.Txt := "ContOpt                     "

Elem260 := {}
Elem260.Witch := "Text"
Elem260.Opt := " X6 "
Elem260.Txt := "`r`nweitere Control's in Planung`r`n..."


Elem270 := {}
; Elem270.RelLage := "YwieVor"
Elem270.Lage := "X|ReBuend_10"
Elem270.AutoXYWH := "X"
Elem270.Witch := "Button"
; Elel11.Opt := " X6 "
Elem270.Txt := " lösche letztes `r`nControl"

FirstWinHwnd := FlexWin(Opt,Elem10,Elem20,Elem30,Elem40,Elem50,Elem60,Elem70,Elem80,Elem90,Elem100,Elem105,Elem110,Elem120,Elem130,Elem140,Elem150,Elem160,Elem165,Elem170,Elem180,Elem190,Elem200,Elem210,Elem220,Elem225,Elem230,Elem240,Elem250,Elem260,Elem270) ; ,Elem280,Elem290)

EndeHaupPrg := true
return
; --------------------------------------------------------------------------------
^q::
Reload
return
#q::
for DieseHwnd,GuiNr in oGuiNr
{
	Opt.GuiHwnd := DieseHwnd
	Opt.Close := true
	
	FlexWin(Opt)
	ExitApp
}
return
GuiClose: 
Exitapp 
TooltipWeg:
ToolTip
return
GuiEditAction(DiesesHwnd,DiesesLabel,Text){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	ToolTip %DiesesHwnd%	%DiesesLabel%`r`n%Text%
	SetTimer, TooltipWeg,-3000
	return
}

GuiButtonAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	if (DiesesHwnd = CloseAllHwnd) ; nur fuer Demo
		ExitApp						 ; nur fuer Demo
	MsgBox %DiesesHwnd%	%DiesesLabel%
	return
}

GuiCloseAction(DiesesHwnd,DiesesLabel){
	global CloseAllHwnd,GuiHwnd
	MsgBox, 8228, Fenster schließen, Möchten Sie das Fenster %DiesesHwnd% wirklich schließen
	IfMsgBox,Yes
	{
		Opt := {}
		Opt.GuiHwnd := DiesesHwnd
		Opt.Close := true
		FlexWin(Opt)
	}		
	else
		return
	; MsgBox Fenster zu %DiesesHwnd%	%DiesesLabel%
	return
}
30.01.19 Nachtrag: Zu obigem Gui, mit dessen Hilfe man von der Quelltext-Eingabe zur Gui-Eingabe (nur die Optik ist realisiert) kommen könnte.
Wenn man im Walde steht sieht man den Wald vor lauter Bäumen nicht.
Eine Pulldown-Auswahl fürs Control mit dynamisch hinzugefügten Conttrol-Details hätte obiges Gui viel übersichtlicher und intuitiver gemacht.
Als Beispiel für ein Gui mit rechtsbündigen Control's ist obiges (resize-fähiges) Gui trotzdem brauchbar.
Last edited by Gerdi on 30 Jan 2019, 09:06, edited 7 times in total.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

29 Jan 2019, 07:58

Der Verzicht auf 'individuelle' Labels wird einfacher, wenn man stattdessen Funktionen benutzt.

Alle Gui-Funktionen wie z.B. GuiClose(GuiHwnd) erhalten über den Parameter GuiHwnd das HWND des Fensters. Außerdem kann man auch auf die interne Variable A_Gui zugreifen (AHK 1.1).

Die Control-Funktionen wie z.B. ButtonFunc(CtrlHwnd, ...) erhalten über den ersten Parameter CtrlHwnd das Hwnd des Controls. Außerdem kann man auf die internen Variablen A_Gui und A_GuiControl zugreifen (AHK 1.1).

Wenn man die Bezüge zwischen GuiHwnd und CtrlHwnd in einem (globalen) Objekt speichert, sollte man auch in gemeinsamen neutralen Funktionen alle Informationen haben, die man braucht, um die Fenster/Controls individuell zu verarbeiten.

Ich habe schon mal angefangen, das für FlexWin() beispielhaft umzusetzen. Es braucht abernoch ein wenig Zeit.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

29 Jan 2019, 12:20

Ziele / Anforderungsliste / Lastenheft (Lösungsneutrale Formulierung)
  • Tool zur einfachen und flotten Gui-Erstellung.
  • Tool zur Bereitstellung möglichst vieler Gui-Basis-Funktionalitäten.
  • Das Tool soll für AHK Anfänger bis Experten Arbeitserleichterungen bieten.
  • Auch ein Anfänger sollte nach kurzer Einarbeitung Fenster erstellen können, welche größenveränderlich sind, das Schließkreuz verarbeiten, bei denen Sprung-Ziel(e) vorbereitet werden. [Denkbare voreingestellte Größen-Veränderungsregeln für Anfänger könnten lauten:
    a) alle dehnfähigen Control's wachsen proportional mit dem größerziehen des Gui's mit. Alle nicht dehnfähigen Control's werden mit den anderen nur proportional verschoben. Umgekehrt beim Kleinerziehen, jedoch nur bis zur Gui Ersterstellungsgröße, unter der keine Control-Veränderungen mehr durchgeführt werden.
    b) Alle Control's die nahe am rechten oder unteren Rand sind stecken die ganze Gui-Größenveränderung weg.]
  • es sollen die 2 grundsätzlichen Befüllungs-Varianten angeboten werden:
    a) Control's werden vorrangig von links nach rechts gesetzt. Eine neue Zeile erfordert eine extra Aktion.
    b) Control's werden vorrangig von oben nach unten gesetzt. Eine neue Spalte erfordert eine extra Aktion. [z.B.: die zuerst eingeschlagene Richtung bleibt fürs ganze Gui gültig. Die Abweichung davon erfordert eine Extra-Aktion.]
    Gemischte Varianten sollen auch auf Sinnhaftigkeit und Aufwand überprüft werden.
    ab) [z.B. Die letzte Richung bleibt erhalten, es kann sowohl einmalig als auch längerfristig umgeschalten werden.]
  • Das Tool soll jungfräulich ohne Fehlermeldungen startbar/einbindbar sein.
  • Nachträgliche Einfügungen sollen ohne anfassen vieler bestehenden Controls möglichst einfach möglich sein.
  • Bestehende schreibweisen sollen nicht nur beibehalten werden, sondern wenn sinnvoll auch für Erweiterungen genutzt werden.
    [Erleuterung zur Anforderung direkt drüber: Das XW welches AutoXYWH.ahk übergeben wird spiegelt sich auch in der Skript eigenen Gui-Notation. Darüber hinaus wird X und oder W auch bei der Skripteigenen schreibweise was rechtsbündig erscheinen soll sinnähnlich verwendet.]

In [ ] Klammern stehende Aussagen sind Erleuterungen bzw. Lösungsbeispiele, die zur Klarstellung was gemeint ist dienen. Sie gehören ausdrücklich nicht zu den Anforderungen, bessere Wege sind immer willkommen.

Was soll das Tool nicht sein:
- Ein Feinheiten Tool für Grafik-Designer. [Beispielsweise ein Button mit farbwechselnder Laufschrift mit dem SchriftFont … kann, wenn es das Betriebsystem hergibt zwar eventuell über die Control-Optionen einstellbar sein, wird aber nicht komfortabel unterstützt.]

Diese Liste soll die immer aktuelle Liste sein, also immer weiter gepflegt werden, bzw. wenn nötig auf die aktuelle Liste verweisen.
Fehlt etwas, ist etwas eher nicht gut …? Bitte melden!

Danke Just Me ich werde Deine Anmekungen noch sichten.
PS. auch obige Liste ist nicht in Stein gemeiselt und kann durch Bessere bzw. treffendere Elemente ersetzt oder ergänzt werden.
Last edited by Gerdi on 01 Feb 2019, 03:52, edited 5 times in total.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

30 Jan 2019, 10:08

Moin,

hier folgt eine (funktionsreduzierte) Version Deines Beispiels aus dem Beitrag "So soll's weitergehen". Es soll nur grob aufzeigen, was ich bei meinen Anmerkungen im Kopf hatte:

Code: Select all

#NoEnv
; MsgBox % 96/A_ScreenDPI
; --------------------------------------------------------------------------------
; #Include *i %A_ScriptDir%\FlexGui.ahk
; #Include *i %A_ScriptDir%\InclGuiGui.ahk
Opt := {}
Opt.New := true
Opt.GuiNewOpts := " +resize  " ; -DPIScale"
Opt.GuiName := "Name"
Opt.GuiShowOpts := " x6 y6 "

Elem1 := {}
Elem1.Type := "Button"
Elem1.Txt := " Neues GUI "

Elem2 := {}
Elem2.RelLage := "YwieVor"
Elem2.Type := "Button"
Elem2.Txt := "links"

Elem3 := {}
Elem3.RelLage := "YwieVor"
Elem3.Type := "Button"
Elem3.Txt := "oben"

Elem4 := {}
Elem4.RelLage := "YwieVor"
Elem4.AutoXYWH := "X"
Elem4.Type := "Button"
Elem4.Opt := " X240 "
Elem4.Txt := "      aktualisieren      "

Elem5 := {}
Elem5.AutoXYWH := "W"
Elem5.Type := "Edit"
Elem5.Opt := " X60 "
Elem5.Txt := "WinTitle                                    "

Elem6 := {}
Elem6.RelLage := "YwieVor"
Elem6.AutoXYWH := "W"
Elem6.Type := "Edit"
; Elem6.Opt := "X60"
Elem6.Txt := "WinOpt                          "

Elem7 := {}
Elem7.Type := "Text"
Elem7.Opt := " X6 "
Elem7.Txt := "`r`nDas GUI soll folgende Control's enthalten"


Elem8 := {}
Elem8.Type := "Button"
Elem8.Txt := "Neuer statischer Text"

Elem9 := {}
Elem9.RelLage := "YwieVor"
Elem9.AutoXYWH := "W"
Elem9.Type := "Edit"
Elem9.Txt := "Text                                                              "

Elem10 := {}
Elem10.Type := "Button"
Elem10.Opt := " X60 "
Elem10.Txt := "| Neu"

Elem11 := {}
Elem11.RelLage := "YwieVor"
Elem11.Type := "Button"
; Elem11.Opt := " X60 "
Elem11.Txt := "Alt Neu"

Elem12 := {}
Elem12.RelLage := "YwieVor"
Elem12.Type := "Button"
; Elem11.Opt := " X6 "
Elem12.Txt := "Alt`nNeu"

Elem13 := {}
Elem13.RelLage := "YwieVor"
Elem13.AutoXYWH := "W"
Elem13.Type := "Edit"
; Elem6.Opt := "X60"
Elem13.Txt := "ContOpt                                    "


Elem14 := {}
Elem14.Type := "Button"
Elem14.Opt := " X6 "
Elem14.Txt := "Neuer editierbarer Text"

Elem15 := {}
Elem15.RelLage := "YwieVor"
Elem15.AutoXYWH := "W"
Elem15.Type := "Edit"
Elem15.Txt := "Text                                                      `r`n`r`n"

Elem16 := {}
Elem16.Type := "Button"
Elem16.Opt := " X60 "
Elem16.Txt := "| Neu"

Elem17 := {}
Elem17.RelLage := "YwieVor"
Elem17.Type := "Button"
; Elem11.Opt := " X60 "
Elem17.Txt := "Alt Neu"

Elem18 := {}
Elem18.RelLage := "YwieVor"
Elem18.Type := "Button"
; Elel11.Opt := " X6 "
Elem18.Txt := "Alt`nNeu"

Elem19 := {}
Elem19.RelLage := "YwieVor"
Elem19.AutoXYWH := "W"
Elem19.Type := "Edit"
; Elem6.Opt := "X60"
Elem19.Txt := "ContOpt                                   "


Elem20 := {}
Elem20.Type := "Button"
Elem20.Opt := " X6 "
Elem20.Txt := "Neuer Button"

Elem21 := {}
Elem21.RelLage := "YwieVor"
Elem21.AutoXYWH := "W"
Elem21.Type := "Edit"
Elem21.Txt := "Text                                                                     `r`n"

Elem22 := {}
Elem22.Type := "Button"
Elem22.Opt := " X60 "
Elem22.Txt := "| Neu"

Elem23 := {}
Elem23.RelLage := "YwieVor"
Elem23.Type := "Button"
; Elem11.Opt := " X60 "
Elem23.Txt := "Alt Neu"

Elem24 := {}
Elem24.RelLage := "YwieVor"
Elem24.Type := "Button"
; Elel11.Opt := " X6 "
Elem24.Txt := "Alt`nNeu"

Elem25 := {}
Elem25.RelLage := "YwieVor"
Elem25.AutoXYWH := "W"
Elem25.Type := "Edit"
; Elem6.Opt := "X60"
Elem25.Txt := "ContOpt                                    "

; Elem26 := {}
; Elem26.Type := "Text"
; Elem26.Opt := " X6 "
; Elem26.Txt := 
Text26 := "`r`nweitere Control's in Planung`r`n..."
Elem26 := New FlexWin_Element("Text", "x6", , Text26)

FirstWinHwnd := FlexWin(Opt,Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8,Elem9,Elem10,Elem11,Elem12,Elem13,Elem14,Elem15,Elem16,Elem17,Elem18,Elem19,Elem20,Elem21,Elem22,Elem23,Elem24,Elem25,Elem26) ; ,Elem27,Elem28,Elem29)

EndeHaupPrg := True
Return
; -------------------------------------------------------------------------------------------------------------------------------
^q::
Reload
Return
; -------------------------------------------------------------------------------------------------------------------------------
#q::
For GuiHwnd In FlexWinObj.Guis
{
	Opt.GuiHwnd := GuiHwnd
	Opt.Close := true
	FlexWin(Opt)
}
ExitApp
; -------------------------------------------------------------------------------------------------------------------------------
TooltipWeg:
ToolTip
return
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_EditAction(DiesesHwnd) {
   GuiControlGet, EditTxt, , %DiesesHwnd%
	ToolTip %A_ThisFunc%: Edit %DiesesHwnd%`r`n`r`n%EditTxt%
	SetTimer, TooltipWeg, -3000
	Return
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_ButtonAction(DiesesHwnd) {
   GuiHwnd := FlexWinObj.Ctls[DiesesHwnd]
	MsgBox, 0, %A_ThisFunc%, GUI: %GuiHwnd%`nButton: %DiesesHwnd%
	Return
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_CloseAction(GuiHwnd) {
   GuiName := FlexWinObj.Guis[GuiHwnd, "Optionen", "GuiName"]
	MsgBox, 8228, Fenster schließen, Möchten Sie das Fenster %GuiName% wirklich schließen?
	IfMsgBox, Yes
	{
		Opt := {}
		Opt.GuiHwnd := GuiHwnd
		Opt.Close := true
		FlexWin(Opt)
      Return False
	}
	; MsgBox Fenster zu %DiesesHwnd%	%DiesesLabel%
	Return True
}
; ===============================================================================================================================
; #Include FlexWin.ahk - hier direkt ins Skript eingefügt
; ===============================================================================================================================
Global FlexWinObj
FlexWin(ByRef Optionen, Elemente*) {
	If (Optionen.Close) {
		If (GuiHwnd := Optionen.GuiHwnd) {
			Gui, %GuiHwnd%:Destroy
         FlexWinObj.Guis.Delete(GuiHwnd)
			; Aufraeumen bei den Steuerelementen !!!
		}
		Else {
			; Gosub Schlussabwicklungen
			ExitApp
		}
	}
	Else If (Optionen.New) {
		GuiTitel := Optionen.GuiName
		GuiNewOpts := Optionen.GuiNewOpts
		Gui, New, %GuiNewOpts% +HwndGuiHwnd +LabelFlexWin_, %GuiTitel%
      Optionen.GuiHwnd := GuiHwnd
      FlexWinObj.Guis[GuiHwnd] := {Optionen: Optionen, Elemente: [], AutoXYWH: {}}
		For Index, Element In Elemente {
			If !IsObject(Element) {
				MsgBox Elemente werden als Objekt erwartet. Stopp
				Return
			}
         RelPos := ""
         If (Element.RelLage = "YwieVor")
            RelPos := "x+m yp"
			If (Element.Type = "Edit") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Edit, %ElementOpts% %RelPos% gFlexWin_EditFunc HwndCtlHwnd, %ElementText%
			}
			Else If (Element.Type = "Text") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Text, %ElementOpts% %RelPos% HwndCtlHwnd, %ElementText%
			}
			Else If (Element.Type = "Button") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Button, %ElementOpts% %RelPos% gFlexWin_ButtonFunc HwndCtlHwnd, %ElementText%
			}
			If (Element.AutoXYWH <> "")
            FlexWinObj.Guis[GuiHwnd, "AutoXYWH"].Push({Hwnd: CtlHwnd, Opts: Element.AutoXYWH})
         Element.CtlHwnd := CtlHwnd
         FlexWinObj.Guis[GuiHwnd, "Elemente"].Push(Element)
         FlexWinObj.Ctls[CtlHwnd] := GuiHwnd
		}
		GuiShowOpts := Optionen.GuiShowOpts
		Gui, Show, AutoSize %GuiShowOpts% ; <--hier kann AutoSize verwendet werden
	}
	Return GuiHwnd
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_ButtonFunc(CtrlHwnd, GuiEvent, EventInfo, ErrLevel := "") {
	If IsFunc("FlexWin_ButtonAction") {
      VarFunc := "FlexWin_ButtonAction"
		%VarFunc%(CtrlHwnd)
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_EditFunc(CtrlHwnd, GuiEvent, EventInfo, ErrLevel := "") {
	If IsFunc("FlexWin_EditAction") {
      VarFunc := "FlexWin_EditAction"
		%VarFunc%(CtrlHwnd)
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_Close(GuiHwnd) {
	If IsFunc("FlexWin_CloseAction") {
      VarFunc := "FlexWin_CloseAction"
		Return (%VarFunc%(GuiHwnd))
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_Size(GuiHwnd, EventInfo, Width, Height) {
   Global EndeHaupPrg
   If (EndeHaupPrg) {
      For Each, Ctrl In FlexWinObj.Guis[GuiHwnd, "AutoXYWH"] {
         AutoXYWH(Ctrl.Opts, Ctrl.Hwnd)
      }
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_InitObj() {
   Static Init := FlexWin_InitObj()
   If !IsObject(FlexWinObj)
      FlexWinObj:= {Guis: {}, Ctls: {}}
}
; -------------------------------------------------------------------------------------------------------------------------------
Class FlexWin_Element {
   AutoXYWH := ""
   Opt      := ""
   RelLage  := ""
   Type     := ""
   Txt     := ""
   __New(Type, Opts := "", RelLage := "", Text := "", AutoXYWH := "") {
      This.Type := Type
      This.Opt := Opts
      This.RelLage := RelLage
      This.Txt := Text
      This.AutoXYWH := AutoXYWH
   }
}
; =================================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; ---------------------------------------------------------------------------------
; Version: 2015-5-29 / Added 'reset' option (by tmplinshi)
;          2014-7-03 / toralf
;          2014-1-2  / tmplinshi
; requires AHK version : 1.1.13.01+
; =================================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}

  If (DimSize = "reset")
    Return cInfo := {}

  For i, ctrl in cList {
    ctrlID := A_Gui ":" ctrl
    If ( cInfo[ctrlID].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
        fx := fy := fw := fh := 0
        For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]")))
            If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%)
              f%dim% := 1
        cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD}
    }Else If ( cInfo[ctrlID].a.1) {
        dgx := dgw := A_GuiWidth  - cInfo[ctrlID].gw  , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
        For i, dim in cInfo[ctrlID]["a"]
            Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space
        GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options
} } }
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

30 Jan 2019, 16:08

Danke Just Me,

Dein Skript ist wesentlich besser als meines.

Mit Static Init := FlexWin_InitObj() hatte ich Verständnis-Herausforderungen,
ist aber letztendlich nur ein Selbstaufruf, der schon beim Initialisieren durchlaufen wird.

ich denke ich bin nun in Lage die fehlenden Funktionalitäten + neue einzubauen.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

31 Jan 2019, 02:54

Moin,

wie gesagt, ich bin jederzeit bereit mitzumachen.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

31 Jan 2019, 10:17

ich bin jederzeit bereit mitzumachen.
Danke,
sehr gerne.

Um doppelte Arbeit zu vermeiden, hier erstmal mein Stand:

Code: Select all

#NoEnv
; MsgBox % 96/A_ScreenDPI
; --------------------------------------------------------------------------------
; #Include *i %A_ScriptDir%\FlexGui.ahk
; #Include *i %A_ScriptDir%\InclGuiGui.ahk
Opt := {}
Opt.New := true
Opt.GuiNewOpts := " +resize  " ; -DPIScale"
Opt.GuiName := "Name"
Opt.GuiShowOpts := " x6 y6 "
Opt.EleOptDefault := " x+m yp "	; Unterstuetzte Defaults: x+m yp	geplant;	y+m xp		 Last		wobei y+m xp gleich sein muesste wie eine leere Option  ; https://ahkde.github.io/docs/commands/Gui.htm#PosPlusMargin

Elem1 := {}
Elem1.Type := "Button"
Elem1.Txt := " Neues GUI "

Elem2 := {}
Elem2.Type := "Button"
Elem2.Txt := "links"

Elem3 := {}
Elem3.Type := "Button"
Elem3.Txt := "oben"

Elem4 := {}
Elem4.AutoXYWH := "X"
Elem4.Type := "Button"
Elem4.Lage := "W|ReBuend_6"
Elem4.Opt := " X+30 yp "
Elem4.Txt := "      aktualisieren      "

Elem5 := {}
Elem5.AutoXYWH := "W"
Elem5.Type := "Edit"
Elem5.Opt := " X60 "
Elem5.Txt := "WinTitle                                    "

Elem6 := {}
Elem6.AutoXYWH := "W"
Elem6.Lage := "W|ReBuend_6"
Elem6.Type := "Edit"
Elem6.Txt := "WinOpt                          "

Elem7 := {}
Elem7.Type := "Text"
Elem7.Opt := " Xm "
Elem7.Txt := "`r`nDas GUI soll folgende Control's enthalten"


Elem8 := {}
Elem8.Opt := " Xm "
Elem8.Type := "Button"
Elem8.Txt := "Neuer statischer Text"

Elem9 := {}
Elem9.AutoXYWH := "W"
Elem9.Lage := "W|ReBuend_6"
Elem9.Type := "Edit"
Elem9.Txt := "Text                                                              "

Elem10 := {}
Elem10.Type := "Button"
Elem10.Opt := " X60 "
Elem10.Txt := "| Neu"

Elem11 := {}
Elem11.Type := "Button"
Elem11.Txt := "Alt Neu"

Elem12 := {}
Elem12.Type := "Button"
Elem12.Txt := "Alt`nNeu"

Elem13 := {}
Elem13.AutoXYWH := "W"
Elem13.Lage := "W|ReBuend_6"
Elem13.Type := "Edit"
Elem13.Txt := "ContOpt                                    "


Elem14 := {}
Elem14.Type := "Button"
Elem14.Opt := " Xm "
Elem14.Txt := "Neuer editierbarer Text"

Elem15 := {}
Elem15.AutoXYWH := "W"
Elem15.Lage := "W|ReBuend_6"
Elem15.Type := "Edit"
Elem15.Txt := "Text                                                      `r`n`r`n"

Elem16 := {}
Elem16.Type := "Button"
Elem16.Opt := " X60 "
Elem16.Txt := "| Neu"

Elem17 := {}
Elem17.Type := "Button"
Elem17.Txt := "Alt Neu"

Elem18 := {}
Elem18.Type := "Button"
Elem18.Txt := "Alt`nNeu"

Elem19 := {}
Elem19.AutoXYWH := "W"
Elem19.Lage := "W|ReBuend_6"
Elem19.Type := "Edit"
Elem19.Txt := "ContOpt                                   "


Elem20 := {}
Elem20.Type := "Button"
Elem20.Opt := " Xm "
Elem20.Txt := "Neuer Button"

Elem21 := {}
Elem21.AutoXYWH := "W"
Elem21.Lage := "W|ReBuend_6"
Elem21.Type := "Edit"
Elem21.Txt := "Text                                                                     `r`n"

Elem22 := {}
Elem22.Type := "Button"
Elem22.Opt := " X60 "
Elem22.Txt := "| Neu"

Elem23 := {}
Elem23.Type := "Button"
Elem23.Txt := "Alt Neu"

Elem24 := {}
Elem24.Type := "Button"
Elem24.Txt := "Alt`nNeu"

Elem25 := {}
Elem25.AutoXYWH := "W"
Elem25.Lage := "W|ReBuend_6"
Elem25.Type := "Edit"
Elem25.Txt := "ContOpt                                    "

; Elem26 := {}
; Elem26.Type := "Text"
; Elem26.Opt := " X6 "
; Elem26.Txt := 
Text26 := "`r`nweitere Control's in Planung`r`n..."
Elem26 := New FlexWin_Element("Text", "xm", , Text26)

FirstWinHwnd := FlexWin(Opt,Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8,Elem9,Elem10,Elem11,Elem12,Elem13,Elem14,Elem15,Elem16,Elem17,Elem18,Elem19,Elem20,Elem21,Elem22,Elem23,Elem24,Elem25,Elem26) ; ,Elem27,Elem28,Elem29)

EndeHaupPrg := True
Return
; -------------------------------------------------------------------------------------------------------------------------------
^q::
Reload
Return
; -------------------------------------------------------------------------------------------------------------------------------
#q::
For GuiHwnd In FlexWinObj.Guis
{
	Opt.GuiHwnd := GuiHwnd
	Opt.Close := true
	FlexWin(Opt)
}
ExitApp
; -------------------------------------------------------------------------------------------------------------------------------
TooltipWeg:
ToolTip,,,,20
return
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_EditAction(DiesesHwnd) {
	GuiControlGet, EditTxt, , %DiesesHwnd%
	ToolTip %A_ThisFunc%: Edit %DiesesHwnd%`r`n`r`n%EditTxt%,,,20
	SetTimer, TooltipWeg, -3000
	Return
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_ButtonAction(DiesesHwnd) {
	GuiHwnd := FlexWinObj.Ctls[DiesesHwnd]
	MsgBox, 0, %A_ThisFunc%, GUI: %GuiHwnd%`nButton: %DiesesHwnd%
	Return
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_CloseAction(GuiHwnd) {
	GuiName := FlexWinObj.Guis[GuiHwnd, "Optionen", "GuiName"]
	MsgBox, 8228, Fenster schließen, Möchten Sie das Fenster %GuiName% wirklich schließen?
	IfMsgBox, Yes
	{
		Opt := {}
		Opt.GuiHwnd := GuiHwnd
		Opt.Close := true
		FlexWin(Opt)
      Return False
	}
	; MsgBox Fenster zu %DiesesHwnd%	%DiesesLabel%
	Return True
}
; ===============================================================================================================================
; #Include FlexWin.ahk - hier direkt ins Skript eingefügt
; ===============================================================================================================================
Global FlexWinObj
FlexWin(ByRef Optionen, Elemente*) {
	If (Optionen.Close) {
		If (GuiHwnd := Optionen.GuiHwnd) {	; Achtung dieser Vergleich ist nicht mit = sondern mit := gebildet
			Gui, %GuiHwnd%:Destroy
         FlexWinObj.Guis.Delete(GuiHwnd)
			; Aufraeumen bei den Steuerelementen !!!
		}
		Else {
			; Gosub Schlussabwicklungen
			ExitApp
		}
	}
	Else If (Optionen.New) {
		GuiTitel := Optionen.GuiName
		GuiNewOpts := Optionen.GuiNewOpts
		Gui, New, %GuiNewOpts% +HwndGuiHwnd +LabelFlexWin_, %GuiTitel%
		Optionen.GuiHwnd := GuiHwnd
		Lage := {}
		FlexWinObj.Guis[GuiHwnd] := {Optionen: Optionen, Elemente: [], AutoXYWH: {}}
		For Index, Element In Elemente {
			If !IsObject(Element) {
				MsgBox Elemente werden als Objekt erwartet. Stopp
				Return
			}
			RelPos := ""
			If (Element.Opt = "")
				Element.Opt := Optionen.EleOptDefault
				;~ RelPos := "x+m yp"				; x+m relatiefer Abstand Margin	zum rechten Rand des vorigen Controls	yp y vom vorigen Control
			If (Element.Type = "Edit") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Edit, %ElementOpts% %RelPos% gFlexWin_EditFunc HwndCtlHwnd, %ElementText%
			}
			Else If (Element.Type = "Text") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Text, %ElementOpts% %RelPos% HwndCtlHwnd, %ElementText%
			}
			Else If (Element.Type = "Button") {
				ElementOpts := Element.Opt
				ElementText := Element.Txt
				Gui, Add, Button, %ElementOpts% %RelPos% gFlexWin_ButtonFunc HwndCtlHwnd, %ElementText%
			}
			If (Element.AutoXYWH <> "")
				FlexWinObj.Guis[GuiHwnd, "AutoXYWH"].Push({Hwnd: CtlHwnd, Opts: Element.AutoXYWH})
			Element.CtlHwnd := CtlHwnd
			FlexWinObj.Guis[GuiHwnd, "Elemente"].Push(Element)
			FlexWinObj.Ctls[CtlHwnd] := GuiHwnd


			if(Element.Lage <> "")	; Bsp. ; Elem30.Lage := "X+W|ReBuend_6"
				Lage[CtlHwnd] := Element.Lage
		}
		GuiShowOpts := Optionen.GuiShowOpts
		Gui, Show, AutoSize %GuiShowOpts%
		


		if(Margin= "")
			Margin := 6

		for CtlHwnd, GuiHwnd in FlexWinObj.Ctls
		{
			if(Lage[CtlHwnd] <> "")
			{
 				LageReBuendB := false
				if(InStr(Lage[CtlHwnd],"|"))
				{
					zeichen_von:= StrSplit(Lage[CtlHwnd],"|",A_Space)
					LageZeichen := zeichen_von.1
					Rand := zeichen_von.2
					if(SubStr(Rand,1,7)="ReBuend")
					{
						Womit_Abstand := StrSplit(Rand,"_")
							if (LastGuiHwnd <> GuiHwnd)
								WinGetPos,GuiX,GuiY,GuiW,GuiH,ahk_id %GuiHwnd%
							ControlGetPos,CtlX,,CtlW,,,ahk_id %CtlHwnd%
							DiesesX := GuiW-CtlW-(Margin + Womit_Abstand.2)*A_ScreenDPI/96
							DieseW  :=  GuiW-CtlX-(Margin + Womit_Abstand.2)*A_ScreenDPI/96
							if( NOT InStr(zeichen_von.1,"X"))
								DiesesX := 
							if( NOT InStr(zeichen_von.1,"W"))
								DieseW := 
							ControlMove,,DiesesX,,DieseW,,ahk_id %CtlHwnd%
							LageReBuendB := true
							LastGuiHwnd := GuiHwnd
					}
				}
				if NOT LageReBuendB
					MsgBox % "Element.Lage " Lage[CtlHwnd] " wird noch nicht unterestuetzt!"
			}
		}
	}
	Return GuiHwnd
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_ButtonFunc(CtrlHwnd, GuiEvent, EventInfo, ErrLevel := "") {
	If IsFunc("FlexWin_ButtonAction") {
      VarFunc := "FlexWin_ButtonAction"
		%VarFunc%(CtrlHwnd)
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_EditFunc(CtrlHwnd, GuiEvent, EventInfo, ErrLevel := "") {
	If IsFunc("FlexWin_EditAction") {
      VarFunc := "FlexWin_EditAction"
		%VarFunc%(CtrlHwnd)
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_Close(GuiHwnd) {
	If IsFunc("FlexWin_CloseAction") {
      VarFunc := "FlexWin_CloseAction"
		Return (%VarFunc%(GuiHwnd))
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_Size(GuiHwnd, EventInfo, Width, Height) {
   Global EndeHaupPrg
   If (EndeHaupPrg) {
      For Each, Ctrl In FlexWinObj.Guis[GuiHwnd, "AutoXYWH"] {
         AutoXYWH(Ctrl.Opts, Ctrl.Hwnd)
      }
   }
}
; -------------------------------------------------------------------------------------------------------------------------------
FlexWin_InitObj() {
   Static Init := FlexWin_InitObj()
   If !IsObject(FlexWinObj)
      FlexWinObj:= {Guis: {}, Ctls: {}}
}
; -------------------------------------------------------------------------------------------------------------------------------
Class FlexWin_Element {
   AutoXYWH := ""
   Opt      := ""
   RelLage  := ""
   Type     := ""
   Txt     := ""
   __New(Type, Opts := "", RelLage := "", Text := "", AutoXYWH := "") {
      This.Type := Type
      This.Opt := Opts
      This.RelLage := RelLage
      This.Txt := Text
      This.AutoXYWH := AutoXYWH
   }
}
; =================================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; ---------------------------------------------------------------------------------
; Version: 2015-5-29 / Added 'reset' option (by tmplinshi)
;          2014-7-03 / toralf
;          2014-1-2  / tmplinshi
; requires AHK version : 1.1.13.01+
; =================================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}

  If (DimSize = "reset")
    Return cInfo := {}

  For i, ctrl in cList {
    ctrlID := A_Gui ":" ctrl
    If ( cInfo[ctrlID].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
        fx := fy := fw := fh := 0
        For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]")))
            If !RegExMatch(DimSize, "i)" dim "\s*\K[\d.-]+", f%dim%)
              f%dim% := 1
        cInfo[ctrlID] := { x:ix, fx:fx, y:iy, fy:fy, w:iw, fw:fw, h:ih, fh:fh, gw:A_GuiWidth, gh:A_GuiHeight, a:a , m:MMD}
    }Else If ( cInfo[ctrlID].a.1) {
        dgx := dgw := A_GuiWidth  - cInfo[ctrlID].gw  , dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
        For i, dim in cInfo[ctrlID]["a"]
            Options .= dim (dg%dim% * cInfo[ctrlID]["f" dim] + cInfo[ctrlID][dim]) A_Space
        GuiControl, % A_Gui ":" cInfo[ctrlID].m , % ctrl, % Options
} } }

Ich habe die Rechts-Bündigkeit wieder zugefügt und "YwieVor" durch AHK-Gui-Standard-Schreibweise ersetzt.
Du darfst darin beliebige Änderungen machen, die Du für sinnvoll hältst.

Nun stellt sich die Frage, fügen wir zuerst die wichtigste fehlende Control's ein oder sollte das Gui-Erfassungs-Modul zeitlich vorher kommen?
Oder kann man beides gleichzeitig angehen? Fall Du etwas Anderes für wichtiger hälst einfach melden. Zur Anforderungsliste wollte ich noch wissen ob sie einigermaßen verständlich rüber gekommen ist, Der Versuch diese so Lösungs-Neutral wie möglich zu halten, macht sie nicht einfacher zum lesen. Wenn Bedarf besteht fügen wir auch noch eine Wie-Wird-Realisiert-Seite ein.
Ansonsten darfst Du dir auch nach "was mache ich lieber" Themen raussuchen!
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

31 Jan 2019, 11:31

Hallo Gerdi,

ich schau mir das noch mal in Ruhe an. Deshalb wird es wahrscheinlich etwas dauern, bevor ich mich wieder melde.

Bis dann!

just me
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

31 Jan 2019, 13:54

ToDo-Liste:

- fehlende Control's in FlexWin einrichten.
- Optional 1 zu 1 Durchgang von den Usereingaben zu AHK-GUI-Befehlen ermöglichen. (Eventuell durch einfache #include's)
- Gui-Einrichtungs-Modul (Schnittstelle zwischen User und den Eingangs-Objekten Opt und Element)
- Gedanken machen und Lösungsvarianten aufzeigen zur sauberen Trennung zwischen Skript und Userbelange.
- Diese Trennung (sofern nicht schon drinn) einbauen.
- Prüfen abschätzen etc. ob und wie sich kompliziertere Control's einbinden lassen, dabei nicht vergessen den Nutzen zu überprüfen.
- laufend überprüfen ob etwas nicht einfacher geht, sowohl für den User als auch für den Programmierer.

Auch diese Liste wird weiter gepflegt bzw. abgehakt.
Fehlt etwas, ist etwas eher nicht gut …? Bitte melden!
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

01 Feb 2019, 08:00

Wenn man im Walde steht sieht man den Wald vor lauter Bäumen nicht.
Hier ein weiterer Versuch die Usereingabe komfortabler zu machen:

Code: Select all

GuiEin:
Gui,30:New,+resize,Fenster Erstellung
Gui,30:Add,Button,x100 gGuiEinButtonFensterNameAbbrechen,abbrechen
Gui,30:Add,Button,x+m, + Gui
Gui,30:Add,Button,x+m,- letztes Control
Gui,30:Add,Button,x+m, + Control
Gui,30:Add,Button,x+m  gGuiEinButtonFensterNameOK, aktualisiere Control
Gui,30:Add,Button,x+m, (Zwischen-) Speichern
; Gui,30:Add,Button,x+m w100 gGuiEinButtonFensterNameOK HwndHwndGuiEinButtonFensterNameOK,OK
Gui,30:Add,Text,xm w200,`r`nFenster Name eingeben
Gui,30:Add,Text,x+m w100,`r`nFenster Optionen
Gui,30:Add,Edit,xm w200 gGuiEinEditFensterName vGuiEinEditFensterName ,Fenster Name
Gui,30:Add,Edit,x+m w100 gGuiEinEditFensterOpt vGuiEinEditFensterOpt ,+resize
Gui,30:Add,DropDownList,x+m  gGuiEinDropDownListWinOrt vGuiEinDropDownListWinOrt Choose1,oben links|oben mitte|oben rechts|mitte links|mitte mitte|mitte rechts|unten links|unten mitte|unten rechts|

Gui,30:Add,Tab3,xm y100 W600 H530 gGuiEinTab3Controls vGuiEinTab3Controls HwndHwndGuiEinTab3Controls ,Text / Edit / Button / Link / Lage||UpDown|Picture|Checkbox|Radio|DropDownList|ComboBox|ListBox|ListView|TreeView|Hotkey|DateTime|MonthCal|Slider|Progress|1 : 1 Durchlass
Gui,30: Tab, 16
	Gui,30:Add,Edit,x60 Y186 w500   R30  ,Gui,#:Add,...`r`n...
Gui,30: Tab, 1
Gui,30:Add,Radio,vControlAuswahl1  ,Text
Gui,30:Add,Radio,vControlAuswahl2 x+m ,Edit
Gui,30:Add,Radio,vControlAuswahl3 x+m ,Button
Gui,30:Add,Radio,vControlAuswahl4 x+m ,Link
; GuiControl, , %HwndGuiEinTab3Controls%, Edit
Gui,30:Add,GroupBox,x80 y270 W50 H150
Gui,30:Add,GroupBox,x160 y200 W150 H50
Gui,30:Add,GroupBox,x50 y170 W450 H420
	
	Gui,30:Add,Text,x86 Y278q ,Last-`r`nControl`r`nX-Sicht
	Gui,30:Add,Text,x165 Y208 ,Last-`r`nControl`r`nY-Sicht
temp =
(
Bla Blub
beliebigen Text
eingeben!


Bei ausgewähltem Link wird ein Link in folgender Form erwartet:
Das ist ein <a href="https://autohotkey.com">Link</a>

)
	Gui,30:Add,Edit,x160 Y276 w250  gGuiEinEditText R18 vGuiEinEditText ,%temp%
	
	Gui,30:Add,Edit,x418 y272  -VScroll ,+`n :`n :`n :`n :`n :`n :`n :`nA`nu`nt`no`n :`n :`n :`n :`n :`n :`n+	; Control-Höhe z.B. R10 H200 ohne Zrichen-Angabe R für Row Pfür Pixel
	Gui,30:Add,Edit,x348 y168  -VScroll ,+`n :`n :`n :`n*`n :`n :`n :`n+ ; Abstad zum Rand
	Gui,30:Add,Edit,x278 y202  -VScroll ,+`n :`n0`n :`n :`n+ ; Y-Abstend von der vorigen Control-Obrkante
	Gui,30:Add,Edit,x218 y242  -VScroll ,+`n*`n+	; Y-Abstand von vorigen Control

	Gui,30:Add,Edit,x130 y504  -VScroll ,+`n :`n :`n*`n :`n :`n+ ; Y-RandAbstend
	
	Gui,30:Add,Edit,x126 y320  R1  ,+- M -+
	Gui,30:Add,Edit,x75 y393  R1  ,+ - - - - -  *  - - - - +
	Gui,30:Add,Edit,x46 y450  R1  ,+ - - - - - - -  * - - - - - - - + ; Abstad zum Rand
	Gui,30:Add,Edit,x157 y515  R1  ,+ - - - - - - - - - - - - - - - - - Auto - - - - - - - - - - - - - - - - + ; Abstad zum Rand
	Gui,30:Add,Edit,x406 y540  R1  ,+ - - - - -  *  - - - - - +
	
	Gui,30:Add,Text,x346 y600 ,Optionen:
	Gui,30:Add,Edit,x400 y600 w200 R1  ,X+M YP

Gui,30:show,AutoSize	; W620 H610
return

GuiEinTab3Controls:
return
GuiEinDropDownListWinOrt:
GuiEinDropDownListControls:
SoundBeep
Gui,30:Submit,NoHide
if(GuiEinDropDownListControls = "Edit")
{

}
return
GuiEinEditOpt:
return

GuiEinEditText:
return
GuiEinDropDownListFensterOpt:
return
GuiEinEditFensterName:
return
GuiEinEditFensterOpt:
return
GuiEinButtonFensterNameOK:
Reload
; GuiControl,30:Show ,%HwndGuiEinDropDownListControls%
; Gui,30:Add,Button, gGuiEinButtonFensterNameAbbrechen,abbrechen


return
GuiEinButtonFensterNameAbbrechen:
ExitApp
return
Modell ohne Funktionalität nur für ausgesuchte Control's und Positionierung.
Sofern es sich (beim jeweiligen Control) machen lässt soll während der Eingabe schon das zu erstellende Gui angezeigt werden.

PS. die Bemaßungen sollen auch als Eingabefelder dienen können.

02.02.19 Nachträglich 1 : 1 Durchlass dem Skript zugefügt.
Sowie weitere Controls aufgenommen.
Last edited by Gerdi on 01 Feb 2019, 19:33, edited 4 times in total.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

01 Feb 2019, 10:34

Hier noch ein Hinweis in eigener Sache.
Falls ich mich plötzlich nicht mehr melden sollte, liegt das an gesundheitlichen Herausforderungen.
In diesem Fall hat Just Me die vollen Rechte am bisher erreichten, auch an meinen Anteilen.
Es können von Just Me und von mir weitere Projektmitglieder aufgenommen werden.
Sollte von den Berechtigten über 1 Jahr keine Pflege mehr erfolgen, darf jedermann die Weiterpflege übernehmen,
sofern das Ergebnis wieder frei zugänglich ist.

Der Absatz drüber soll zukünftige rechtliche Pat-Situationen vermeiden, nutzen und Einbinden ist eh für Jedermann erlaubt.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

02 Feb 2019, 04:09

Moin Gerdi,

es tut mir leid zu hören, dass Du gesundheitliche Probleme hast. Ich wünsche Dir schnelle Besserung/Genesung. Mein alternder Körper bereitet mir in letzter Zeit auch vermehrt Probleme.

Zum eigentlichen Thema:

Sag doch bitte möglichst konkret, wo die Reise hingehen soll. Als ich mir FlexWin() das erste Mal angeschaut habe, dachte ich an ein Tool, das es den Nutzern ermöglichen soll, einfache GUIs für Abfragen und oder Anzeigen zu erzeugen, ohne sich mit der für Anfänger etwas kryptischen Syntax der Gui-Anweisungen beschäftigen zu müssen. Das wäre für mich hauptsächlich ein Ersatz für Message-oder Input-Boxen.

Inzwischen sieht es allerdings danach aus, dass FlexWin() auch komplexe Fenstern und Steuerelemente unterstützen soll. Hier stellt sich für mich die Sinnfrage. Bei komplexen Fenstern lohnt es sich bzw. ist es zwingend erforderlich, sich mit der AHK Gui-Syntax zu beschäftigen. Wenn man sich dann einmal eingearbeitet hat, wird man seine Fenster meiner Meinung nach eher nicht mit FlexWin() erstellen, weil das letztlich mehr Codezeilen, damit mehr Schreibarbeit und einen Verlust an Übersichtlichkeit bewirkt.

Willst Du wirklich die "eierlegende Wollmilchsau"?

Grüße,
just me
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

02 Feb 2019, 06:49

das es den Nutzern ermöglichen soll, einfache GUIs für Abfragen und oder Anzeigen zu erzeugen, ohne sich mit der für Anfänger etwas kryptischen Syntax der Gui-Anweisungen beschäftigen zu müssen. Das wäre für mich hauptsächlich ein Ersatz für Message-oder Input-Boxen.
Das ist ein zu erwartender Haupt-Anwender-Kreis. Ich sehe das Tool aber auch für allgemeine einfache Fenster, dass ich einen 1:1 Durchgang zusätzlich vorgesehen habe ist um den Skripter auch bei nachträglichen Besonderheiten nicht zum Tool-wechsel zwingen zu müssen. Die vielen Control's in meinem Reiter-Karten-Beispiel müssen in der Tat auf Sinnhaftigkeit geprüft werden.
Beispielhaft möchte ich mal einen Anwendungsfall skizzieren:
Es soll eine Vereins-Unterstützungs-Tool entstehen. Dazu werden ein paar einfache Fenster zur Dateneingabe benötigt.
Mit GuiEin.ahk werden die Fenster optisch aufgebaut und mit FlexWin.ahk gleichzeitig optisch überprüft.
Die Daten die GuiEin.ahk an FlexWin.ahk übergibt werden dabei abgespeichert für eventuelle spätere Änderungen.
Die Verdrahtungen der Fenster müssen nachträglich vom Skripter manuell vorgenommen werden (Bei welchem Klick passiert was, Wohin werden die Editfelder geschrieben etc.). Um diese Aufgabe erledigen zu können braucht er eine saubere Trennung der Aktionen seiner Fenster vom Rest.
Nun soll die Vereins-Unterstützung auch noch Auswertungen und Aktionen bekommen. Dazu werden auf selbe beschriebene Weise neue Fenster erzeugt und wiederum manuell verdrahtet.
Um nachher das Tool zu nutzen wird nur noch FlexWin.ahk benötigt bzw. wenn die Trennung der Aktionen und die Fenster-Quelldaten jeweils in AHK-Schreibweise exportierbar waren, dann braucht er nur noch diese Export-Daten in sein Skript einzubinden.
Sinnvoll wird unser Tool dabei nur wenn der Skripter fast ausschließlich einfache Fenster Funktionalität benötigt.

Aber ich gebe Dir Recht mal kurz ne eigene Anzeige oder Abfrage zu machen, sollte unser Tool in erster Linie können.
Mehr Klarheit sollte auch das Folgende bringen.
Anbei das bisherige GuiEin.ahk welches noch vollständig unverdrahtet zu FlexWin.ahk ist (dessen Eingangsdaten es ja liefern soll) aber die interne Verdrahtung funktioniert teilweise.
Z.B. kann die Höhen-Bemaßung beschrieben werden und der Wert findet sich nach klick auf Aktualisieren in den Optionen wieder.

Code: Select all

GuiEin:
Gui,30:New,+resize,Fenster Erstellung
Gui,30:Add,Button,x100 gGuiEinButtonFensterNameAbbrechen,abbrechen
GuiEinButtonFensterNameAbbrechen(){
ExitApp		; Vorlaeufig
}
Gui,30:Add,Button,x+m gGuiEinButtonPlusGui, + Gui
GuiEinButtonPlusGui(){
Reload		; Vorlaeufig
}
Gui,30:Add,Button,x+m,- letztes Control
Gui,30:Add,Button,x+m gGuiEinButtonPlusCtrl HwndHwndButtonPlusCtrl , + Control
GuiEinButtonPlusCtrl(){
	global HwndGuiEditCtrlH1,HwndGuiEditCtrlH2,GuiEditCtrlH1Anf,GuiEditCtrlH2Anf,GuiEditCtrlH2,GuiEditCtrlH2,GuiEinEditHauptEinAnf
	GuiControl,30:Hide,%HwndGuiEditCtrlH2%
	GuiEditCtrlH1:=GuiEditCtrlH1Anf
	GuiControl,30:,GuiEditCtrlH1,%GuiEditCtrlH1%
	GuiEditCtrlH2:=GuiEditCtrlH2Anf
	GuiControl,30:,GuiEditCtrlH2,%GuiEditCtrlH2%
	GuiControl,30:Show,%HwndGuiEditCtrlH1%	
	GuiEinCtrlOpt := "X+M YP "
	GuiControl,30:,GuiEinCtrlOpt,%GuiEinCtrlOpt%
	GuiEinEditHauptEin := GuiEinEditHauptEinAnf
	GuiControl,30:,GuiEinEditHauptEin,%GuiEinEditHauptEin%
}
Gui,30:Add,Button,x+m  gGuiEinButtonFensterNameOK, aktualisiere Control
GuiEinButtonFensterNameOK(){
	global GuiEditCtrlH2,GuiEinCtrlOpt
	Gui,30:Submit,NoHide
	GuiEinCtrlOpt := "X+M YP " GuiEditCtrlH2
	GuiControl,30:,GuiEinCtrlOpt,%GuiEinCtrlOpt%
}
Gui,30:Add,Button,x+m, (Zwischen-) Speichern
Gui,30:Add,Text,xm w200,`r`nFenster Name eingeben
Gui,30:Add,Text,x+m w100,`r`nFenster Optionen
Gui,30:Add,Edit,xm w200 vGuiEinEditFensterName ,Fenster Name
Gui,30:Add,Edit,x+m w100 vGuiEinEditFensterOpt ,+resize
Gui,30:Add,DropDownList,x+m  vGuiEinDropDownListWinOrt Choose1,oben links|oben mitte|oben rechts|mitte links|mitte mitte|mitte rechts|unten links|unten mitte|unten rechts|
Gui,30:Add,Tab3,xm y100 W600 H530 vGuiEinTab3Controls HwndHwndGuiEinTab3Controls ,Text/Link  / Edit / Button / Lage||UpDown|Picture|Checkbox|Radio|DropDownList|ComboBox|ListBox|ListView|TreeView|Hotkey|DateTime|MonthCal|Slider|Progress|1 : 1 Durchlass
Gui,30: Tab, 16
Gui,30:Add,Edit,x60 Y186 w500   R30  ,Gui,#:Add,...`r`n...
Gui,30: Tab, 1
Gui,30:Add,Radio,vControlAuswahl1  ,Text
Gui,30:Add,Radio,vControlAuswahl4 x+m ,Link
Gui,30:Add,Radio,vControlAuswahl2 x+m ,Edit
Gui,30:Add,Radio,vControlAuswahl3 x+m ,Button
Gui,30:Add,Button,x+m gGuiEinButtonEinLeer,großes Eingabefeld leeren
GuiEinButtonEinLeer(){
	global GuiEinEditHauptEin,HwndEditHauptEin
	GuiEinEditHauptEin :=
	GuiControl,30:,GuiEinEditHauptEin,
	ControlFocus,,ahk_id %HwndEditHauptEin%
}
Gui,30:Add,GroupBox,x80 y270 W50 H150
Gui,30:Add,GroupBox,x160 y200 W150 H50
Gui,30:Add,GroupBox,x50 y170 W450 H420
	
Gui,30:Add,Text,x86 Y278q ,Last-`r`nControl`r`nX-Sicht
Gui,30:Add,Text,x165 Y208 ,Last-`r`nControl`r`nY-Sicht
GuiEinEditHauptEinAnf =
(
Bla Blub
beliebigen Text
eingeben!


Bei ausgewähltem Link wird ein Link in folgender Form erwartet:
Das ist ein <a href="https://autohotkey.com">Link</a>

)
Gui,30:Add,Edit,x160 Y276 w250  gGuiEinEditHauptEin R18 vGuiEinEditHauptEin HwndHwndEditHauptEin,%GuiEinEditHauptEinAnf%
GuiEinEditHauptEin(){
}
GuiEditCtrlH1Anf:="+`n :`n :`n :`n :`n :`n :`n :`nA`nu`nt`no`n :`n :`n :`n :`n :`n :`n+"
Gui,30:Add,Edit,x418 y272 gGuiEditCtrlH1 vGuiEditCtrlH1 HwndHwndGuiEditCtrlH1 -VScroll ,%GuiEditCtrlH1Anf%	; Control-Höhe z.B. R10 H200 ohne Zeichen-Angabe R für Row Pfür Pixel
GuiEditCtrlH1(HwndGuiEditCtrlH1){
	global GuiEditCtrlH1,GuiEditCtrlH2,HwndGuiEditCtrlH2
	GuiControl,30:Hide,%HwndGuiEditCtrlH1%
	GuiControl,30:Show,%HwndGuiEditCtrlH2%
	ControlFocus,,ahk_id %HwndGuiEditCtrlH2%
	ControlSend,,{End},ahk_id %HwndGuiEditCtrlH2%

}
GuiEditCtrlH2Anf := "H"
Gui,30:Add,Edit,x418 y272 w50 gGuiEditCtrlH2 vGuiEditCtrlH2 HwndHwndGuiEditCtrlH2 -VScroll , %GuiEditCtrlH2Anf%	; Control-Höhe z.B. R10 H200 ohne Zeichen-Angabe R für Row Pfür Pixel
GuiEditCtrlH2(HwndGuiEditCtrlH2){
	global GuiEditCtrlH1,GuiEditCtrlH2
}
GuiControl,30:Hide,%HwndGuiEditCtrlH2%

Gui,30:Add,Edit,x348 y168  -VScroll ,+`n :`n :`n :`n*`n :`n :`n :`n+ ; Abstad zum Rand
Gui,30:Add,Edit,x278 y202  -VScroll ,+`n :`n0`n :`n :`n+ ; Y-Abstend von der vorigen Control-Obrkante
Gui,30:Add,Edit,x218 y242  -VScroll ,+`n*`n+	; Y-Abstand von vorigen Control

Gui,30:Add,Edit,x130 y504  -VScroll ,+`n :`n :`n*`n :`n :`n+ ; Y-RandAbstend

Gui,30:Add,Edit,x126 y320  R1  ,+- M -+
Gui,30:Add,Edit,x75 y393  R1  ,+ - - - - -  *  - - - - +
Gui,30:Add,Edit,x46 y450  R1  ,+ - - - - - - -  * - - - - - - - + ; Abstad zum Rand
Gui,30:Add,Edit,x157 y515  R1  ,+ - - - - - - - - - - - - - - - - - Auto - - - - - - - - - - - - - - - - + ; Abstad zum Rand
Gui,30:Add,Edit,x406 y540  R1  ,+ - - - - -  *  - - - - - +

Gui,30:Add,Text,x346 y600 ,Optionen:
Gui,30:Add,Edit,x400 y600 w200 R1 vGuiEinCtrlOpt ,X+M YP
{
	GuiEinCtrlOpt := "X+M YP " GuiEditCtrlH2
}

Gui,30:show,AutoSize
return
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: ; Gui's mal kurz erstellen mit Grund-Funktionalität

07 Feb 2019, 11:25

Anbei ein Menue-Baustein der spaeter als Gui-Menue Baustein in einem extra Reiter angeboten werden soll.

Code: Select all

; MenueEinlesen
IfExist % A_Args.1
{
	Path :=  A_Args.1
	FileRead,MenuQuell,%Path%
}
else IfExist % A_ScriptDir "\QuellTextMenu.txt"
{
	Path := A_ScriptDir "\QuellTextMenu.txt"
	FileRead,MenuQuell,%Path%
}
else
{
	MenuQuell =		; Nutzloses Quell-Text-Beispiel
(
Gui_Name_Menu
	Hallo
		Welt
			All
	Welt
		All
	All
)
}
Loop,Parse,MenuQuell,`n,`r
{
	tem2 := trim(A_LoopField)
	if(SubStr(tem2,1,1) <> ";")
		tem .= A_LoopField "`r`n"		; nur unkommntirte Zeilen uebernehmen
}
MenuQuell := tem
QZ:=StrSplit(MenuQuell,"`n","`r")

T := {}
TL := {}
Tindex:=0
; KZK := 0	; Kommentar-Zeilen-Korrektur
Menu := {}
; 1. Zeile muss Kommentar ohne Tabs oder leer sein
HLoops:=10
loop % HLoops
{
	
	Rindex := HLoops +1-A_Index
	if (Rindex<=2)
		break
	Loop % QZ.MaxIndex()
	{
		ZIndex := A_Index
		ZeilenTrim := Trim(QZ[ZIndex])
		if (SubStr(ZeilenTrim,1,1)=";")	; Kommentare uebespringen
		{
			continue
		}
		E:=StrSplit(QZ[ZIndex],A_Tab)
		EE:=StrSplit(QZ[ZIndex+1],A_Tab)
		H:=E.MaxIndex()
		HH:=EE.MaxIndex()
		Leer_DotDot:=
		if(H+1=HH AND H>1)
			Leer_DotDot:=":"
		if (H >= Rindex)
			continue
		if (H = RIndex - 1)
		{
			if (MenuName="")
			{
				MenuName := Last
				++Tindex
				T[Tindex] :=  MenuName "`r`n"
			}
			T[Tindex] .= Leer_DotDot ZeilenTrim "`r`n"
		}
		else
			MenuName :=""
		Last := ZeilenTrim
	}
	
}
; MsgBox
for Index, Menue in T
{
	Loop Parse, Menue, `n,`r
	{
		if (A_Index=1)
		{
			MenNam :=  A_LoopField
			StringReplace,MenNam,MenNam,-,M,All
			StringReplace,MenNam,MenNam,+,P,All
			StringReplace,MenNam,MenNam,%A_Space%,_,All
		}
		else if(SubStr(A_LoopField,1,1)=":")
		{
			StringReplace,LoopField,A_LoopField,-,M,All
			StringReplace,LoopField,LoopField,+,P,All
			StringReplace,LoopField,LoopField,%A_Space%,_,All
			Menu, %MenNam%, Add, % SubStr(A_LoopField,2), %LoopField%
t2:=SubStr(A_LoopField,2)
tem=
(
Menu, %MenNam%, Add,  %t2%,%LoopField%
			
)
if(Trim(t2)<>"")
	ges .= tem
		}
		else
		{
			Menu, %MenNam%, Add, %A_LoopField%	, MenuFunc
tem=
(
Menu, %MenNam%, Add, %A_LoopField%, MenuFunc

)
if(Trim(A_LoopField)<>"")
	ges .= tem
		}
	}
}
StringReplace,ges,ges,`n,`r`n,all
; Clipboard := ges
Menu,Gui_Name_Menu,Show
return
MenuFunc(){
	SoundBeep
	MsgBox % "Im (Unter-)Menü`n"A_ThisMenu A_Tab "`nwurde der " A_ThisMenuItemPos " Entrag mit dem Bezeichner `n	" A_ThisMenuItem "`ngewählt." 
}
mit einem QuellTextBeispiel

Code: Select all

; Beispiel einer Menue-Quell-Datei fuer MenueEinlesen.ahk
; Fuehrende Tabulatoren bestimmen die entstehende Menue-Hierarchie.
; Tabulatoren inmitten des Textes einer Zeile sind verboten.
; Die Tabulatoren-Anzahl darf von Zeile zu Zeile nur um einen Tabulator differieren.
; (Letztere Einschraenkung gilt nur von links nach rechts.)
; Mit dem &-Zeichen kann die Tastaturbedienung beinflusst werden.
; Die Erste Zeile enthält den AHK-internen Menue-Namen.
; Sie darf keinen Tabulator enthalten.
Gui_Name_Menu
	&Datei
; 	 ^ Eintrag kann mit Zeichen nach &(hier D) via Tastatur gewählt werden. 
		&speichern
		speichern &unter
		
;   		^ nur Tabulatoren-Zeile fuegt Trennstrich im Menue ein.
		Druck-&Voransicht
		&Drucken
		
		Programm &beenden
	&bearbeiten
		; <optional Zifferntasten>
		&1 alle auswählen
		&2 alle abwählen
		&3 Auswahl
			Element &1
				1&a
				1&b
				1&c
			Element &2
			Element &2
		&4 minus Auswahl
			Element &1
			Element &2
			Element &2
		; </optional Zifferntasten>
	&Optionen
		&Normalansicht
		&Experten-Modus
		&Einstellungen
	&Hilfe
		&Über
		&Hilfe anzeigen

; wenn das erste sichtbare Zeichen einer Zeile ein Semicolon ist
; dann ist die ganze Zeile als waere sie nicht vorhanden.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 23 guests