Gegenfrage: Wir kommt man darauf, dass man ein ToolBar-Control braucht?
Beiträge von Velted
-
-
Die von Dir verlinkte Beschreibung zu _GUICtrlToolbar_Create() enthält doch ein Beispiel. Wenn Du die Definition der AutoIt-Konstanten nicht findest, kannst Du stattdessen die numerischen Werte verwenden.
Aus
wird dann
und aus
wird
Die Bilder aus den anderen Listen kannst Du mit zusätzlichen Aufrufen von _GUICtrlToolbar_AddBitmap() laden, z.B.
für die View-Icons. Du musst dann aber den Rückhabewert der Funktion speichern, weil er als Offset für die View-Indices gebraucht wird, z.B.
für VIEW_DETAILS.
-
Toolbar Standard Button Image Index Values
Und dazu noch die Definitionen in CommCtrl.h:
Code
Alles anzeigen#define HINST_COMMCTRL ((HINSTANCE)-1) #define IDB_STD_SMALL_COLOR 0 #define IDB_STD_LARGE_COLOR 1 #define IDB_VIEW_SMALL_COLOR 4 #define IDB_VIEW_LARGE_COLOR 5 #define IDB_HIST_SMALL_COLOR 8 #define IDB_HIST_LARGE_COLOR 9 #if (NTDDI_VERSION >= NTDDI_VISTA) #define IDB_HIST_NORMAL 12 #define IDB_HIST_HOT 13 #define IDB_HIST_DISABLED 14 #define IDB_HIST_PRESSED 15 #endif // (NTDDI_VERSION >= NTDDI_VISTA) // icon indexes for standard bitmap #define STD_CUT 0 #define STD_COPY 1 #define STD_PASTE 2 #define STD_UNDO 3 #define STD_REDOW 4 #define STD_DELETE 5 #define STD_FILENEW 6 #define STD_FILEOPEN 7 #define STD_FILESAVE 8 #define STD_PRINTPRE 9 #define STD_PROPERTIES 10 #define STD_HELP 11 #define STD_FIND 12 #define STD_REPLACE 13 #define STD_PRINT 14 // icon indexes for standard view bitmap #define VIEW_LARGEICONS 0 #define VIEW_SMALLICONS 1 #define VIEW_LIST 2 #define VIEW_DETAILS 3 #define VIEW_SORTNAME 4 #define VIEW_SORTSIZE 5 #define VIEW_SORTDATE 6 #define VIEW_SORTTYPE 7 #define VIEW_PARENTFOLDER 8 #define VIEW_NETCONNECT 9 #define VIEW_NETDISCONNECT 10 #define VIEW_NEWFOLDER 11 #define VIEW_VIEWMENU 12 #define HIST_BACK 0 #define HIST_FORWARD 1 #define HIST_FAVORITES 2 #define HIST_ADDTOFAVORITES 3 #define HIST_VIEWTREE 4 #endif
Viele der zugehörigen AutoIt-Konstanten habe ich auf die Schnelle im Wirrwar der #Includes nicht gefunden.
-
-
Moin,
ich habe Dein Skript aus Beitrag #29 überarbeitet:
AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #include <wd_helper.au3> #include <wd_capabilities.au3> ;~ #include <Date.au3> ;Hotkey eingebaut zum beenden des Programms, da aktuell keine Bedingung zum Beenden vorhanden ist. HotKeySet("{ESC}", "beenden") Global Const $sMin1 = "28", $sMin2 = "58", $sMin3 = "43", $sStd3 = "15" Global $sStd, $sMin Global $oSession start() ; AdlibRegister('Adlib_ansage', $itime_adl) <<<<< wird nicht gebraucht While True $sMin = @MIN $sStd = @HOUR If ($sMin = $sMin1) Or ($sMin = $sMin2) Or (($sStd = $sStd3) And ($sMin = $sMin3)) Then Uhr_ansagen() ConsoleWrite("ANSAGE : " & $sStd & ":" & $sMin & " Uhr!" &@CRLF) ; wenn gewollt While (@MIN = $sMin) Sleep(1000) ; bis zur nächsten Minute schlafen WEnd Else Sleep(1000) ; um die Prozessorlast unten zu halten EndIf WEnd beenden() ;Variablen umsortiert (Deklarationen mittem im Code sind unschön) und eine Lokal gesetzt da außerhalb nicht genutzt Func start() Local Const $sLocalFilePath = @ScriptDir & '\talk.html' Local Const $sLocalFileURL = "file:///" & StringReplace($sLocalFilePath, "\", "/") Local $capsi = SetupEdge() $oSession = _WD_CreateSession($capsi) _WD_Navigate($oSession, $sLocalFileURL) Uhr_ansagen() ConsoleWrite('ANSAGE : ' & _NowTime() & 'Uhr PER START!!!!' & @CRLF) EndFunc ;==>start ;~ Func Adlib_ansage() ;~ Uhr_ansagen() ;~ ConsoleWrite('ANSAGE : ' & _NowTime() & 'Uhr PER ADLIB!!!!' & @CRLF) ;~ EndFunc ;==>Adlib_ansage Func Uhr_ansagen() Local $element = _WD_FindElement($oSession, 'xpath', '//*[@id="clockID"]') _WD_ElementAction($oSession, $element, 'Click') ;~ $iclick = True EndFunc ;==>Uhr_ansagen Func beenden() _WD_DeleteSession($oSession) _WD_Shutdown() ConsoleWrite('Script wurde Erfolgreich beendet.' & @CRLF) Exit EndFunc ;==>beenden ;Variablen umsortiert (Deklarationen mittem im Code sind unschön) und eine entfernt, da direkt über Return zurück gegeben werden kann Func SetupEdge() Local $hWnd _WD_UpdateDriver("msedge", @ScriptDir) _WD_Option('Driver', @ScriptDir & '\msedgedriver.exe') _WD_Option('Port', 9515) _WD_Startup() ; Startparameter sammeln _WD_CapabilitiesStartup() _WD_CapabilitiesAdd('alwaysMatch', 'msedge') _WD_CapabilitiesAdd('excludeSwitches', 'enable-automation') _WD_CapabilitiesAdd('args', 'guest') _WD_CapabilitiesDump(@ScriptLineNumber) _WD_CapabilitiesAdd('args', '--headless') $hWnd = WinWait("[CLASS:ConsoleWindowClass]", "", 10) WinSetState($hWnd, "", @SW_HIDE) Return _WD_CapabilitiesGet() EndFunc ;==>SetupEdge
Zeile 4 auskommentiert.
Zeile 11 eingefügt.
Zeilen 42 - 45 auskommentiert.
Zeile 50 auskommentiert.
Versuch mal, ob das fehlerfrei läuft.
Viel Glück,
Velted
-
-
Moin,
hier mal meine Idee zur Kernschleife, weil das Skript nur diese eine Aufgabe hat ohne AdlibRegister(). Anstelle der Funktionen aus der Date,au3 werden die Zeit-Makros genutzt.
AutoIt
Alles anzeigenGlobal Const $sMin1 = "28", $sMin2 = "58", $sMin3 = "43", $sStd3 = "15" Global $sStd, $sMin start() ; AdlibRegister('Adlib_ansage', $itime_adl) <<<<< wird nicht gebraucht While True $sMin = @MIN ; für den sehr unwahrscheinlichen Fall, dass sich die Werte während der folgenden Abfrage ändern $sStd = @HOUR ; für den sehr unwahrscheinlichen Fall, dass sich die Werte während der folgenden Abfrage ändern If ($sMin = $sMin1) Or ($sMin = $sMin2) Or (($sStd = $sStd3) And ($sMin = $sMin3)) Then Uhr_ansagen() ConsoleWrite("ANSAGE : " & $sStd & ":" & $sMin & " Uhr!" &@CRLF) ; wenn gewollt While (@MIN = $sMin) Sleep(1000) ; bis zur nächsten Minute schlafen WEnd Else Sleep(1000) ; um die Prozessorlast unten zu halten EndIf WEnd
-
Moin,
wenn ich Dein Skript unkompiliert laufen lasse, bekomme ich folgenden Fehler:
Code"D:\AutoIt_Neu\Base32\test32base.au3" (192) : ==> Variable used without being declared.: For $i = 0 to UBound($_BASE32_DECODE_TABLE)-1 For $i = 0 to UBound(^ ERROR
Wenn das auch Dein Fehler ist, liegt es wahrscheinlich daran, dass Du die Zeilen
CodeConst $BASE32CHARS ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Local $_BASE32_DECODE_TABLE[128] Local $BASE32_INIT = 0
nach unten verlegt hast. Die Funktion _Base32_BuildTable() wird damit aufgerufen, bevor die Variablen irgendwo im Niemandsland zwischen den Funktionen deklariert werden. Wenn ich die Zeilen nach oben schiebe, hat sich dieses Problem hier erledigt.
Edit: Ich ziehe die Frage zurück!
Frage an Alle: Ist es gewollt, dass AutoIt Variablendeklarationen erst dann ausführt, wenn der Ablauf des Skripts die Deklarationszeilen erreicht? -
Moin!
Nur als weitere Alternative: Du kannst die Start/Stop-Routine in eine eigenen Funktion auslagern, die dann solwohl per Button als auch per Hotkey aufgerufen werden kann:
AutoIt
Alles anzeigenGlobal $End, $Timer, $Running = False, $Input[3] Global $Name[3] = ['Stunden', 'Minuten', 'Sekunden'] Global $Button[2] = ['Start', 'Stop'] GUICreate('Timer', 220, 70, Default, Default, 0x10C80000) For $I = 0 To 2 GUICtrlCreateGroup($Name[$I], 5 + 70 * $I, 5, 70, 40) $Input[$I]=GUICtrlCreateInput('0', 10 +70 * $I, 20, 60, 20, 0x2001) ; ES_CENTER + ES_NUMBER Next $Go = GUICtrlCreateButton('Start', 5, 45, 210, 20) GUISetState() HotKeySet("{F7}", "_StartStop") While True Switch GUIGetMsg() Case -3 ; $GUI_EVENT_CLOSE Exit Case $Go _StartStop() Case Else If $Running And TimerDiff($Timer) >= $End Then _StartStop() EndIf EndSwitch WEnd Func _StartStop() $running = Not $running GUICTRLSETDATA($GO, $BUTTON[$RUNNING]) If $Running = False Then MsgBox(0, 'Info', 'Game Over') Else $End = _Convert($Input) $Timer = TimerInit() EndIf EndFunc Func _Convert($Array) Return ((GUICtrlRead($Array[0]) * 3600) + (GUICtrlRead($Array[1]) * 60) + GUICtrlRead($Array[2])) * 1000 EndFunc
Zitat(Dein Style macht irgendwie keinen Sinn (es gibt kein Flag, das 0x00C80000 enthält), daher hab ich es mal geändert)
AutoItGlobal Const $WS_CAPTION = 0x00C00000 Global Const $WS_SYSMENU = 0x00080000 Global Const $WS_OVERLAPPEDWINDOW = BitOR($WS_CAPTION, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_OVERLAPPED, $WS_SYSMENU, $WS_THICKFRAME)
0x00C8000 entspricht damit $WS_OVERLAPPEDWINDOW - $WS_MAXIMIZEBOX - $WS_MINIMIZEBOX - $WS_THICKFRAME - $WS_OVERLAPPED (0).
-
ich danke für Eure Bemühungen. Ich habe das tatsächliche Problem erst nachträglich erkannt. Ich dachte, wenn ein Array in einem Element eines eindimensionalen Arrays abgelegt wird, ergibt das ein zweidimensionales Array. Das ist aber offensichtlich nicht so. Der Klammerbeutel wird ja auch in der Hilfedatei als offizielle Methode für den direkten Zugriff aufgeführt. Mein Fehler!
Wie ich es jetzt verstehe, lautet ursprüngliche Problem: "ListView-Inhalt in 2-dimensionales Array ausgeben". Ich musste dabei wieder einmal feststellen, dass man mit den 'eingebauten' GUI-Funktionen nicht weit kommt, wenn man nicht jede ID der mit GUICtrlCreateListViewItem() erstellten Items speichert. Die mit der AutoIt3.exe gelieferten GUI-Funktionen sind auch hier recht ärmlich. Warum man ein ListView-Item nicht über den Index ansprechen kann, bleibt das Geheimnis des Programmierers.
Gott sei Dank gibt es aber für diesen speziellen Fall die ControlListView() Funktionen. Damit kann man sich auch ohne UDF's ohne großen Programmieraufwand ein 2-D-Array aus dem ListView erstellen:
AutoIt
Alles anzeigenFunc _GUICtrlListView_GetTextArray($idLV) Local $hLV = GUICtrlGetHandle($idLV) Local $iRows = ControlListView("", "", $hLV, "GetItemCount") Local $iCols = ControlListView("", "", $hLV, "GetSubItemCount") Local $aText[$iRows][$iCols] For $I = 0 To $iRows - 1 For $J = 0 To $iCols - 1 $aText[$I][$J] = ControlListView("", "", $hLV, "GetText", $I, $J) Next Next Return $aText EndFunc ;==>_GUICtrlListView_GetTextArray
Ich habe nicht geprüft, ob das so schon anderswo eingestellt wurde. Falls ich eine andere 'eingebaute' Alternative übersehen habe, zeigt sie mir bitte.
-
Moin,
kann mir jemand erklären, wofür man diese "Klammernotation" im Zusammenhang mit mehrdimensinalen Arrays brauchen soll? Wenn ich in einem zweidimansionalen Array auf ein bestimmtes Element zugreifen will, brauche ich einen "Zeilenindex" für die erste Dimension und einen "Spaltenindex" für die zweite. Sämtliche Zugriffe auf ein solches Element klappen dann mit: $aArray[$iZeilenIndex][$iSpaltenindex], egal ob lesend oder schreibend. Die Indices müssen allerdings gültig sein.
Will man das Ganze als Schleife verarbeiten, kann man zwei geschachtelte Schleifen nutzen, z.B
AutoItFor $iZeilenIndex = 0 To UBound($aArray, 1) - 1 ; erste Dimension For $iSpaltenIndex = 0 To UBound($aArray, 2) - 1 ; zweite Dimension MsgBox(0, "Test", "$aArray[" & $iZeilenIndex & "][" & $iSpaltenIndex & "] = " & $aArray[$iZeilenIndex][$iSpaltenIndex] Next Next
Deshalb meine Empfehlung: Bei reinen mehrdimensionalen Arrays den Klammerbeutel im Schrank lassen.
-
Moin Moombas,
$GUI_INDETERMINATE gehört zum Checkboxstil BS_3STATE bzw. BS_AUTO3STATE
-
Moin,
ich hätte nicht damit gerechnet, dass $mM1 = GUICtrlCreateMenuItem("Menü1", -1) das Item direkt der Menüleiste zuweist. Das scheint aber nur dann zu funktionieren, wenn die Menüleiste bereits durch einen Aufruf von GUICtrlCreateMenu() erstellt/initialisiert wurde. Nachdem man alle Items hinzugefügt hat, kann man dieses Menü allerdings wieder löschen:
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> $hGUI = GUICreate("Test", 500, 500) $mDummy = GUICtrlCreateMenu("") $mM1 = GUICtrlCreateMenuItem("Menü1", -1) $mM2 = GUICtrlCreateMenuItem("Menü2", -1) $mExit = GUICtrlCreateMenuItem("Exit", -1) GUICtrlDelete($mDummy) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $mExit Exit Case $mM1 MsgBox(0, "1", "I can be actioned!") Case $mM2 MsgBox(0, "2", "I can be actioned!") EndSwitch WEnd
-
-
Gibbet da irgendwo ein Buch wo sowas drin steht, oder muss man dazu sämtliche UDFs die es so gibbt auswendig kennen lach?
Moin,
das 'Buch' ist die AutoIt-Hilfe-Datei. In diesem Fall reicht es wohl, wenn man prüft, ob es im Abschnitt User Defined Functions Reference bei den Gui UDFs auch eine für ListBoxen gibt. Wenn ja, sollte ein Blick auf die Funktionskiste ausreichen.
Es ist auch immer wieder nützlich, sich die Microsoft Dokumentation der Windows Controls anzuschauen, wenn man wissen will, was theoretisch alles so geht.
-
Moin,
Du verwendest wohl AutoIt 32-Bit auf Windows 64-Bit. Bei 64-Bit Windows gibt es zwei Systemverzeichnisse:
System32 für die 64-Bit Anwendungen und SysWOW64 für die 32-Bit Anwendungen.
Wenn 32-Bit Anwendungen auf System32 zugreifen wollen, wird Ihnen stattdessen automatisch das Verzeichnis SysWOW64 untergeschoben. Für den Zugriff von 32-Bit Anwendungen auf das 64-Bit Systemverzeichnis gibt es den Aliasnamen SysNative.
-
Wo hast Du denn "die Control-ID, wie von einer GUICtrlCreate... Funktion zurückgegeben" gespeichert?
-
ControlID Die Identifikationsnummer des Controls (Control-ID), wie von einer GUICtrlCreate... Funktion zurückgegeben, oder -1 für das zuletzt erzeugte Control. -
UEZ ,
Das hat immerhin den drolligen Effekt, dass sich das Skript bei Ablauf der Zeit beendet. Ich habe ein Weilchen gerätselt, warum das passiert.
-
Moin,
Probleme mit bzw. ohne ConsoleWrite konnte ich hier nicht nachvollziehen.
Ich habe das nicht bis zum bitteren Ende untersucht, aber ich glaube, dass die Probleme damit zusammenhängen:
AutoItIf $aPosControl[2] < $aPosLastSubitem[0] And ($aPosLastSubitem[2] - $aPosLastSubitem[0]) <> 50 Then ; ConsoleWrite("1" & @CRLF) _GUICtrlListView_SetColumnWidth($gListviewPoints, _GUICtrlListView_GetColumnCount($gListviewPoints)-1, 1)
Wenn die letzte Spalte aus dem sichtbaren Bereich gewandert ist, prüfst Du, ob die Spaltenbreite ungleich 50 ist und setzt sie dann auf 1. Und weil 1 nunmal ungleich 50 ist, wird das ständig wiederholt. Dabei wird das ListView-Control offenbar zum Zeichnen angeregt, ohne dass das einen Sinn machen würde.