Das Pattern muss immer an den "Suchstring" angepasst werden.
Was enthält die Variable $date1?
Das Pattern muss immer an den "Suchstring" angepasst werden.
Was enthält die Variable $date1?
Du musst die ausgelesenen Angaben eben ins _Datediff konforme Format bringen.
z.B. über Stringregexpreplace
dim $date="19.05.2011"
dim $date_format=StringRegExpReplace($date, "(\d{2}).(\d{2}).(\d{4})", "$3\/$2\/$1")
MsgBox(0,"YYYY/MM/DD", $date_format)
[/autoit]Diesen Thread schon gesehen? http://forums.entechtaiwan.com/index.php?topic=6388.0
Soweit ich weiss ich das sehr hardwarenah und mit autoit eher schwierig umzusetzen.
Werden dabei nicht direkt bestimmte Speicherregister der GPU ausgelesen und interpretiert?
Das Thema hat es auf jeden Fall in sich ...
Die Top-Experten auf dem Gebiet (zumindest @Windows) sind imho die Jungs von EnTech: http://www.entechtaiwan.com/util/moninfo.shtm
Das Tool macht was du willst, nur in wie weit es sich automatisieren lässt weiss ich nicht.
Dort gibt es aber auch ein Forum mit direktem Kontakt zu den Entwicklern.
Der Wertebereich 0-2147483647 wird durch eine Drittanwendung vorgegeben.
Mal genauer:
Eventghost lauert noch Fernbedienungsanschlägen und sendet auf ein Event eine Nachricht über Sendmessage an mein Skript.
WM_Command müsste hier nicht unbedingt sein, ist aber einfach zu machen und imho relativ schnell.
Anschließend übersetzt mein Skript die Nachricht in eine Objektanweisung (DVBViewer)
[autoit]$odvbviewer.sendcommand($hi_word)
[/autoit]
Um das ganze möglichst effektiv zu halten sind die Nachrichten im Eventghost-Plugin schon DVBViewer gerecht (zumindest 0-32767) hinterlegt.
Soweit ok.
Nur dann ist mir aufgefallen, dass ich den Wertebereich von 0-2147483647 gar nicht komplett unterbringen kann.
Komplett wird der Bereich derzeit (aber wer weiss?) nicht verwendet, eher so im Bereich 0-50000.
Hey,
ein kleines Problem:
Ich möchte möglist viel vom Wertebereich 0-2147483647 im Highword einer WM_Command Nachricht unterbringen.
Soweit ich das verstanden habe ist im Highword maximal Platz für den Bereich −32.768 bis 32.768.
D.h. man könnten den Bereich von −32.768 bis -1 ausnutzen.
Hier ein Versuch:
#include <Winapi.au3>
global const $lowword=1000
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $ihighword_1=32767*2
Global $ihighword_2=0
Global $ihighword_3=32768
Global $ilongword_1=_CreateLong($lowword, $ihighword_1)
Global $ilongword_2=_CreateLong($lowword, $ihighword_2)
Global $ilongword_3=_CreateLong($lowword, $ihighword_3)
;ConsoleWrite($ilongword_1 &@crlf)
;ConsoleWrite($ilongword_2 &@crlf)
;ConsoleWrite($ilongword_3 &@crlf)
Global $ihighword_return_1=_get_highword($ilongword_1)
Global $ihighword_return_2=_get_highword($ilongword_2)
Global $ihighword_return_3=_get_highword($ilongword_3)
ConsoleWrite($ihighword_return_1 &@crlf)
ConsoleWrite($ihighword_return_2 &@crlf)
ConsoleWrite($ihighword_return_3 &@crlf)
Func _CreateLong($lo_word, $hi_word)
if $hi_word > 32767 then $hi_word-=65535
;ConsoleWrite("Hiword createlong :"&$hi_word&@crlf)
return _WinAPI_MakeLong($lo_word, $hi_word)
endfunc
func _get_highword($long_word)
; dieser Teil ist zeitkritisch
local $itemp=_WinAPI_HiWord($long_word)
if $itemp <0 then $itemp+=65535
;ConsoleWrite("Hiword itemp :"&$itemp&@crlf)
return $itemp
endfunc
Sind die Überlegungen so richtig?
Gibt es eine Methode um einen noch größeren Wertebereich zu erfassen?
Die Funktion _get_highword ist möglicherweise etwas zeitkritisch, da die WM_Command Funktion im eigentlichen Skript auf Fernbedienungsanschläge reagieren soll.
Wie sich das praktisch darstellt weiss ich noch nicht.
Zu zeitaufwendige Algos sind eher nicht drin, aber vielleicht habt ihr ja einen schlauen Trick auf lager ![]()
Gruß nuts
Na super! Das löst mein Problem doch! Danke ![]()
Zitat
Es müsste auch mit _GUICtrlListView_RegisterSortCallBack() und _GUICtrlListView_SortItems() gehen, dann wird für die Sortierung wohl __GUICtrlListView_Sort() genutzt.
Das stimmt.
Nach genauerem Untersuchen ist mir aber aufgefallen, dass es für die Sortierfunktion ja eine eigene Funktion (__GUICtrlListView_Sort($nItem1, $nItem2, $hWnd) nur interne verwendung) in der Guilistview.au3 UDF gibt.
Diese lässt sich theoretisch auch anpassen.
Aber deine Lösung klappt ja auch! ![]()
Edit\ DllCallbackFree sollte man beim beenden noch ausführen oder ist das in dem Fall nicht nötig?
Hm schade
Ist dein Code nur temporär nicht verfügbar?
Im englischen Forum gibts leider auch keine Lösung dafür.
Mit einem Listview kannst du es so wie hier machen: [ offen ] Listview sortieren ohne Columnclick
Ich bin etwas aus der Übung und verstehe nicht so ganz was zu mir sagen willst - sorry! ![]()
Die normale Funkionalität (Sortierung über Spaltenkopfzeile) bleibt bei mir auch erhalten.
Um nach verschiedenen Kriterien zu sortieren (Col1 -> Datum, Col2 0-n, Col3 ABC usw.) bleibt doch nur der Weg über GUICtrlRegisterListViewSort und entsprechend unterschiedlichen Funktionen für die Art und Weise der Sortierung.
Für die Prüfschleifen bietet es sich jedoch an gleich mit der Sortierung zu beginnen. Nur ohne Mausklick auf den header bekomm ich die nicht in gang.
Wie ist die Alternative?
z.B.
Spalte1: Datum: DD.MM.YYYY
Spalte2: Zahlen von 1-10000
Dazu muss ich doch jeweils eine andere Sortierfunktion verwenden?
Ich möchte für bestimmte Spalten eben verschiedene Prüfschleifen (mit Sortierung) erstellen.
Dazu bietet es sich an das Listview erstmal entsprechend zu sortieren.
Die Prüfungen sollen eben nicht über die Header angestossen werden.
TheLuBu: Das funktioniert nicht. (_LV_Sort gibt immer 0 für no change zurück und läuft auch nur einmal an)
Hallo zusammen,
folgendes Problem:
Ich möchte ein Listview nach verschiedenen Kriterien sortieren.
Dazu verwende ich GUICtrlRegisterListViewSort
Das funktioniert auch wunderbar.
Nun möchte ich diese Sortierfunktion auf einem anderen Weg starten (Hotkey, Buttonclick usw.)
Hier mal ein Beispiel zum spielen:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Guilistview.au3>
#include <File.au3>
#include <Array.au3>
#include <SendMessage.au3>
; nuts (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]Global $nSortDir = 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 544, 193, 125)
Global $ListView1 = GUICtrlCreateListView("Text|Nummer|Datum1|Datum2", 48, 16, 521, 385)
GUICtrlRegisterListViewSort(-1, "_LVSort")
Global $hLVHandle = GUICtrlGetHandle($ListView1)
_GUICtrlListView_SetColumn($hLVHandle, 0, "Text", 50, 1)
_GUICtrlListView_SetColumn($hLVHandle, 1, "Nummer", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 2, "Datum1", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 3, "Datum2", 150, 1)
Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
For $i = 0 To 5
$temp = Random(1, 31, 1)
If $temp < 10 Then $temp = "0" & $temp
GUICtrlCreateListViewItem("ABC|" & Random(1, 10050, 1) & "|2010\02\" & $temp & "|" & $temp & ".02.2010", $ListView1)
GUICtrlCreateListViewItem("DDC|" & Random(1, 10050, 1) & "|2011\03\" & $temp & "|" & $temp & ".03.2011", $ListView1)
Next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
;sortiere nach col 2
_SendMessage(0x00130458, 78, 0x00000003, 0x008CE2AC)
$nSortDir = $nSortDir * - 1
Case $ListView1
DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hLVHandle, "int", 0, "int", 1)
$nSortDir = $nSortDir * - 1
EndSwitch
WEnd
Func _Sort_byNumber($item1, $item2)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($item1) < Number($item2) Then
$ret = -1
ElseIf Number($item1) > Number($item2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byNumber
[/autoit] [autoit][/autoit] [autoit]Func _Sort_byString($item1, $item2)
Local $ret = 0
If $item1 < $item2 Then
$ret = -1
ElseIf $item1 > $item2 Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
EndFunc ;==>_Sort_byString
Func _Sort_byDate($item1, $item2, $del = ".", $step = -1)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0, $sitem1, $sitem2, $aitem1, $aitem2
[/autoit] [autoit][/autoit] [autoit]$aitem1 = StringSplit($item1, $del)
$aitem2 = StringSplit($item2, $del)
Switch $step
Case - 1
For $i = $aitem1[0] To 1 Step -1
$sitem1 &= $aitem1[$i]
Next
For $i = $aitem2[0] To 1 Step -1
$sitem2 &= $aitem2[$i]
Next
Case 1
For $i = 1 To $aitem1[0]
$sitem1 &= $aitem1[$i]
Next
For $i = 1 To $aitem2[0]
$sitem2 &= $aitem2[$i]
Next
EndSwitch
;ConsoleWrite($sitem1 & " | "& $sitem2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($sitem1) < Number($sitem2) Then
$ret = -1
ElseIf Number($sitem1) > Number($sitem2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byDate
[/autoit] [autoit][/autoit] [autoit]Func _LVSort($hWnd, $nItem1, $nItem2, $nColumn)
[/autoit] [autoit][/autoit] [autoit]Local $val1, $val2, $nResult
[/autoit] [autoit][/autoit] [autoit]$val1 = GetSubItemText($hWnd, $nItem1, $nColumn)
$val2 = GetSubItemText($hWnd, $nItem2, $nColumn)
;ConsoleWrite($val1 & " | "& $val2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit]$nResult = 0
[/autoit] [autoit][/autoit] [autoit]Switch $nColumn
[/autoit] [autoit][/autoit] [autoit]Case 3
$nResult = _Sort_byDate($val1, $val2)
Case 2
$nResult = _Sort_byDate($val1, $val2, "\", 1)
Case 1
$nResult = _Sort_byNumber($val1, $val2)
Case 0
$nResult = _Sort_byString($val1, $val2)
EndSwitch
$nResult = $nResult * $nSortDir
Return $nResult
EndFunc ;==>_LVSort
[/autoit] [autoit][/autoit] [autoit]Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
Local $nIndex, $stBuffer, $stLvi, $sItemText
DllStructSetData($stLvfi, 1, $LVFI_PARAM)
DllStructSetData($stLvfi, 3, $nItemID)
$stBuffer = DllStructCreate("char[260]")
[/autoit] [autoit][/autoit] [autoit]$nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
[/autoit] [autoit][/autoit] [autoit]$stLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
[/autoit] [autoit][/autoit] [autoit]DllStructSetData($stLvi, 1, $LVIF_TEXT)
DllStructSetData($stLvi, 2, $nIndex)
DllStructSetData($stLvi, 3, $nColumn)
DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
DllStructSetData($stLvi, 7, 260)
GUICtrlSendMsg($nCtrlID, $LVM_GETITEMA, 0, DllStructGetPtr($stLvi));
[/autoit] [autoit][/autoit] [autoit]$sItemText = DllStructGetData($stBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]$stLvi = 0
$stLvfi = 0
$stBuffer = 0
Return $sItemText
EndFunc ;==>GetSubItemText
Also z.B. eine Sortierung von Spalte 2 durch klicken des Buttons.
Gruß nuts
Nur weil man drauf reinfallen ist macht das den Aprilscherz nicht schlecht ![]()
Soweit so gut.
Ich hänge nur an der Variante, dass beide Skripte als Server und als Client fungieren sollen.
Trotzdem danke für dein Bemühen.
Bei genauem lesen erscheint mir das alles recht schwachsinnig ![]()
Aprilscherz gelungen ![]()
Hat dazu vielleicht jemand ein kurzes Beispiel wie das richtig funtkioniert?
Nicht so ganz ![]()
Beide Skripte sollten doch die while ... wend Schleife gar nicht verlassen oder?
Können nicht beide Verbindungen dauerhaft gehalten werden?
Ein Aprilscherz? Ich bin verwirrt :wacko:
Ein großer Nachteil hat allerdigns Version 4. Durch die OOP-Umstellung werden keine Scripte der Version 3 mehr laufen.
Was bedeutet das genau?
Müssen die alten Skripte einfach angepasst werden? Oder unterscheidet sich Syntax und Funktionen so sehr das jedes Skript nue geschrieben werden muss?
Hier mal ein Beispiel:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Guilistview.au3>
#include <File.au3>
#include <Array.au3>
#include <SendMessage.au3>
; nuts (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]Global $nSortDir = 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 544, 193, 125)
Global $ListView1 = GUICtrlCreateListView("Text|Nummer|Datum1|Datum2", 48, 16, 521, 385)
GUICtrlRegisterListViewSort(-1, "_LVSort")
Global $hLVHandle = GUICtrlGetHandle($ListView1)
_GUICtrlListView_SetColumn($hLVHandle, 0, "Text", 50, 1)
_GUICtrlListView_SetColumn($hLVHandle, 1, "Nummer", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 2, "Datum1", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 3, "Datum2", 150, 1)
Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
For $i = 0 To 5
$temp = Random(1, 31, 1)
If $temp < 10 Then $temp = "0" & $temp
GUICtrlCreateListViewItem("ABC|" & Random(1, 10050, 1) & "|2010\02\" & $temp & "|" & $temp & ".02.2010", $ListView1)
GUICtrlCreateListViewItem("DDC|" & Random(1, 10050, 1) & "|2011\03\" & $temp & "|" & $temp & ".03.2011", $ListView1)
Next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
;sortiere nach col 2
_SendMessage(0x00130458, 78, 0x00000003, 0x008CE2AC)
$nSortDir = $nSortDir * - 1
Case $ListView1
DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hLVHandle, "int", 0, "int", 1)
$nSortDir = $nSortDir * - 1
EndSwitch
WEnd
Func _Sort_byNumber($item1, $item2)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($item1) < Number($item2) Then
$ret = -1
ElseIf Number($item1) > Number($item2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byNumber
[/autoit] [autoit][/autoit] [autoit]Func _Sort_byString($item1, $item2)
Local $ret = 0
If $item1 < $item2 Then
$ret = -1
ElseIf $item1 > $item2 Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
EndFunc ;==>_Sort_byString
Func _Sort_byDate($item1, $item2, $del = ".", $step = -1)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0, $sitem1, $sitem2, $aitem1, $aitem2
[/autoit] [autoit][/autoit] [autoit]$aitem1 = StringSplit($item1, $del)
$aitem2 = StringSplit($item2, $del)
Switch $step
Case - 1
For $i = $aitem1[0] To 1 Step -1
$sitem1 &= $aitem1[$i]
Next
For $i = $aitem2[0] To 1 Step -1
$sitem2 &= $aitem2[$i]
Next
Case 1
For $i = 1 To $aitem1[0]
$sitem1 &= $aitem1[$i]
Next
For $i = 1 To $aitem2[0]
$sitem2 &= $aitem2[$i]
Next
EndSwitch
;ConsoleWrite($sitem1 & " | "& $sitem2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($sitem1) < Number($sitem2) Then
$ret = -1
ElseIf Number($sitem1) > Number($sitem2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byDate
[/autoit] [autoit][/autoit] [autoit]Func _LVSort($hWnd, $nItem1, $nItem2, $nColumn)
[/autoit] [autoit][/autoit] [autoit]Local $val1, $val2, $nResult
[/autoit] [autoit][/autoit] [autoit]$val1 = GetSubItemText($hWnd, $nItem1, $nColumn)
$val2 = GetSubItemText($hWnd, $nItem2, $nColumn)
;ConsoleWrite($val1 & " | "& $val2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit]$nResult = 0
[/autoit] [autoit][/autoit] [autoit]Switch $nColumn
[/autoit] [autoit][/autoit] [autoit]Case 3
$nResult = _Sort_byDate($val1, $val2)
Case 2
$nResult = _Sort_byDate($val1, $val2, "\", 1)
Case 1
$nResult = _Sort_byNumber($val1, $val2)
Case 0
$nResult = _Sort_byString($val1, $val2)
EndSwitch
$nResult = $nResult * $nSortDir
Return $nResult
EndFunc ;==>_LVSort
[/autoit] [autoit][/autoit] [autoit]Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
Local $nIndex, $stBuffer, $stLvi, $sItemText
DllStructSetData($stLvfi, 1, $LVFI_PARAM)
DllStructSetData($stLvfi, 3, $nItemID)
$stBuffer = DllStructCreate("char[260]")
[/autoit] [autoit][/autoit] [autoit]$nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
[/autoit] [autoit][/autoit] [autoit]$stLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
[/autoit] [autoit][/autoit] [autoit]DllStructSetData($stLvi, 1, $LVIF_TEXT)
DllStructSetData($stLvi, 2, $nIndex)
DllStructSetData($stLvi, 3, $nColumn)
DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
DllStructSetData($stLvi, 7, 260)
GUICtrlSendMsg($nCtrlID, $LVM_GETITEMA, 0, DllStructGetPtr($stLvi));
[/autoit] [autoit][/autoit] [autoit]$sItemText = DllStructGetData($stBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]$stLvi = 0
$stLvfi = 0
$stBuffer = 0
Return $sItemText
EndFunc ;==>GetSubItemText
Was mich in dem Zusammenhang interessieren würde:
Wie kann ich die Sortierfunktion außer durch einen Mausklick auslösen?