Beiträge von Oscar
-
-
Bakku: Die Radios sind dazu da, auszuwählen welche der Telefonnummern in der Liste angezeigt werden soll. Es können ja vier Telefonnummern eingegeben werden, aber nur eine steht in der Liste. Und "Minimiert starten" kann man im Menü "Einstellungen" ausschalten.
Alina: Jo stimmt, das ist noch ein Bug. Wird in der nächsten Version behoben.
-
Version 1.5 (21.03.2010)
Ja ich weiß, es gibt schon hunderte solcher Programme, aber keines gefiel mir bisher. Also habe ich mein eigenes Programm geschrieben.
Es sollte vor allem klein sein, im Hintergrund laufen (Tray-Icon) und somit schnell verfügbar sein. Außerdem sollte es eine Liste geben, in der nur Name, Vorname und die Telefonnummer aufgelistet sind.
All das kann mein Programm.
Außerdem:
- Windows-Autostart (optional, nur bei der compilierten Exe)
- Minimiert starten (optional)
- bei Programmende das Adressbuch speichern (optional)
- Einträge nachträglich bearbeiten (Doppelklick auf einen Eintrag in der Liste)
- Suche (einfach den Suchbegriff eingeben, Treffer wird in der Liste markiert)
- Doppelklick aufs Trayicon minimiert das Fenster bzw. stellt es wieder her.History
Änderungen in Version 1.5:
- Wenn man das "Bearbeiten"-Fenster minimiert hat, blieb es "verschwunden", bis man das Hauptfenster minimiert und wiederhergestellt hat. Fehler behoben!
- Wenn bei einem Anruf die Rufnummer nicht übermittelt wurde, hat mein Programm den ersten Eintrag im Listview als Anrufer angezeigt. Fehler behoben!
- Bei Änderungen an bestehenden oder dem anlegen von neuen Einträgen wird man nun deutlich (Ausrufezeichen-Icon) darauf hingewiesen, dass das Adressbuch noch nicht gespeichert ist.Änderungen in Version 1.4:
- Der FritzBox-Anrufmonitor kann nun im Menü (unter Einstellungen) ein-/ausgeschaltet werden. Dabei wird die IP-Adresse automatisch ermittelt (TCPNameToIP).
Der TCP-Port ist nun fest auf 1012 eingestellt. Nach Recherchen im Netz habe ich herausbekommen, dass dieser Port immer für den internen Anrufmonitor verwendet wird.
Falls TSAdress keine Verbindung zur FritzBox herstellen kann, könnte es sein, dass der Port erst freigeschaltet werden muss (Anleitung dazu unter Menü/Hilfe).
- Die Rufnummern-Erkennung sollte jetzt auch bei unterschiedlichen Eingabeformaten funktionieren.
- Das ListView hat nun ein Raster ($LVS_EX_GRIDLINES)
- Außerdem habe ich die Standardfarben etwas weniger "grell" voreingestellt.
Änderungen in Version 1.3:
- FritzBox-Support (Alpha!) Wenn ein Anruf eingeht, erscheint ein TrayTip mit dem Anrufernamen (wenn bekannt) und der Telefonnummer (wenn übermittelt) des Anrufenden.
Dazu müssen in der Inidatei diese drei Einträge vorhanden sein:
Der Port passt so bei einer "FritzBox 7170" und die IP ist standardmäßig so vorgegeben. Falls eure FritzBox eine andere IP besitzt, dann diese dort eintragen.
Ich habe keine Ahnung, ob das auch mit anderen FritzBoxen funktioniert, also ohne jegliche Gewähr. Bei meiner 7170 klappt das aber einwandfrei (getestet).
- Die Hotkeys habe ich geändert auf [ALT]+[ n ] für "Neuer Eintrag", [ALT] + [ b ] für "Eintrag bearbeiten" und [ALT] + [ l ] für "Markierte Einträge löschen". Das kollidierte sonst mit der Eingabe im Suchfeld.Änderungen in Version 1.2:
- Wenn die Maus länger als 500 Millisekunden über einen Eintrag in der Liste steht, dann wird ein Tooltip mit Kurzinformationen angezeigt.
- Kontextmenü zum Listview hinzugefügt
- Es gibt nun drei Hotkeys: "N" für "Neuer Eintrag", "b" für "Eintrag bearbeiten" und "l" für "Markierte Einträge löschen"
- Die Farben im Listview können nun selbst gewählt werden, indem die Werte (1stColor und 2ndColor) in der Inidatei angepasst werden. Sind die Werte unterschiedlich, werden die Zeilen wechselweise farblich angepasst.Änderungen in Version 1.1:
- Bug beim Datumsupdate behoben (Danke Alina)
- Wenn man alle Einträge gelöscht hat und dann wieder einen Neuen angelegt hat, ist das Programm abgestürzt. Behoben!
- Man kann nun ein Backup des Adressbuches erstellen (Pfad auswählbar)
- Backup laden
- Im Menü "Einstellungen" gibt es jetzt die Möglichkeit die Daten und Einstellungen im Programmverzeichnis speichern zu lassen (Mobile-Version). Man kann das Programm dann einfach auf einem USB-Stick mitnehmen.Screenshot:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Hinweis: Die Namen und Telefonnummern sind zufällig erstellt. Jede Ähnlichkeit mit lebenden und so weiter...
Script, Icon und Exe befinden sich im ZIP-Archiv (Anhang)!
-
So, nachdem mir UEZ in der Shoutbox die Gehirnwindungen entknotet hat, konnte ich das Script von ihm in eine Funktion zusammenfassen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
$max = 999
Dim $array[$max][3]
for $i = 0 to $max - 1
$array[$i][0]= Chr(Random(65,67,1)) & Chr(Random(65,67,1)) & Chr(Random(65,67,1))
$array[$i][1]= Chr(Random(65,67,1)) & Chr(Random(65,67,1)) & Chr(Random(65,67,1))
$array[$i][2]= Chr(Random(65,90,1)) & Chr(Random(65,90,1)) & Chr(Random(65,90,1))
Next
_ArrayDisplay($array, 'Vorher:')
_NewArraySort($array, 0, 1)
_ArrayDisplay($array, 'Nachher:')Func _NewArraySort(ByRef $aSort, $1st, $2nd)
[/autoit]
Local $j = 0, $k = 1
_ArraySort($aSort, 0, 0, 0, $1st)
While $k < UBound($aSort)
If $aSort[$j][$1st] <> $aSort[$k][$1st] Then
If $k - $j > 1 Then
_ArraySort($aSort, 0, $j, $k - 1, $2nd)
$j = $k
Else
$j = $k
EndIf
EndIf
$k += 1
WEnd
If $k - $j > 1 Then _ArraySort($aSort, 0, $j, $k, $2nd)
EndFunc
Das ist schön schnell und sortiert richtig. Danke UEZ und nochmal ein Danke an alle anderen.
Mein Projekt steht nun kurz vor der Fertigstellung.
-
Schau Dir mal das Beispiel zu GUISwitch an. So geht's ohne UDF.

