Kennst du LIKE aus SQL? - Das habe ich adäquat für AutoIt umgesetzt: Suche mit LIKE
Mit den Platzhaltern für ein oder beliebig viele Zeichen kannst du das simpel umsetzen.
If _Search_LIKE(@IPAddress1, "172.25.10.%" Then ; IP ist in dieser Range
Kennst du LIKE aus SQL? - Das habe ich adäquat für AutoIt umgesetzt: Suche mit LIKE
Mit den Platzhaltern für ein oder beliebig viele Zeichen kannst du das simpel umsetzen.
If _Search_LIKE(@IPAddress1, "172.25.10.%" Then ; IP ist in dieser Range
Ich habe gerade in Rosetta Code das Thema Kalender in AutoIt umgesetzt.
Aufgabe war, einen Lineprinter zu simulieren mit vorgegebenen Druckspalten und dort einen Kalender auszugeben.
Ich habe die Lösung jetzt mal noch erweitert und eine Terminalsimulation per GUI als Option integriert. Wer also mal schnell einen Jahreskalender ausdrucken will in variabler Anzahl Monate nebeneinander (1, 2, 3, 4, 6, 12 sind möglich) kann sich das einfach in die Konsole ausgeben lassen und dann in eine druckbare datei kopieren.
Viel Spaß.
#Region - TimeStamp
; 2013-11-15 12:22:51
#EndRegion - TimeStamp
#include <Date.au3>
[/autoit] [autoit][/autoit] [autoit]; Anzahl Zeichen in jeder Zeile, Minimum ist 20 - ein Monat.
Global $iPrintSize = 80
; Anzahl Monate, die nebeneinander gedruckt werden sollen. Mit "0" wird das automatisch errechnet.
; Die Zahl wird korrigiert, wenn damit kein rechteckiger Ausdruck möglich ist.
; Wenn der Druckbereich zu schmal ist für die gegebene Anzahl Monate, wird diese automatisch errechnet.
Global $iSideBySide = 3
; Anzahl Leerzeichen zwischen den Monaten.
Global $iSpace = 4
; Titel festlegen
Global $sTitle = '[ MEIN KALENDER ]'
; Ausgabe in Konsole und/oder Terminalsimulation (GUI)
Global Const $_CONSOLE = 1
Global Const $_TERMINAL = 2
Global Const $_BOTH = BitOR($_CONSOLE, $_TERMINAL)
; Array mit Zellen-Labeln für Terminalsimulation
Global $aRawCol[1][2]
_CreateCalendar( 2013, $_BOTH )
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _CreateCalendar($_iYear, $_iOutput)
Local $aMon[12] = [' Januar ', ' Februar ', ' März ', _
' April ', ' Mai ', ' Juni ', _
' Juli ', ' August ', ' September ', _
' Oktober ', ' November ', ' Dezember ']
Local $sHead = 'Mo Di Mi Do Fr Sa So'
Local $aDaysInMonth[12] = [31,28,31,30,31,30,31,31,30,31,30,31]
If _DateIsLeapYear($_iYear) Then $aDaysInMonth[1] = 29
; == Datum mit in Wochentagstabelle für das gesamte Jahr verknüpfen
Local $aAllDaysInMonth[6][7][12] ; [ Zeilen ][ Wochentage ][ Monate ]
Local $iDay = 1, $iShift
For $i = 1 To 12
$iShift = _DateToDayOfWeekISO($_iYear, $i, 1) -1
For $j = 0 To 5
For $k = $iShift To 6
$aAllDaysInMonth[$j][$k][$i-1] = $iDay
$iDay += 1
If $iDay > $aDaysInMonth[$i-1] Then ExitLoop(2)
Next
$iShift = 0
Next
$iDay = 1
Next
; == Prüfe Anzahl Monate nebeneinander, berechnen wenn erforderlich
If $iSideBySide > 0 Then
If $iPrintSize < ($iSideBySide *(20 +$iSpace) -$iSpace) Then $iSideBySide = 0
EndIf
Switch $iSideBySide
Case 0
$iSideBySide = Int($iPrintSize /(20 +$iSpace))
If $iPrintSize < 20 Then Return _PrintLine($_iOutput, 'Escape: Size Error')
If $iPrintSize < (20 +$iSpace) Then $iSideBySide = 1
Case 5
$iSideBySide = 4
Case 7 To 11
$iSideBySide = 6
EndSwitch
; == Ausgabe auch in simuliertes Terminal
If BitAND($_iOutput, $_TERMINAL) Then
Local $iLines = 12 /$iSideBySide *8 + 6
ReDim $aRawCol[$iLines][$iPrintSize]
GUICreate('Simulated Printer', $iPrintSize*8, $iLines*16) ; Größe jeder Zelle: 8 px * 16 px
GUISetBkColor(0x00008E)
GUISetFont(9, 400, Default, 'Courier New')
For $i = 0 To $iLines -1
For $j = 0 To $iPrintSize -1
$aRawCol[$i][$j] = GUICtrlCreateLabel('', $j*8, $i*16, 8, 16, 2) ; $ES_RIGHT = 2
GUICtrlSetColor(-1, 0xFFFF22)
Next
Next
GUISetState()
EndIf
; == Leerzeichenstring erstellen
Local $sSpace = ''
For $i = 1 To $iSpace
$sSpace &= ' '
Next
; == Header drucken
_PrintLine($_iOutput, @LF)
_PrintLine($_iOutput, $sTitle, @LF)
_PrintLine($_iOutput, StringRegExpReplace($_iYear, '(\d)(\d)(\d)(\d)', '$1 $2 $3 $4'), @LF)
; == Daten für jede Zeile zusammenstellen/drucken in Abhängigkeit zur Anzahl Monate nebeneinander
Local $sLine, $iRight, $sTmp1, $sTmp2
For $n = 0 To 12 /$iSideBySide -1
$sTmp1 = ''
$sTmp2 = ''
For $z = 0 To $iSideBySide -1
$sTmp1 &= $aMon[$iSideBySide *$n+$z] & $sSpace
$sTmp2 &= $sHead & $sSpace
Next
_PrintLine($_iOutput, StringTrimRight($sTmp1, $iSpace))
_PrintLine($_iOutput, StringTrimRight($sTmp2, $iSpace))
For $j = 0 To 5
$sLine = ''
For $i = 1 To $iSideBySide
For $k = 0 To 6
$iRight = 3
If $k = 0 Then $iRight = 2
$sLine &= StringRight(' ' & $aAllDaysInMonth[$j][$k][$iSideBySide*$n+$i-1], $iRight)
Next
If $i < $iSideBySide Then $sLine &= $sSpace
Next
_PrintLine($_iOutput, $sLine)
Next
Next
If BitAND($_iOutput, $_TERMINAL) Then
Do
Until GUIGetMsg() = -3
EndIf
EndFunc ;==>_CreateCalendar
Func _PrintLine($_iOutput, $_sLine, $_sLF='')
Local Static $iLine = 0
If BitAND($_iOutput, $_CONSOLE) Then
Local $iLen = StringLen($_sLine)
Local $sSpace = '', $sLeft = ''
For $i = 1 To $iPrintSize-1
$sSpace &= ' '
Next
If $iLen < $iPrintSize Then $sLeft = StringLeft($sSpace, Int(($iPrintSize-$iLen)/2))
ConsoleWrite($sLeft & $_sLine & $_sLF & @LF)
EndIf
If BitAND($_iOutput, $_TERMINAL) Then
Local $aLine = StringSplit($_sLine, ''), $iIndexStart = 0
If $aLine[0] < $iPrintSize Then $iIndexStart = Int(($iPrintSize-$aLine[0])/2)
For $i = 1 To $aLine[0]
GUICtrlSetData($aRawCol[$iLine][$i+$iIndexStart], $aLine[$i])
Next
EndIf
$iLine += 1
If $_sLF <> '' Then $iLine += 1
EndFunc ;==>_PrintLine
[ MEIN KALENDER ]
2 0 1 3
Januar Februar März
Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 1 2 3 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 25 26 27 28 29 30 31
April Mai Juni
Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 7 1 2 3 4 5 1 2
8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9
15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16
22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23
29 30 27 28 29 30 31 24 25 26 27 28 29 30
Juli August September
Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 7 1 2 3 4 1
8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8
15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15
22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22
29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29
30
Oktober November Dezember
Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 1 2 3 1
7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
30 31
Alles anzeigen
So sieht die Terminal Simulation aus:
ich verstehe den sinn daran jemanden nicht zwingend wissen zu lassen das es sich um ein autoit programm geht und an welcher stelle, was passiert...
..und ich finde die Fragestellung selbst absurd. Es will mir einfach nicht in den Schädel, dass man sich so konsequent gegen Error-Handling sperrt. Eine Logdatei ist alles Mögliche - aber garantiert kein Error-Handling!
Das, was hier beim kompilierten Skript abgefangen werden soll, tritt doch niemals auf, wenn ein ordentliches Error-Handling existiert. Verzeiht meine Sturheit, aber ich sehe hier nur kein wirkliches Problem.
Ich komm mir gerade vor, wie ein Prediger: "Nimm nicht Weg A, dort fällst du in ein Loch" - "Ich weiß, dass da ein Loch ist, aber sag mir, wie ich am Besten in das Loch falle, ohne mir weh zu tun." :wacko:
kommen wir zurueck zu meiner Frage
Das war eine Antwort auf deine Frage! Das Vermeiden und Abfangen von Fehlern ist die einzig akzeptable Lösung.
Du willst doch nicht ernsthaft Fehlbedienungen ermöglichen und wartest jetzt auf die Eierlegende Wollmilchsau, die diese Fehler für dich abstellt.. :wacko:
Ich war ein paar Tage nicht on und weiß daher nicht, was genau hier gesagt und als anstößig empfunden wurde.
Grundsätzlich bin ich gegen überzogene Reglementierung. Ob die Inhalte tasächlich irgendwelche FSK-Kriterien tangiert haben weiß ich nicht, hege aber meine Zweifel daran.
Wenn in der SB tote Hose ist, stört es mich persönlich nicht wenn artfremde Themen bearbeitet werden. Jedoch sollte sofort bei Auftreten von AutoIt-relevanten Postings darauf gebührend Rücksicht genommen werden.
Bei allen Themen macht der Ton die Musik. Und ein Gag wird nicht lustiger, wenn man diesen in 30 weiteren Varianten wiedergibt.
Also bei allem Maß halten und allen ist gedient.
Ich denke nicht, dass Jugendgefährdung in irgendeiner Weise hier im Raum steht - man kann seine Bewertung von Gelesenem auch mit der falschen Brille betrachten. Extremismus sollte in jeder Richtung unterbleiben.
aber z.b. dass dann Arrayfehlermeldungen dann nicht als Arrayfehlermeldung erscheinen sondern als z.B: Skript hat ein Fehler -> Crash
Sorry - aber so etwas DARF in einem kompilierten Skript nicht auftreten. Dann hast du fehlerhaft programmiert.
Bis zu 60 % macht das ordentliche Errorhandling in einem Programm aus. Du mußt jede noch so absurde Situation vorhersehen und abfangen. Crashen darf ein Skript niemals.
Die einzig zulässigen Fehlermeldungen sind Infos an den User, wenn er Fehleingaben getätigt hat.
Wenn deine Rechner(bzw. deine Hardwarekomponenten) in der Kompatibilitätsliste ist, kannst du auf Win7 ja ein Virtual XP nutzen. Mit HDD ist das relativ lahm beim Laden aber auf einer SSD gehts geschmeidig fix. Insofern habe ich bei mir auf Dualboot verzichtet und nutze XP bei Bedarf in der Virtual - Umgebung.
Vielleicht solltest du dein Embedded IE auch mal in eine GUI einbinden? Einfach nur das Objekt erstellen reicht nicht, von allein wird es sich in keine GUI einnisten. ![]()
Schau dir einfach mal das Hilfebsp. an.
Kann ich per SQL mitgeben, dass er den a.title nur bis zu der Zeichenfolge " - " vergleichen soll?
Ja klar, deine Vergleichsmethode ist eigentlich einer SQL-DB unwürdig (mit "="). Damit findet man ja wirklich nur einen sehr fixen Datenbestand. Hast du schonmal was von LIKE gehört?
Damit kannst du die Suche wesentlich flexibler gestalten. LIKE und IN sind meine persönlich am Häufigsten genutzten Suchmethoden.
Falls letzteres kann ich nur empfehlen es als Standart-Einstellung zu handhaben, so funktionieren 90% aller Foren und wüsste nicht was dagegen spricht.
Ich bin der Meinung, weniger ist mehr. Wer möchte kann das ja aktivieren. Aber wozu soll ich unnötigen Traffic generieren, wenn es nicht gewollt ist?
Und ich suche das Forum ja nicht nur auf, wenn es eine Antwort auf ein bestimmtes Thema gegeben hat, dazu bin ich viel zu sehr Forist. ![]()
(übrigens heißt es Standard - einfach an Standardisierung denken ;))
Frage beantwortet.
Bitte setze deinen Startpost auf "gelöst".
Alle AutoIt-Lösungen sind hier leider ein Rumgemurkse.
Verwende besser NirCmd.
Hi,
ist noch einfacher als ich dachte:
[autoit]
#Include <Constants.au3>
#Include <WinAPI.au3>
$WM_MEINE_MESSAGE = _WinAPI_RegisterWindowMessage("MEINE_MESSAGE")
[/autoit][autoit][/autoit][autoit]$hGUI = GUICreate("Test")
GUISetState()
GUIRegisterMsg($WM_MEINE_MESSAGE , '_WM_MEINE_MESSAGE')
[/autoit][autoit][/autoit][autoit]_SendString($hGUI, $WM_MEINE_MESSAGE, 'Test-String')
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Func _SendString($hWnd, $iMsg, $sString)
_SendMessage($hWnd, $iMsg, StringLen($sString), $sString, 0, "wparam", "str")
; == als "wParam" übergibst du die Stringlänge, "lParam" wird nicht verwendet sondern "str"
; == In der Messagefunktion wird der String als Pointer empfangen
; == Mit Hilfe der übergebenen Stringlänge wird der Pointer in eine Struktur entladen und ausgelesen
EndFunc
Func _WM_MEINE_MESSAGE( $hWnd , $iMsg , $wParam , $lParam)
Local $sLen = BitAND($wParam, 0xFFFF) ; Low Word
Local $tMsg = DllStructCreate('char[' & $sLen & ']', $lParam)
ConsoleWrite(DllStructGetData($tMsg, 1) & @LF)
EndFunc
Edit:
Wenn du mit deiner eigenen Message unterschiedliche Varianten senden möchtest (also eventuell mal String, mal Struktur), kannst du dazu auch einfach "wparam" nutzen. Du setzt dann z.B. im Lo-Byte die Länge und im Hi-Byte "-1" als Trigger dass ein String übergeben wurde.
Hier mal im Bsp. beide Versionen
#Include <Constants.au3>
#Include <WinAPI.au3>
Global $tag_MY_SENDSTRUCT = "int size;char timestring[8];char datestring[10];" ; == eigene Struktur-Konstante
[/autoit] [autoit][/autoit] [autoit]$WM_MEINE_MESSAGE = _WinAPI_RegisterWindowMessage("MEINE_MESSAGE")
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate("Test")
GUISetState()
GUIRegisterMsg($WM_MEINE_MESSAGE , '_WM_MEINE_MESSAGE')
[/autoit] [autoit][/autoit] [autoit]; == Text senden
_SendMyMessage($hGUI, $WM_MEINE_MESSAGE, 'Test-String')
; == Struktur senden
$tSEND = DllStructCreate($tag_MY_SENDSTRUCT)
$pSEND = DllStructGetPtr($tSEND)
DllStructSetData($tSEND, 1, DllStructGetSize($tSEND))
DllStructSetData($tSEND, 2, @HOUR & ':' & @MIN & ':' & @SEC)
DllStructSetData($tSEND, 3, @YEAR & '/' & @MON & '/' & @MDAY)
_SendMyMessage($hGUI, $WM_MEINE_MESSAGE, $pSEND, 0)
Func _SendMyMessage($hWnd, $iMsg, $lParam, $wParamLo=-1, $wParamHi=0)
Local $s_lParam = 'lparam'
If $wParamLo = -1 Then ; == lParam ist String
$wParamLo = StringLen($lParam)
$wParamHi = -1
$s_lParam = 'str'
EndIf
_SendMessage($hWnd, $iMsg, _WinAPI_MakeLong($wParamLo, $wParamHi), $lParam, 0, "wparam", $s_lParam)
EndFunc
Func _WM_MEINE_MESSAGE( $hWnd , $iMsg , $wParam , $lParam)
Local $iLo = BitAND($wParam, 0xFFFF)
Local $iHi = BitShift($wParam, 16)
If $iHi = -1 And $iLo > 0 Then ; == String
Local $sLen = $iLo
Local $tMsg = DllStructCreate('char[' & $sLen & ']', $lParam)
ConsoleWrite(DllStructGetData($tMsg, 1) & @LF)
Else
Local $tRECEIVE = DllStructCreate($tag_MY_SENDSTRUCT, $lParam)
ConsoleWrite('Size' & @TAB & DllStructGetData($tRECEIVE, 1) & @LF)
ConsoleWrite('Time' & @TAB & DllStructGetData($tRECEIVE, 2) & @LF)
ConsoleWrite('Date' & @TAB & DllStructGetData($tRECEIVE, 3) & @LF)
EndIf
EndFunc
Wie versende ich einen String als Window Message?
Ich habs bisher nicht gebraucht, würde aber versuchen den String in eine Struktur zu packen (0-terminiert) und dann versenden. Dann kannst du den empfangenen Pointer sofort in eine identische Struktur entpacken und hast den Wert.
Na die Funktion steckt doch drinnen: btMeasureClick() nimmt die Berechnung vor, mit den Werten die in der GUI eingegeben wurden.
Das su vereinzeln sollte doch kein Problem darstellen.
Nun, das kann natürlich nicht funktionieren, da du den Hook auf einem nicht existierenden Fensetr aufsetzt!
[autoit]$autoItWin = WinGetHandle( AutoItWinGetTitle() )
[/autoit]Das gibt es gar nicht zu diesem Zeitpunkt.Verwende einfach mal:
[autoit]$autoItWin = WinGetHandle( WinGetTitle('[ACTIVE]') )
[/autoit], dann siehst du, dass es funktioniert. ![]()
Also ich kann einen Crash nur reproduzieren, wenn die Mainloop ohne jede Unterbrechung läuft.
Ich arbeite viel mit Message-Hooks und hatte bisher noch nie einen permanenten Fehler. AutoIt ist nicht optimal im Umgang mit Callbacks, aber trotzdem sind Crashs recht selten.
Ich habe z.B. ein Kontextmenü-Ctrl darauf basierend erstellt und das habe ich noch nie gecrasht.
Funktioniert tadellos, wenn du deine Programmschleife mal aus der Dauerlast nimmst und Sleep oder GuiGetMsg einbaust. ![]()
#Include <Constants.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>
$hDateGuiWrapper = GUICreate( "" )
GUISetState() ; SOBALD DAS AUSKOMMENTIERT WIRD HÄNGT SICH DAS SKRIPT AUF OHNE FEHLERMELDUNG !!!!!
$hHook = DllCallbackRegister( '_WinProc' , 'ptr' , 'hwnd;uint;long;str' ) ; 1 - Callback vorbereiten:
$pHook = DllCallbackGetPtr( $hHook )
$autoItWin = WinGetHandle( AutoItWinGetTitle() )
$hProc = _WinAPI_SetWindowLong( $autoItWin , $GWL_WNDPROC, $pHook ) ; 2 - Window Proc austauschen
$WM_TEST = _WinAPI_RegisterWindowMessage( "testMessage" ) ; 3 - eigene Window-Message-Art erstellen:
[/autoit] [autoit][/autoit] [autoit]_SendMessage( $autoItWin , $WM_TEST , 55 , "Test" , 0 , "wparam" , "str" ) ; 4 - Testnachricht schicken
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Func _WinProc( $hWnd , $iMsg , $wParam , $lParam )
Local $Res = _WinAPI_CallWindowProc( $hProc, $hWnd, $iMsg, $wParam, $lParam )
if $wParam == 55 Then
;~ Beep( 500, 200 )
ConsoleWrite('BLA' & @LF)
EndIf
Return $Res
EndFunc
NB: "==" ist für sensitiven Vergleich bei Strings, für alle anderen Vergleiche reicht das "=".