SOLVE-SMART : Sollte man das nicht eher anhand der Nutzung machen (https://de.statista.com/statistik/date…und%20Tablets).)?
Also prio: 1. Chrome, 2. Edge, 3. Firefox
SOLVE-SMART : Sollte man das nicht eher anhand der Nutzung machen (https://de.statista.com/statistik/date…und%20Tablets).)?
Also prio: 1. Chrome, 2. Edge, 3. Firefox
Ok, bin immer kein großer freund (außer bei GUI) von globalen Variablen und aus "geisterhand" wird eine solche geändert/verwendet.
Aber $sName wird doch nie gefüllt.
Auch Zeile 15 macht keinen Sinn.
@Bi-Nu: Gerade getestet am privaten PC (W11) mit meinem privaten (unmanaged) Smartphone: Keine Akkustatusanzeige o.ä.
Und ich bekomme dort auch keine Daten zum Powerstate.
Ggf. nicht, weil es ein verwaltetes Gerät ist
Aber das Prinzip soll nur zeigen wie du ggf. an die Infos kommst: per powershell was du wiederum über autoit dann ausführen kannst
Über PS das richtige Gerät finden (bei mir ein Nokia 5.3, der freindlyname muss komplett bekannt sein) und die Daten dazu auswerfen:
get-pnpdevice -class usbdevice -friendlyname 'Nokia 5.3' | Select-object -Property InstanceId | Get-pnpdeviceproperty
Teste mal bitte welche Daten für dein Windowsphone hier zurück kommen, da sich meine Geräte unterschiedlich verhalten und Android hier keinen Akkustand mit zurückgibt und ich (zum Glück) kein Windows Phone hier habe.
Im Prinzip musst du mit Win32_PortableBattery arbeiten, ich habe aber aktuell noch nichts gefunden diese in PS oder autoit aufzurufen.
SOLVE-SMART : Hast doch mit deinem Link geholfen. Mit den Rückgabewerten der Funktion lässt sich über Monitoring das durchaus bewerkstelligen.
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.
Update2: Für was brauchst du die Info? Wenn du ein Smartphone an den Rechner/Laptop anschließt, ist es doch immer Battery/Akku als Quelle oder nicht?
Wenn man deinen Link sich anschaut, gibt es da garnicht so viele Möglcihkeiten für Power-Source (AC und Battery), dann nur mit mehr jeweiligen Hintergrundinfos z.B. ob das Gerät gerade geladen wird oder nicht etc..
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
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.
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.
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.
Im Prinzip müsstest du das so können (konzentriere mich nur auf den Search):
Case 1 To $Button1[$Button1[0]]
If _Search2($DBTESTARRAY, $msg, 3) = 1 then _Create_GUI_2()
Shellexecute(_Search($2DArrayWithButtonData, $msg))
;....
Func _search2($aArray, $ID, $Col)
Local Const $Row = _ArraySearch($aArray, GUICtrlRead($ID), 0, 0, 0, 1, 0, Default, False)
Return $aArray[$Row][$Col]
EndFunc
Auch wenn AspirinJunkie hier die wohl bessere Variante gepostet hat, möchte ich meine angepasste (mit der Test DB als Array) hier nochmal kurz anbringen :
Opt('MustDeclareVars', 1)
#AutoIt3Wrapper_UseX64=y
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <Array.au3>
;~ #include <D:\Scripte\MS_AccessCom\Access UDF\Access_UDF.au3>
Global $URL_Array_pos
Global $msg, $GUI1, $Button1[1] = [0]
Global Const $ButtonCols = 3
Global $DBTESTARRAY[10][4] = [['ID', 'Name', 'URL', 'GUI'], _
[ 1, 'Autoit', 'www.Autoit.de', 0], _
[ 2, 'Heise' , 'www.Heise.de' , 1], _
[ 3, 'Test 1', 'www.test1.de' , 0], _
[ 4, 'Test 2', 'www.test2.de' , 0], _
[ 5, 'Test 3', 'www.test3.de' , 0], _
[ 6, 'Test 4', 'www.test4.de' , 0], _
[ 7, 'Test 5', 'www.test5.de' , 1], _
[ 8, 'Test 6', 'www.test6.de' , 0], _
[ 9, 'Test 7', 'www.test7.de' , 0]]
Global $ButtonRows = Ceiling((Ubound($DBTESTARRAY) -1)/ $ButtonCols)
Global $2DArrayWithButtonData[$ButtonRows][$ButtonCols] ;= [['www.AutoIt.de','www.Heise.de','www.test1.de'],['www.test2.de','www.test3.de','www.test4.de'], ['www.test5.de','www.test6.de','www.test7.de']] ; Texte
_Data2Array($DBTESTARRAY)
_GUI_1_Create()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_MINIMIZE
Case $GUI_EVENT_CLOSE
Exit
Case 1 To $Button1[$Button1[0]]
Shellexecute(_Search($2DArrayWithButtonData, $msg))
EndSwitch
WEnd
Func _GUI_1_Create()
Local $ID
Local Const $BWidth = 130
Local Const $BHeight = 25
Local Const $iCols = Ubound($2DArrayWithButtonData, $UBOUND_COLUMNS)
Local Const $iRows = Ubound($2DArrayWithButtonData, $UBOUND_ROWS)
Local Const $aCols = [2, 30, 140]
Local Const $aRows = [2, 30, 40]
$GUI1 = GUICreate("Website AutoLogin " & FileGetVersion(@ScriptName), 474, 257)
#Region ### Create Button dynamisch
For $Col = 1 to $iCols
For $Row = 1 to $iRows
If $2DArrayWithButtonData[$Row - 1][$Col - 1] <> '' then
$ID = GUICtrlCreateButton(StringSplit($2DArrayWithButtonData[$Row - 1][$Col - 1], '.')[2], $aCols[1] + (($Col-1)*$aCols[2]), $aRows[1] + (($Row-1)*$aRows[2]), $BWidth, $BHeight)
_ArrayAdd($Button1, $ID, $Button1[0])
EndIf
Next
Next
$Button1[0] = UBound($Button1) - 1
;~ _ArrayDisplay($Button1)
;~ _ArrayDisplay($2DArrayWithButtonLink)
#EndRegion ### Create Button
GUISetState(@SW_SHOW)
EndFunc
Func _Data2Array($aData)
Local $Colcounter = 0, $RowCounter = 0
Local Const $Col = _ArraySearch($aData, 'URL', Default, Default, Default, Default, Default, Default, True)
Local Const $Rows = Ubound($aData) - 1
_ArrayDisplay($aData)
For $Row = 1 to $Rows
$2DArrayWithButtonData[$RowCounter][$Colcounter] = $aData[$Row][$Col]
$Colcounter += 1
If $Colcounter >= $ButtonCols Then
$Colcounter = 0
$RowCounter += 1
Endif
Next
EndFunc
Func _search($aArray, $ID)
Local Const $Col = _ArraySearch($aArray, GUICtrlRead($ID), 0, 0, 0, 1, 0, Default, True)
Local Const $Row = _ArraySearch($aArray, GUICtrlRead($ID), 0, 0, 0, 1, 0, Default, False)
Return $aArray[$Row][$Col]
EndFunc
Alles anzeigen
Das Problem ist das du dein Array mit den Daten aus der DB erst in das andere Umschreiben musst und nicht direkt verwenden kannst.
Das liegt daran, das dies nicht vorgesehen ist.
Ich habe es so gemacht, das der erste Button auf 30, 30 gesetzt wird und dann immer 140 dazu addiert werden, halt dynamisch die Positionen gesetzt werden. Warum solltest du auf einmal bei 2 Anfangen?
Wenn das so ist (also immer), muss ein Offset eingetragen werden.
Also soll das immer bei 2 anfangen? oder gar variabel sein?
Ich denke das das bei meiner Variant nicht möglich wäre.
Ich denke eher das du dann die entsprechenden Daten im $2DArrayWithButtonData beim Befüllen behandeln musst.
Im Prinzip könntest du sogar auf den Anzeige Text verzichten und nur den Link angeben in dem 2D Array.
Den Anzeigetext, würde ich dann per StringSplit() extrahieren und somit nur 1 zu pflegendes Array ergeben:
Opt('MustDeclareVars', 1)
#AutoIt3Wrapper_UseX64=y
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <Array.au3>
;~ #include <D:\Scripte\MS_AccessCom\Access UDF\Access_UDF.au3>
Global $URL_Array_pos
Global $msg, $GUI1, $Button1[1] = [0]
Global Const $2DArrayWithButtonData[3][3] = [['www.AutoIt.de','www.Heise.de','www.test1.de'],['www.test2.de','www.test3.de','www.test4.de'], ['www.test5.de','www.test6.de','www.test7.de']] ; Texte
_GUI_1_Create()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_MINIMIZE
Case $GUI_EVENT_CLOSE
Exit
Case 1 To $Button1[$Button1[0]]
Shellexecute(_Search($msg))
EndSwitch
WEnd
Func _GUI_1_Create()
Local $ID
Local Const $Offset = 0
Local Const $BWidth = 130
Local Const $BHeight = 25
Local Const $iCols = Ubound($2DArrayWithButtonData, $UBOUND_COLUMNS)
Local Const $iRows = Ubound($2DArrayWithButtonData, $UBOUND_ROWS)
Local Const $aCols = [2, 30, 140]
Local Const $aRows = [2, 30, 40]
$GUI1 = GUICreate("Website AutoLogin " & FileGetVersion(@ScriptName), 474, 257)
#Region ### Create Button dynamisch
For $Col = 1 to $iCols
For $Row = 1 to $iRows
If $2DArrayWithButtonData[$Row - 1][$Col - 1] <> '' then
$ID = GUICtrlCreateButton(StringSplit($2DArrayWithButtonData[$Row - 1][$Col - 1], '.')[2], $aCols[1] + (($Col-1)*$aCols[2]), $aRows[1] + (($Row-1)*$aRows[2]), $BWidth, $BHeight)
_ArrayAdd($Button1, $ID, $Button1[0])
EndIf
Next
Next
$Button1[0] = UBound($Button1) - 1
;~ _ArrayDisplay($Button1)
;~ _ArrayDisplay($2DArrayWithButtonLink)
#EndRegion ### Create Button
GUISetState(@SW_SHOW)
EndFunc
Func _search($ID)
Local Const $Col = _ArraySearch($2DArrayWithButtonData, GUICtrlRead($msg), 0, 0, 0, 1, 0, Default, True)
Local Const $Row = _ArraySearch($2DArrayWithButtonData, GUICtrlRead($msg), 0, 0, 0, 1, 0, Default, False)
Return $2DArrayWithButtonData[$Row][$Col]
EndFunc
Alles anzeigen
Das Shellexecute war nur zum Testen/veranschaulichen.
Auch musst du eine Access DB wieder einbinden und entsprechend die beiden Arrays (für die Namen bzw. Links) damit erstellen.