-
Schnitzel: Ich bin Dir ja dankbar, dass Du Dich an dem Problem versuchst und Deine Funktion ist auch recht schnell, nur passt es noch nicht so ganz.
Ich habe Dein Beispiel mal etwas verändert, um es genauer zu zeigen:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
$max = 500
Dim $array[$max][3]
for $i = 0 to $max - 1
$array[$i][0]= Chr(Random(65,67,1)) & Chr(Random(65,67,1)) & Chr(Random(65,67,1))
$array[$i][1]= Chr(Random(65,67,1)) & Chr(Random(65,67,1)) & Chr(Random(65,67,1))
$array[$i][2]= Chr(Random(65,90,1)) & Chr(Random(65,90,1)) & Chr(Random(65,90,1))
Next
_ArrayDisplay($array, 'Vorher:')_Array2D_Sort($array, 0)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($array, 'Nachher:');~ _Array2D_Sort($array, 1)
[/autoit] [autoit][/autoit] [autoit]
;~ _ArrayDisplay($array); #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Array2D_Sort
; Description ...: Sorts a 2D Array by Index
; Syntax.........: _Array2D_Sort($avArray[, $iIndex = 0])
; Parameters ....: $avArray - Array to display
; $iIndex - [optional] Sort Array by this Index
; Return values .: Success - Sorted Array
; Failure - 0, sets @error:
; |1 - $avArray is not an Array
; |2 - $avArray is not an 2D-Array
; |3 - $iIndex is out of
; Author ........: Schnitzel
; Modified.......:
; Link ..........: https://autoit.de/index.php?page=Thread&threadID=18117
; Example .......: Yes
; ===============================================================================================================================Func _Array2D_Sort(ByRef $avArray, $iIndex = 0)
[/autoit]
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
If Not UBound($avArray, 0) = 2 Then Return SetError(2, 0, 0)
If UBound($avArray, 2) <= $iIndex Then Return SetError(3, 0, 0)
Local $bTausch, $sTmp, $i = 0, $iRuns = UBound($avArray) - 2
Do
$bTausch = False
For $j = 0 To $iRuns - $i
If $avArray[$j][$iIndex] > $avArray[$j + 1][$iIndex] Then
For $k = 0 To UBound($avArray, 2) - 1
$sTmp = $avArray[$j + 1][$k]
$avArray[$j + 1][$k] = $avArray[$j][$k]
$avArray[$j][$k] = $sTmp
Next
$bTausch = True
EndIf
Next
$i += 1
Until ($bTausch = False) Or ($i = $iRuns)
If ($bTausch = False) And ($i = 1) Then _Array2D_Sort($avArray, $iIndex + 1)
EndFunc ;==>_Array2D_Sort
Mal ganz ohne Zahlen (sind später eh keine Zahlen, sondern Strings). Wenn nun die Buchstabenfolge in der ersten Spalte gleich ist, dann müssen diese Gleichen nach den Buchstaben aus der zweiten Spalte sortiert werden. Nach der dritten Spalte braucht nicht sortiert werden. Diese soll nur anzeigen, dass das 2D-Array noch weitere Spalten besitzt und man diese mitsortieren muss.
Eine Zeile mit allen Spalten bildet einen Datensatz. Diese dürfen auch nicht auseinandergerissen werden (Hinweis an kleiner27). -
Dateien schreiben/lesen ist die wohl schlechteste Variante.

