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.
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?
#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
Alles anzeigen
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:
;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:
#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
Alles anzeigen
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.
#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
Alles anzeigen
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:
Func _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
Alles anzeigen
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):
Opt('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
Alles anzeigen
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.
Func _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
Alles anzeigen
Gruß Marcel
Ich frage jetzt in der If Schleife den Button Name ab. Das sollte mir für den Zweck ausreichen.
Func _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
Alles anzeigen
Aber $sName wird doch nie gefüllt.
Auch Zeile 15 macht keinen Sinn.
Ok, bin immer kein großer freund (außer bei GUI) von globalen Variablen und aus "geisterhand" wird eine solche geändert/verwendet.