Da Du ja keine Hilfe willst, sondern ein fertiges Script, habe ich das mal in "Programmieranfragen" verschoben.
Beiträge von Oscar
-
-
Solch ein Skript ist viel zu fehleranfällig und zu sehr auf den eigenen PC zugeschnitten!
Die Koordinaten sind abhängig von der Monitorauflösung und der eingestellten Windows-Skalierung.
Die MouseWheel-Befehle wohl auch noch von den eingestellten Maus-Eigenschaften.
Die Datei-Pfade und verwendeten Programme sind nur bei Dir vorhanden!
Und außerdem darf man bei so einem Skript (Mausmove, Send und co.) absolut nichts nebenbei machen, weil das zu sofortigen Fehlfunktionen führt!Jegliche Hilfe-Versuche bei so einem Skript sind Ratespiele, warum dies oder jenes bei Dir dann nicht funktioniert.
Tut mir Leid das zu sagen, aber bei so einem Skript wird es von meiner Seite keine Unterstützung geben. -
-
Mal ein kleines Zitat aus der Hilfe:
Zitat von AutoIt-Hilfe
For each call to _GUICtrlListView_RegisterSortCallBack() there must be a call to _GUICtrlListView_UnRegisterSortCallBack() when done (before exit).It is up to the user to call _GUICtrlListView_UnRegisterSortCallBack() for each _GUICtrlListView_RegisterSortCallBack() call made.
-
Ich starte den Timer und frage ihn während das Script läuft in einer Adlib ab.
Auf diese Weise ist der Timer völlig überflüssig!
Wenn Du eine Funktion mit AdlibRegister aufrufst, dann legst Du die Aufrufhäufigkeit ja mit AdlibRegister fest z.B. alle 250 ms (Standard).
Willst Du, dass etwas nach beispielsweise 5 Sekunden passiert, so kannst Du einfach eine globale Variable hochzählen und wenn diese >=20 (1 / 4 * 20 = 5) ist, die entsprechenden Befehle ausführen. -
Es gibt bereits eine UDF (Anhang / nicht von mir), die das Array "richtig" sortieren kann. Die hatte ich mir vor langer Zeit mal abgespeichert, weil ich so eine Funktion selbst mal brauchte.
Du brauchst dann nur noch die Funktion aufrufen und das Array ist korrekt sortiert:
-
Wenn es auf Geschwindigkeit ankommt, ist es eh besser (vor der Anzeige im Listview) das Daten-Array durchzugehen und dort die entsprechenden Einträge zu löschen.
Oder (noch besser, weil dann auch noch weniger Speicher verbraucht wird) bereits beim erstellen des Daten-Arrays (auslesen der Verzeichnisse) eine entsprechende Filterung vorzunehmen. -
Möglich ist das (wie chip bereits schrieb mit Hilfe eines Timers), aber wozu braucht man so eine Unterscheidung?
Ein Klick auf ein Item wird über die ID registríert (TrayItemSetOnEvent) und die entsprechende Funktion (oder bei TrayGetMsg die Case-Anweisung) ausgeführt.Das Problem bei der Auswertung, ob Klick oder Doppelklick auf das TrayIcon ist halt, dass man die Doppelklick-Verzögerung abwarten muss.
Hier mal ein Beispiel:AutoIt
Alles anzeigen#include <Date.au3> #include <MsgBoxConstants.au3> #include <TrayConstants.au3> #NoTrayIcon ; Required for the $TRAY_ICONSTATE_SHOW constant. Opt("TrayMenuMode", 7) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode. Global $iDoubleClickSpeed = RegRead('HKEY_CURRENT_USER\Control Panel\Mouse', 'DoubleClickSpeed') Example() Func Example() Local $idAbout = TrayCreateItem("About") TrayCreateItem("") ; Create a separator line. Local $idExit = TrayCreateItem("Exit") TraySetClick(8) TraySetState($TRAY_ICONSTATE_SHOW) ; Show the tray menu. Local $iClick = 0, $iTimer = TimerInit() While 1 If $iClick > 0 And TimerDiff($iTimer) > $iDoubleClickSpeed Then ConsoleWrite(_NowTime() & " PrimaryDown" & @CR) $iClick = 0 EndIf Switch TrayGetMsg() Case $TRAY_EVENT_PRIMARYDOWN If $iClick = 0 Then $iTimer = TimerInit() EndIf Case $TRAY_EVENT_PRIMARYUP $iClick += 1 ;~ ConsoleWrite(_Now() & " PrimaryUp" & @CR) Case $TRAY_EVENT_PRIMARYDOUBLE ConsoleWrite(_NowTime() & " PrimaryDouble" & @CR) $iClick = -1 Case $idAbout ; Display a message box about the AutoIt version and installation path of the AutoIt executable. MsgBox($MB_SYSTEMMODAL, "", "AutoIt tray menu example." & @CRLF & @CRLF & _ "Version: " & @AutoItVersion & @CRLF & _ "Install Path: " & StringLeft(@AutoItExe, StringInStr(@AutoItExe, "\", 0, -1) - 1)) ; Find the folder of a full path. Case $idExit ; Exit the loop. ExitLoop EndSwitch WEnd EndFunc ;==>Example -
a) GuiSetIcon
b) TrayItemCreate und für die Auswertung (abhängig von "TrayOnEventMode") TrayGetMsg auswerten oder mit Tray(Item)SetOnEvent eine Funktion zuweisen.Zu den fett geschriebenen Wörtern findest Du jeweils ein Beispiel in der Hilfe.
-
Ein Return 0 statt 'GUI_RUNDEFMSG' funktioniert auch.
-
Häh?
Also FileOpen kann jede Art von Datei öffnen (Binär-Modus). Die Frage ist, wozu?
Was willst Du damit machen?
ControlSend ist zum fernsteuern anderer Anwendungen. Beschreib nochmal genauer, was Du machen willst. -
Und für den Fall, dass in dem Listview irgendwo eine Datums-Spalte vorkommt, habe ich mal schnell eine Funktion zum umsortieren geschrieben:
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <ListViewConstants.au3> Global $iDateColumn = 0 ; hier angeben welche Spalte die Datums-Spalte sein soll Global $sHeader = 'Datum|Artikelnummer|Nummer|Baureihe' Global $hGui = GUICreate('Listview-Sort', 600, 480) Global $idListView = GUICtrlCreateListView($sHeader, 0, 0, 600, 400, $LVS_SHOWSELALWAYS) ; hier ein paar Zufallsdaten generieren Global $sItem = '' For $iArtNr = 0 To 99 $sDate = StringFormat('%02i.%02i.%04i', Random(1, 28, 1), Random(1, 12, 1), Random(2000, 2016, 1)) $sItem = $sDate & '|' & $iArtNr & '|' & Random(10000, 99999, 1) & '|' & Random(1000, 9999, 1) GUICtrlCreateListViewItem($sItem, $idListView) Next _GUICtrlListView_SetColumnWidth($idListView, 0, 110) ; Zufallsdaten bereit _GUICtrlListView_RegisterSortCallBack($idListView) GUISetState(@SW_SHOW, $hGui) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlListView_UnRegisterSortCallBack($idListView) Exit Case $idListView _GUICtrlListView_BeginUpdate($idListView) $iCol = GUICtrlGetState($idListView) If $iCol = $iDateColumn Then _ChangeDateFormat($idListView, 0, 1) ; temporaer das Datum nach Jahr.Monat.Tag umwandeln _GUICtrlListView_SortItems($idListView, $iCol) ; Spalte sortieren If $iCol = $iDateColumn Then _ChangeDateFormat($idListView, 0, 0) ; hier das Datum wieder nach Tag.Monat.Jahr umwandeln _GUICtrlListView_EndUpdate($idListview) EndSwitch WEnd Func _ChangeDateFormat($idListView, $iCol, $iDir) Local $iItemCount = _GUICtrlListView_GetItemCount($idListView) If $iItemCount = 0 Then Return SetError(1, 0, False) Local $iColCount = _GUICtrlListView_GetColumnCount($idListView) If $iColCount = 0 Then Return SetError(2, 0, False) If $iCol > $iColCount Then Return SetError(3, 0, False) Local $sText = '' For $iIndex = 0 To $iItemCount - 1 $sText = _GUICtrlListView_GetItemText($idListView, $iIndex, $iCol) If $iDir Then $sText = StringRegExpReplace($sText, '(\d{2}).(\d{2}).(\d{4})', '$3.$2.$1') ; Tag.Monat.Jahr -> Jahr.Monat.Tag Else $sText = StringRegExpReplace($sText, '(\d{4}).(\d{2}).(\d{2})', '$3.$2.$1') ; Jahr.Monat.Tag -> Tag.Monat.Jahr EndIf _GUICtrlListView_SetItemText($idListView, $iIndex, $sText, $iCol) Next Return True EndFunc ;==>_ChangeDateFormat -
Die einfachste Variante ist wohl, die UDF-Funktion "_GUICtrlListView_RegisterSortCallBack" zu benutzen:
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <ListViewConstants.au3> Global $sHeader = 'Artikelnummer|Nummer|Baureihe' Global $hGui = GUICreate('Listview-Sort', 600, 480) Global $idListView = GUICtrlCreateListView($sHeader, 0, 0, 600, 400, $LVS_SHOWSELALWAYS) Global $sItem = '' For $iArtNr = 0 To 99 $sItem = $iArtNr & '|' & Random(10000, 99999, 1) & '|' & Random(1000, 9999, 1) GUICtrlCreateListViewItem($sItem, $idListView) Next _GUICtrlListView_RegisterSortCallBack($idListView) GUISetState(@SW_SHOW, $hGui) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlListView_UnRegisterSortCallBack($idListView) Exit Case $idListView _GUICtrlListView_SortItems($idListView, GUICtrlGetState($idListView)) EndSwitch WEndAufpassen muss man nur, wenn die zu sortierenden Daten nicht von links nach rechts sortiert werden sollen (wie z.B. beim Datum).
In dem Fall muss man eine eigene Sortier-Funktion einbauen. -
Wobei die Kurzschreibweise $text1 &= $sName[$i] & Chr(10) durchaus erlaubt ist.
Im übrigen gibt es in SciTE eine Tastenkombination [STRG] + [t], die den Code schön formatiert.
-
In AutoIt werden Strings mit "&" verkettet. Das "+" dient der Addition.
Und da AutoIt als Datentyp nur "Variant" kennt, gibt es hier auch keine Fehlermeldung des Interpreters. -
-
$aTest[5][2]
Wenn Du so ein Array hast, dann kannst Du es nicht mit $variable = $aTest[5][2] ansprechen, weil die Werte bei Null beginnen.
Es geht also nur: $variable = $aTest[0][0] bis $variable = $aTest[4][1].
$variable = $aTest[5][2] liegt außerhalb des dimensionierten Bereichs! -
Genauer gesagt den LM75A, andere Sensoren hab ich noch nicht verbaut.
Hmm...lt. Datenblatt hat der nur eine Genauigkeit von +-2 Grad Celsius.
Da bevorzuge ich doch die "DS18B20". Die haben eine Genauigkeit von +-0.5 Grad Celsius und da kannst Du an einen Pin mehrere Temperatur-Sensoren anschliessen (One-Wire-Bus, die Sensoren werden über eine feste Adresse angesprochen).
Die gibt es auch in einer vergossenen (wasserfesten) Variante und man kann sie sogar über das Datenkabel mit Strom versorgen (Parasite Power), sodass eine Zweidrahtverbindung (GND und Data) ausreicht. -
-
Den MCP23017 hatte ich hier noch rumliegen, also Lötkolben angeschmissen und auf eine Platine gelötet. Library von Adafruit installiert. Funktioniert!
Ich kann alle 16 I/Os einzeln schalten, soweit so gut, aber ich kann diese I/Os nicht nutzen, um die DHT-Feuchtesensoren anzuschliessen.
Die entsprechende DHT-Library erwartet ja einen Port/Pin "DHT dht(DHTPIN, DHTTYPE)". Ich bin schon am suchen, aber scheinbar gibt es für das Problem keine entsprechende Library. Oder kennt jemand von euch eine Lösung dafür?Mein TFT ist per Hardware-SPI angeschlossen und das soll auch so bleiben. RTC und Luftdrucksensor per I2C. Die beiden DHT habe ich jetzt an GPIO10 und GPIO0 angeschlossen, was testweise erstmal funktioniert.
Wenn das stabil läuft, dann bleibt es wohl bei den Anschlüssen und ich nutze den MCP23017 nur zum schalten von einigen LEDs und zur Eingabe per Tastatur. Später sollen da evtl. noch ein paar Lampen geschaltet werden.
Mal schauen, wie das so weitergeht...
Trotz aller Sucherei und mangelhafter Dokumentation macht es doch Spaß mal wieder etwas zu "basteln".
-
-
Habe z.Z. einen Esp8266 mit 4 Temperaturfühlern ,2 LCD Displays 1024 kbit EEprom und diversen Tastern die alle an 2 Pins hängen.
Die Taster und Lcds hängen alle an PFC8574 Portexpandern, die Anzahl der I/O Pins ist nur durch die zur Verfügung stehenden Geräteadressen begrenzt.Programmierst Du mit der Arduino-IDE?
Wenn ja, würde mich interessieren wie Du die Geräte über den Portexpander ansprichst.
Wie sehen denn dann die Port-Adressen aus?
Ich brauche nämlich momentan auch noch einige I/O-Ports. -