Am leichtesten zu verstehen ist wohl die Version mit einem versteckten Edit-Control:
Programm1:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>$hGui = GUICreate('Programm1')
[/autoit]
$HiddenInput = GUICtrlCreateEdit('', 0, 0, 0, 0)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
$sExtMsg = GUICtrlRead($HiddenInput)
If $sExtMsg <> '' Then
MsgBox(0, 'Nachricht', $sExtMsg)
GUICtrlSetData($HiddenInput, '')
EndIf
WEndProgramm2:
Spoiler anzeigen
[autoit]
[/autoit]
While True
$input = InputBox('Programm2', 'Text zum senden eingeben', '')
If $input = '' Then Exit
ControlSetText('Programm1', '', '[CLASS:Edit; INSTANCE:1]', $input)
Sleep(50)
WEnd -
Ich habe Dein Beispiel mal ein wenig angepasst, um die Problematik zu verdeutlichen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Dim $array[100][4]
For $i = 0 To 99
For $j = 0 To 3
$array[$i][$j] = Random(0, 10, 1)
Next
Next; Array mit Zufallsinhalt erzeugen_Array2D_Sort($array, 0)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($array); #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Array2D_Sort
; Description ...: Sorts a 2D Array by Index
; Syntax.........: _Array2D_Sort($avArray[, $iIndex = 0])
; Parameters ....: $avArray - Array to display
; $iIndex - [optional] Sort Array by this Index
; Return values .: Success - Sorted Array
; Failure - 0, sets @error:
; |1 - $avArray is not an Array
; |2 - $avArray is not an 2D-Array
; |3 - $iIndex is out of
; Author ........: Schnitzel
; Modified.......:
; Link ..........: https://autoit.de/index.php?page=Thread&threadID=18117
; Example .......: Yes
; ===============================================================================================================================Func _Array2D_Sort(ByRef $avArray, $iIndex = 0)
[/autoit]
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
If Not UBound($avArray, 0) = 2 Then Return SetError(2, 0, 0)
If UBound($avArray, 2) <= $iIndex Then Return SetError(3, 0, 0)
Local $bTausch, $sTmp, $i = 0, $iRuns = UBound($avArray) - 2
Do
$bTausch = False
For $j = 0 To $iRuns - $i
If $avArray[$j][$iIndex] > $avArray[$j + 1][$iIndex] Then
For $k = 0 To UBound($avArray, 2) - 1
$sTmp = $avArray[$j + 1][$k]
$avArray[$j + 1][$k] = $avArray[$j][$k]
$avArray[$j][$k] = $sTmp
Next
$bTausch = True
EndIf
Next
$i += 1
Until ($bTausch = False) Or ($i = $iRuns)
EndFunc ;==>_Array2D_Sort
Wenn jetzt die Werte im ersten Element gleich sind, dann sollen die gleichen nach dem Wert des zweiten Elements sortiert werden. Das ist bei Deiner Funktion nicht der Fall. -
Ich würde das so machen:
[autoit]
[/autoit]
#include <Date.au3>
If _DateDiff('s', _NowCalcDate() & ' 13:15:00', _NowCalc()) > 0 Then MsgBox(0, '', 'Zeit erreicht') -
Deine Funktion berücksichtigt nicht den Fall, wenn zwei Werte gleich sind. In dem Fall müsste das nächste Element entscheiden, ob ausgetauscht wird oder nicht.
Ansonsten ist das aber auch eine Bubble-Sort-Variante, oder sehe ich das falsch?
-
Zwei- bis dreihundert Elemente werden bei meiner Bubble-Sort-Funktion noch akzeptabel schnell sortiert. Ich denke, das reicht mir.
-
Alles mit "$WS_EX_" sind extended Styles und gehören auch entsprechend dort hin. Das solltest Du mal korrigieren, sonst kann es zu unerwünschten Ergebnissen kommen.
0x80 entspricht übrigens $WS_EX_TOOLWINDOW
-
Ich habe mich noch an einer Bubble-Sort-Funktion versucht. Die Lösung ist ja eigentlich sehr simpel, aber so habe ich mir das vorgestellt.
Vielleicht nicht die schnellste Lösung, aber für diese Aufgabe reicht's.Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Dim $array[3][3] = [['abc', 'a11', '555'],['bcd', 'a11', '444'],['cde', 'a11', '666']]
_Array2DSort($array)
_ArrayDisplay($array)Func _Array2DSort(ByRef $aSortArray)
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To UBound($aSortArray) - 2
For $j = $i + 1 To UBound($aSortArray) - 1
If $aSortArray[$i][1] > $aSortArray[$j][1] Then _Array2DSwap($aSortArray, $i, $j)
If $aSortArray[$i][1] = $aSortArray[$j][1] Then
If $aSortArray[$i][2] > $aSortArray[$j][2] Then _Array2DSwap($aSortArray, $i, $j)
EndIf
Next
Next
EndFunc ;==>_Array2DSortFunc _Array2DSwap(ByRef $aSwap, $a, $b)
[/autoit]
Local $sTmp
For $i = 0 To UBound($aSwap, 2) - 1
$sTmp = $aSwap[$a][$i]
$aSwap[$a][$i] = $aSwap[$b][$i]
$aSwap[$b][$i] = $sTmp
Next
EndFunc ;==>_Array2DSwap
Warum bin ich da nicht schon gestern drauf gekommen...
-
Mehrstufig sortieren kannst du über einen Umweg mit SQL: https://autoit.de/index.php?page…46336#post46336
Diese Funktion führt zum Erfolg!
Darf ich die in einem Projekt (will noch nichts verraten, aber wenn's fertig ist, werde ich es hier veröffentlichen) benutzen?Danke auch an alle anderen für die zahlreichen Lösungsansätze, aber BugFixs Funktion lässt sich gut in das Projekt integrieren.

-
-
Ich habe ein Problem mit _ArraySort. Und zwar mit einem 2D-Array. Ich möchte nach dem 2. Element sortieren lassen. Nun kann es aber sein, dass es mehrere gleiche Einträge gibt, die sich erst im dritten Element unterscheiden.
[autoit]
Dann passiert es, dass die Sortierung mal so und mal so ausfällt, aber nicht so wie ich das haben will.
Hier mal ein Beispiel:
[/autoit]
#include <Array.au3>
Dim $array[3][3] = [['abc', 'a11', '555'],['bcd', 'a11', '444'],['cde', 'a11', '666']]
_ArraySort($array,0,0,0,1)
_ArrayDisplay($array)
_ArraySort($array,0,0,0,1)
_ArrayDisplay($array)
_ArraySort($array,0,0,0,1)
_ArrayDisplay($array)
_ArraySort($array,0,0,0,1)
_ArrayDisplay($array)
Ganz oben sollte die "444" stehen, dann die "555" und dann die "666".
Gibt's eine Möglichkeit das hinzubekommen oder hat jemand eine Sortierfunktion, die das beherrscht? -
Kann sein, dass die Mitgliederliste später aktualisiert wird, aber die Statistik zeigt: 5555
-
Ich hab' mal drauf geachtet!
Der 5555ste Benutzer ist der User: feel-easyHerzlichen Glückwunsch (wozu auch immer)!

-
Es geht auch einfacher:
[autoit]$x = 100 - GUICtrlRead($slider)
[/autoit] -
Wenn Du alle Fundstellen haben willst, dann sollte es aber auch eine Rückgabe als Variable geben:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$sFound = ''
ToolTip('please wait...', @DesktopWidth / 2, @DesktopHeight / 2, 'Registry-Search', 1, 5)
$iTimer = TimerInit()
_RegSearch($sFound, 'HKEY_LOCAL_MACHINE', 'v3.3.4.0')
ToolTip('')
MsgBox(0, 'Gefunden:', Round(TimerDiff($iTimer) / 1000, 3) & ' sek.' & @CRLF & $sFound)Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch)
[/autoit]
Local $sKey, $sVal, $sVar, $i = 0, $j = 0
While True
$i += 1
$sKey = RegEnumKey($sRegPath, $i)
If @error Then ExitLoop
_RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
$j = 0
While True
$j += 1
$sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
If @error Then ExitLoop
$sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @CRLF
WEnd
WEnd
Return
EndFunc
BTW: Das komplette durchsuchen dauert bei mir ca. 38 sek.