Alina : Wie gesagt das war ein bisschen QuD (Quick und Dirty). Sicherlich ginge das auch, genauso wie du bestimmt auch immer auf das Basis Array zurückgreifen könntest ohne das Zwischenarray. Ist halt die Frage was man machen will. Die Anzahl der Buttons etc. richtet sich ja danach wieviele Zeilen es gibt und wieviele Spalten man will, der Rest errechnet sich einfach.
GUI - dynamische Button mit Daten aus DB erstellen
-
gmmg -
29. April 2024 um 10:37 -
Unerledigt
-
-
Moombas
Ich sage "Sorry". Ich hatte das Script noch nicht ganz verstanden. Man kann halt nicht einfach ein Button hinzufügen, sondern muss man wohl immer eine Buttonanzahl nehmen, die ohne Rest durch die Variable $ButtonCols (hier die 3) zu teilen ist. Oder sehe ich dieses falsch? Stören würde es mich nicht, aber es geht gerade um mein Verständnis. -
Naja, wenn im Array aus der DB ein 10. Button dazu kommt. müsste eigentlich eine weitere Reihe erzeigt werden.
Habe aber eben festgestellt, das das bei meinem Skript einen Fehler wirft.
-
Habe aber eben festgestellt, das das bei meinem Skript einen Fehler wirft.
Dennoch gefällt es mir.
-
Ich habe jetzt mal mit dem Beispiel von Moombas getestet und habe festgestellt, wenn man in der DB weitere Einträge hinzufügt, gibt es einen Fehler mit der Array Dimension. Da ist scheinbar noch ein für das Array definierter Wert zu klein.
Mit dem Bereitgestellten von AspirinJunkie gibt es auf den ersten Blick kein Problem.
Hier ist meine Frage, wie kann ich den gelb markierten Abstand um das markierte vergrößern?
AutoIt
Alles anzeigen#AutoIt3Wrapper_UseX64=y #include <GUIConstantsEx.au3> #include <GUIConstants.au3> #include <Array.au3> #include <D:\Scripte\MS_AccessCom\Access UDF\Access_UDF.au3> ; zum leichteren Zugriff auf die Attribute im URL-Array Global Enum $eID, $eName, $eURL, $eGUI Global $dbname, $tblname001 ;--------- MSAccess DB ------------ $dbname = @ScriptDir & "\Data.accdb" $tblname001 = "Websites" Global $Connection = _Start_Connection($dbname & ";") Global $aURLArray = _Get_Records("SELECT * FROM " & $tblname001 & " Order By ID ASC " & ";"); ;Order By Sortierung ASC _Close_Connection() IF _ArrayMax($aURLArray, 0, 1) = "" Then Exit Else ;MsgBox(0,"1",$URL_Array[1][0]) EndIf ; aus dem Array abgeleitete Parameter Global $nEntries = UBound($aURLArray, 1) - 1 ; Layout-Parameter (Größen und Abstände der Buttons) Global $iCols = 3, _ ; Anzahl der Spalten der Buttons $iRows = Ceiling($nEntries / $iCols), _ ; Anzahl der Zeilen der Buttons $iButtonWidth = 140, _ ; Breite eines Buttons $iButtonHeight = 25, _ ; Höhe eines Buttons $iButtonXStep = 15, _ ; horizontaler Abstand der Buttons $iButtonYStep = 15, _ ; vertikaler Abstand der Buttons $iGUIWidth = $iButtonXStep + $iCols * ($iButtonWidth + $iButtonXStep), _ ; Breite des GUI $iGUIHeight = $iButtonYStep + $iRows * ($iButtonHeight + $iButtonYStep) ; Höhe des GUI ; das GUI erstellen Opt("GUIOnEventMode", 1) $GUI = GUICreate("Website AutoLogin " & FileGetVersion(@ScriptName), $iGUIWidth, $iGUIHeight) GUISetOnEvent($GUI_EVENT_CLOSE, _raus) ; Das Array durchgehen und die Buttons erstellen Global $iPosX, $iPosY, $iButtonX, $iButtonY For $i = 1 To $nEntries ; die Koordinaten des Buttons in der Button-Matrix $iPosX = Mod($i - 1, $iCols) $iPosY = Ceiling($i / $iCols) - 1 ; die GUI-Koordinaten des Buttons $iButtonX = $iButtonXStep + $iPosX * ($iButtonWidth + $iButtonXStep) $iButtonY = $iButtonYStep + $iPosY * ($iButtonHeight + $iButtonYStep) ; Den Button selbst erstellen GUICtrlCreateButton($aURLArray[$i][$eName], $iButtonX, $iButtonY, $iButtonWidth, $iButtonHeight) ; Verknüpfe Button mit Funktion _search GUICtrlSetOnEvent(-1, _search) Next ; GUI anzeigen GUISetState(@SW_SHOW) ; Endlosschleife um GUI am Leben zu halten Do Sleep(100) Until 0 ; eigene Funktion, welche beim Klick auf einen Button ausgelöst wird Func _search() Local $sName = GUICtrlRead(@GUI_CtrlId) Local $iPos = _ArraySearch($aURLArray, $sName, 1, 0, 1, 0, 0, $eName) Local $sURL = $aURLArray[$iPos][$eURL] MsgBox(0,"Array Position", "Element: " & $sName & @CRLF & "Position: " & $iPos & @CRLF & "URL: " & $sURL) EndFunc ; Funktion zum Beenden des GUI Func _raus() Exit EndFunc
-
Zeile 43 ($iGUIHeight) und Zeile 60 ($iButtonY) bspw. + 50 ergänzen, fertig.
Aber du willst den Platz sicherlich für irgendwas nutzen, richtig?
Viele Grüße
Sven -
gmmg Yepp, in Zeile 23 (bei meinem letzten Script) bitte ersetzen: Global $ButtonRows = Ceiling((Ubound($DBTESTARRAY) -1)/ $ButtonCols) .
Wegen deiner Frage zu dem von AspirinJunkie: Gar nicht, zumindest nicht ohne gleichzeitig die Abstände aller Buttons zueinander zu ändern, da er das hier komplett auf Gleichmäßigkeit gelegt hat.Meine Aussage war falsch, Siehe Antwort von SolveSmart
Bei meinem Code kannst du bei folgendem Code:
Einfach die 30 durch was anderes ersetzen.
-
Wegen deiner Frage zu dem von AspirinJunkie: Garnicht, zumindest nicht ohne gleichzeitig die Abstände aller Buttons zueinander zu ändern.
Genau, siehe Antwort #26.
-
Genau, siehe Antwort #26.
Stimmt Zeile 60 würde sich hier anbieten, diesen um einen $Offset zu erweitern:
AutoIt;Zeile 44-45: Global Const $XOffset = 30 Global Const $YOffset = 30 ;Zeile 59-60: $iButtonX = $iButtonXStep + $iPosX * ($iButtonWidth + $iButtonXStep) + ($XOffset - $iButtonXStep) ; Falls man die 15 die schon gesetzt sin mit beachten will, sonst $iButtonY = $iButtonYStep + $iPosY * ($iButtonHeight + $iButtonYStep) + ($YOffset - $iButtonYStep) ; das - des Buttonstep weg lassen
-
Wow bin stolz auf mich, dass mein Code offensichtlich autoplausibel ist, dass auch andere ihn sofort anpassen können.
Ich hab das ganze jetzt mal so umgesetzt, dass man direkt den Rand frei selbst definieren kann:
AutoIt
Alles anzeigen#include <Array.au3> #include <GUIConstantsEx.au3> ; zum leichteren Zugriff auf die Attribute im URL-Array Global Enum $eID, $eName, $eURL, $eGUI ; Das Eingabearray Global $aURLArray[][4] = [["ID", "Name", "URL", "GUI"], [1,"AutoIt","www.autoit.de", 0], [2,"Heise","www.heise.de", 1], [3,"Test1","www.test1.de", 0], [4,"Test2","www.test2.de", 0], [5,"Test3","www.test3.de", 0], [6,"Test4","www.test4.de", 0], [7,"Test5","www.test5.de", 1], [8,"Test6","www.test6.de", 0], [9,"Test7","www.test7.de", 0]] ; aus dem Array abgeleitete Parameter Global $nEntries = UBound($aURLArray, 1) - 1 ; Layout-Parameter (Größen und Abstände der Buttons) Global $iCols = 3, _ ; Anzahl der Spalten der Buttons $iRows = Ceiling($nEntries / $iCols), _ ; Anzahl der Zeilen der Buttons $iButtonWidth = 80, _ ; Breite eines Buttons $iButtonHeight = 25, _ ; Höhe eines Buttons $iButtonXStep = 20, _ ; horizontaler Abstand der Buttons $iButtonYStep = 20, _ ; vertikaler Abstand der Buttons $iMarginT = 75, _ ; Dicke des oberen Randes um die Button-Matrix $iMarginB = 15, _ ; Dicke des unteren Randes um die Button-Matrix $iMarginL = 15, _ ; Dicke des linken Randes um die Button-Matrix $iMarginR = 15, _ ; Dicke des rechten Randes um die Button-Matrix $iGUIWidth = $iMarginL + $iMarginR + $iCols * $iButtonWidth + ($iCols - 1) * $iButtonXStep, _ ; Breite des GUI $iGUIHeight = $iMarginT + $iMarginB + $iRows * $iButtonHeight + ($iRows - 1) * $iButtonYStep ; Höhe des GUI ; das GUI erstellen Opt("GUIOnEventMode", 1) $GUI = GUICreate("Website AutoLogin " & FileGetVersion(@ScriptName), $iGUIWidth, $iGUIHeight) GUISetOnEvent($GUI_EVENT_CLOSE, _raus) ; Das Array durchgehen und die Buttons erstellen Global $iPosX, $iPosY, $iButtonX, $iButtonY For $i = 1 To $nEntries ; die Koordinaten des Buttons in der Button-Matrix $iPosX = Mod($i - 1, $iCols) $iPosY = Ceiling($i / $iCols) - 1 ; die GUI-Koordinaten des Buttons $iButtonX = $iMarginL + $iPosX * ($iButtonWidth + $iButtonXStep) $iButtonY = $iMarginT + $iPosY * ($iButtonHeight + $iButtonYStep) ; Den Button selbst erstellen GUICtrlCreateButton($aURLArray[$i][$eName], $iButtonX, $iButtonY, $iButtonWidth, $iButtonHeight) ; Verknüpfe Button mit Funktion _search GUICtrlSetOnEvent(-1, _search) Next ; GUI anzeigen GUISetState(@SW_SHOW) ; Endlosschleife um GUI am Leben zu halten Do Sleep(100) Until 0 ; eigene Funktion, welche beim Klick auf einen Button ausgelöst wird Func _search() Local $sName = GUICtrlRead(@GUI_CtrlId) Local $iPos = _ArraySearch($aURLArray, $sName, 1, 0, 1, 0, 0, $eName) Local $sURL = $aURLArray[$iPos][$eURL] MsgBox(0,"Array Position", "Element: " & $sName & @CRLF & "Position: " & $iPos & @CRLF & "URL: " & $sURL) EndFunc ; Funktion zum Beenden des GUI Func _raus() Exit EndFunc
-
Ihr seit super
schau ich mir dann morgen genauer an.
-
Wow bin stolz auf mich, dass mein Code offensichtlich autoplausibel ist, dass auch andere ihn sofort anpassen können.
😄 👌
Zum Code:
Wie immer tadellos, sogar mit deutschen Kommentaren. Mal sehen ob ich mir dies irgendwann mal als Beispiel nehmen kann 😅 .
Kleine Ausnahme: $eID wird nicht verwendet.Viele Grüße
Sven -
Guten Morgen zusammen,
ich möchte gern eine zweite GUI einbinden. Das klappt auch soweit.
Nun zum Problem, wie bekomme ich das hin das ich die zweite GUI wieder schließen kann bzw. die Elemente der GUI reagieren.
AutoIt
Alles anzeigen#AutoIt3Wrapper_UseX64=y #include <GUIConstantsEx.au3> #include <GUIConstants.au3> #include <Array.au3> #include <D:\Scripte\MS_AccessCom\Access UDF\Access_UDF.au3> Global $dbname, $tblname001 ; zum leichteren Zugriff auf die Attribute im URL-Array Global Enum $eID, $eName, $eURL, $eGUI ;--------- MSAccess DB ------------ $dbname = @ScriptDir & "\Data.accdb" $tblname001 = "Websites" Global $Connection = _Start_Connection($dbname & ";") Global $aURLArray = _Get_Records("SELECT * FROM " & $tblname001 & " Order By ID ASC " & ";"); ;Order By Sortierung ASC _Close_Connection() IF _ArrayMax($aURLArray, 0, 1) = "" Then Exit Else ;MsgBox(0,"1",$URL_Array[1][0]) EndIf ; aus dem Array abgeleitete Parameter Global $nEntries = UBound($aURLArray, 1) - 1 ; Layout-Parameter (Größen und Abstände der Buttons) Global $iCols = 3, _ ; Anzahl der Spalten der Buttons $iRows = Ceiling($nEntries / $iCols), _ ; Anzahl der Zeilen der Buttons $iButtonWidth = 150, _ ; Breite eines Buttons $iButtonHeight = 25, _ ; Höhe eines Buttons $iButtonXStep = 15, _ ; horizontaler Abstand der Buttons $iButtonYStep = 15, _ ; vertikaler Abstand der Buttons $iMarginT = 35, _ ; Dicke des oberen Randes um die Button-Matrix $iMarginB = 20, _ ; Dicke des unteren Randes um die Button-Matrix $iMarginL = 20, _ ; Dicke des linken Randes um die Button-Matrix $iMarginR = 20, _ ; Dicke des rechten Randes um die Button-Matrix $iGUIWidth = $iMarginL + $iMarginR + $iCols * $iButtonWidth + ($iCols - 1) * $iButtonXStep, _ ; Breite des GUI $iGUIHeight = $iMarginT + $iMarginB + $iRows * $iButtonHeight + ($iRows - 1) * $iButtonYStep ; Höhe des GUI ; GUI erstellen Opt("GUIOnEventMode", 1) $GUI = GUICreate("Website AutoLogin " & FileGetVersion(@ScriptName), $iGUIWidth, $iGUIHeight) GUISetOnEvent($GUI_EVENT_CLOSE, _raus) ; Das Array durchgehen und die Buttons erstellen Global $iPosX, $iPosY, $iButtonX, $iButtonY For $i = 1 To $nEntries ; die Koordinaten des Buttons in der Button-Matrix $iPosX = Mod($i - 1, $iCols) $iPosY = Ceiling($i / $iCols) - 1 ; die GUI-Koordinaten des Buttons $iButtonX = $iMarginL + $iPosX * ($iButtonWidth + $iButtonXStep) $iButtonY = $iMarginT + $iPosY * ($iButtonHeight + $iButtonYStep) ; Den Button selbst erstellen GUICtrlCreateButton($aURLArray[$i][$eName], $iButtonX, $iButtonY, $iButtonWidth, $iButtonHeight) ; Verknüpfe Button mit Funktion _search GUICtrlSetOnEvent(-1, _search) Next ; GUI anzeigen GUISetState(@SW_SHOW) ; Endlosschleife um GUI am Leben zu halten Do Sleep(100) Until 0 ; eigene Funktion, welche beim Klick auf einen Button ausgelöst wird Func _search() Local $sName = GUICtrlRead(@GUI_CtrlId) Local $iPos = _ArraySearch($aURLArray, $sName, 1, 0, 1, 0, 0, $eName) Local $sURL = $aURLArray[$iPos][$eURL] Local $sGUI = $aURLArray[$iPos][$eGUI] IF $sGUI = 1 Then ; Abfrage ob bei GUI 1 oder 0 Steht, bei 1 erzeuge zweite GUI MsgBox(0,"info", "erzeuge Sub GUI") _secGUI() Else MsgBox(0,"Array Position", "Element: " & $sName & @CRLF & "Position: " & $iPos & @CRLF & "URL: " & $sURL) EndIf EndFunc ; Funktion zum Beenden des GUI Func _raus() Exit EndFunc Func _secGUI() $secGUI = GUICreate("Login", 200, 160) GUISetBkColor(0xC0C0B2) GUICtrlCreateLabel("Agenturnummer:", 15, 15, 80, 20) ;_get_logins() $secCombo = GUICtrlCreateCombo("", 15, 35, 150, 20) ; create first item ;GUICtrlSetData($Combo, "|" & $String, "") $secButton = GUICtrlCreateButton("Login", 50, 120, 73, 25) GUISetState(@SW_SHOW) While 1 ;GUISetOnEvent($GUI_EVENT_CLOSE, _raus) ; fubnktioniert in der While Schleife auch nicht $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $secButton MsgBox(0,"","Button Test") EndSwitch WEnd EndFunc
Danke
Gruß Marcel
-
Naja da sind ja beide GUI-Konzepte vermischt. Die äußere nutzt den OnEvent-Modus und die innere den Message-Loop-Modus.
Jetzt kannst du eine von beiden in die jeweils andere Form überführen (bei Message-Loop die Funktion GuiSwitch nicht vergessen).
Oder du schaltest den Modus jeweils um.
Beispiel wie du deine Funktion _secGUI anpassen könntest:AutoIt
Alles anzeigenFunc _secGUI() ; alten Wert von OnEvent merken Local $oldOnEvent = Opt("GUIOnEventMode") ; auf Message-Loop-Modus umschalten Opt("GUIOnEventMode", 0) ; zweite GUI erzeugen Local $secGUI = GUICreate("FTI - Login", 200, 160) GUISetBkColor(0xC0C0B2) GUICtrlCreateLabel("Agenturnummer:", 15, 15, 80, 20) $secCombo = GUICtrlCreateCombo("", 15, 35, 150, 20) ; create first item $secButton = GUICtrlCreateButton("Login", 50, 120, 73, 25) GUISetState(@SW_SHOW) ; Message-Loop-Endlosschleife Do Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop ; NICHT Exit! Case $secButton MsgBox(0,"","Button Test") EndSwitch Until 0 ; das temporäre GUI löschen GUIDelete($secGUI) ; wieder zum vorherigen GUI-Modus wechseln (hier ist es OnEvent) Opt("GUIOnEventMode", $oldOnEvent) ; wieder zum äußeren GUI wechseln (nicht unbedingt nötig bei OnEvent) GUISwitch($GUI) EndFunc
-
Danke
-
Kannst du das nicht auch ohne Switch machen?
Das müsste ohne die Art und Weise zu ändern doch so gehen (Achtung wirklich kein schöner Code, nur zur Veranschaulichung):AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> Global $MainGUI, $SecGUI Example() Func Example() Opt("GUICoordMode", 2) Opt("GUIResizeMode", 1) Opt("GUIOnEventMode", 1) $MainGUI = GUICreate("Parent1") GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents") GUICtrlCreateButton("Second GUI", 10, 30, 50) GUICtrlSetOnEvent(-1, "OKPressed") GUISetState(@SW_SHOW) ; Just idle around While 1 Sleep(10) WEnd EndFunc ;==>Example Func OKPressed() $SecGUI = GUICreate("Second") GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents") GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents") GUICtrlCreateButton("Cancel", 0, -1) GUICtrlSetOnEvent(-1, "CancelPressed") GUISetState(@SW_SHOW) EndFunc ;==>OKPressed Func CancelPressed() GUIDelete(@GUI_WinHandle) EndFunc ;==>CancelPressed Func SpecialEvents() Select Case @GUI_CtrlId = $GUI_EVENT_CLOSE if @GUI_WinHandle = $MainGUI then Exit Else GUIDelete(@GUI_WinHandle) Endif Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE MsgBox($MB_SYSTEMMODAL, "Window Minimized", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) Case @GUI_CtrlId = $GUI_EVENT_RESTORE MsgBox($MB_SYSTEMMODAL, "Window Restored", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle) EndSelect EndFunc ;==>SpecialEvents
Sprich, du könntest immer im onevent mode bleiben.
-
Moombas Danke für die Antwort. Schau ich mir auch an.
Will aber vorher noch das Auslesen der Daten aus der DB für die zweite GUI einbauen.
Allen schon mal einen schönen Feiertag
Gruß Marcel
-
Hallo Zusammen,
wie kann ich es am Besten lösen, dass wenn ich String 1 oder String 2 für eine Combobox in der Funktion benötige?
Mein Gedanke war jetzt in der DB ein Feld hinzuzufügen und dann mit einen numerischen Wert zu füllen, den ich dann der Funktion übergebe und in einer IF Abfrage nutzen kann.
AutoIt
Alles anzeigenFunc _get_logins() For $i = 1 to UBound($aDataArray) -1 If Not @error Then ;MsgBox(0,"",$sDisplayName) $String &= $aDataArray[$i][0] & "|" ;String 1 für combobox $String &= $aDataArray[$i][1] & " *** " & $aDataArray[$i][2] & "|" ;String 2 für combobox EndIf Next $String = $String ;MsgBox (0,"",$String) EndFunc
Gruß Marcel
-
Ich frage jetzt in der If Schleife den Button Name ab. Das sollte mir für den Zweck ausreichen.
AutoIt
Alles anzeigenFunc _get_logins() For $i = 1 to UBound($aDataArray) -1 If Not @error Then ;MsgBox(0,"",$sDisplayName) IF $sName = "Button-xyz" Then $String &= $aDataArray[$i][1] & " *** " & $aDataArray[$i][2] & "|" ;String 2 für combobox Else $String &= $aDataArray[$i][0] & "|" ;String 1 für combobox EndIf EndIf Next ;$String = $String ;MsgBox (0,"",$String) EndFunc
-
Aber $sName wird doch nie gefüllt.
Auch Zeile 15 macht keinen Sinn.
-