GuiSetState setzt man nur ohne Parameter ein, wenn man irgendwelche Wettbewerbe bestreiten will und die 5 Bytes einsparen will.
Beiträge von Mars
-
-
Eine automatische Erkennung, welches Array denn gerade übergeben wird, kann man ja auch nicht ohne Verrenkungen realisieren. Das erfordert dann irgendeine Form der Registrierung/ID-Vergabe. Stimmt schon - optimal geht anders..
Und wiedereinmal stoßen wir an diese Grenze. Wie oft sind wir in den letzten 2 Wochen denn hier gelandet ?
- Funktionen die "wissen" welche Variablen in den Parametern stecken
- Funktionen die "wissen" von welcher Variable sie aufgerufen wurden
- Die Unterscheidung mehrer Variablen ohne den Inhalt zu beeinflussen, usw usw.Gerade für Arrays gibts doch intern irgendwelche IDs. Man kann ja 2 identische Arrays mal mit "=" vergleichen und wird feststellen dass irgendein Pointer oä verglichen wird und nicht der Inhalt.
-
Moin,
Wer schonmal die Standardversion von _ArrayToString benutzt hat weiß, dass diese Funktion extrem schnell an ihre Grenzen stößt.
Eine vollständige Rekonstruktion eines Arrays ist nur möglich, wenn das komplette Array ausschließlich Strings enthält die jeweils NICHT den Seperator enthalten. Im Prinzip also ein Spezialfall eines Spezialfalls einer allgemeinen Anwendung.Was kann ArrayToStringEx ?
Es kann genau das was der Name vermuten lässt, es verwandelt ein (relativ) beliebiges Array in einen String. Mit der Umkehrfunktion _StringToArrayEx lässt sich dieses Array wieder vollständig aus dem String rekonstruieren. Dabei werden fast alle in AutoIt möglichen Datentypen ebenfalls wiederhergestellt.Sie kann ein 1D oder 2D Array vollständig in einen String umwandeln. Der String liegt als Base256 vor, falls man ihn "ansehen" will sollte man also ein StringToBinary zwischenschalten.
Unterstützt wird fast alles, daher zähle ich die Sachen auf die nicht unterstützt werden:- Arrays mit einer Dimension höher als 2 (also 3D, 4D, usw)
- Der Map Variablentyp (der wird noch nachgeliefert, sobald Maps in der Stable vertreten sind und ich genug Lust habe weiterzubasteln)
- DllStructs (Es gibt das Problem, dass der interne Aufbau einer Struct im nachhinein nicht mehr ermittelt werden kann. Eine Struct lässt sich z.B. assoziativ herrichten, sodass man zur Rekonstruktion einer Struct den vollständigen String benötigt der DllStructCreate übergeben wurde)
- Objekte (Sind von Natur aus nicht Zeitunabhängig und beinhalten Verzweigungen im RAM die nicht "allgemein" erfassbar sind. Daher ist es unmöglich Objekte zu "speichern")
Edit: 16.Aug.15 (AutoIt 3.3.12.0)
Es gibt einige kleine Erneuerungen.- Neuer unterstützer Datentyp: "Datei" -> Es können nun auch Dateien (via Dateiname in einem Array) mittels ArrayToStringEx in einen String gepackt werden. Im Ergebnis von StringToArrayEx ist dann allerdings der Dateiinhalt, es werden also keine neuen Dateien angelegt. Damit lässt sich ArrayToString auch als Containerformat für Dateien verwenden.
- Neuer unterstützer Datentyp: "GDIPlus Bitmap" -> Klingt komisch, ist aber so. Man kann jetzt z.B. ein Array aus GDI+ Bitmaps/Images als String speichern und später wieder laden. Damit lässt sich ArrayToString auch als Containerformat für viele (kleine) GDI+ Bilder nutzen.
- Das Zu- und Abschalten dieser Möglichkeiten wird mit _ArrayToStringOpt vorgenommen (hier werden in Zukunft ggf. noch weitere Einstellungsmöglichkeiten folgen).
Edit: 07.Feb.23 (AutoIt 3.3.16.1)
Bugfixes.
- Das Speicher von GDI+ Bildern hat (vermutlich seit einigen Jahren) nicht mehr funktioniert, da irgendwo irgendetwas bei FileRead, oder der Handhabung vom Binary Datentyp geändert wurde.
- UserFunction hat als Datentyp nicht funktioniert.
- AspirinJunkie hat eine standadisierte Methode verwendet die dasselbe kann (aber vermutlich besser ist) angewendet um eine UDF zu schreiben. Außerdem wird der Map Datentyp unterstützt (weshalb ich das hier nicht hinzufüge, Sachen mehrfach zu machen bringt ja nichts). CBOR-UDF
Die Funktion ist ausdrücklich NICHT auf geringe Stringgröße optimiert, der Output besitzt idr eine hohe Redundanz und Komprimierbarkeit. (Hier könnte man die in UEZ' B64-Skript verwendete LZ-Funktion benutzen)
Falls Fehler, Anregungen, Vorschläge auftauchen, so lasst es mich wissenlg
M -
-
Leider wird der Staat von den USA nicht anerkannt und ausgebombt.
Ich wünsche mir einen heißen Kaffee !
-
Bekommst du, leider ist das schlechte Wetter gerade bei mir zu Hause, sodass ich nicht rausgehen kann
Ich wünsche mir eine Erklärung für die rege Teilnahme in diesem Thread, obwohl der Postcounter als virtueller Schwanzvergleich seit einiger Zeit nicht mehr unter dem Profilbild angezeigt wird.
-
Moin,
Du darfst selbstverständlich alle Kriterien erörtern, die meisten Personen hier sind Lernfähig und Lernwillig.
Eine IDE mit etwas mehr Schnickschnack gibt es unter dem Namen ISN-AutoIt Studio. (Auch wenn ich glaube dass du die spartanische Aufmachung von SciTE bevorzugst)Apropos sauberer Code:
[autoit]#forcedef $6
[/autoit]
ConsoleWrite('log(x^2) = 1/x -> x = ' & n('log(x^2)', '1/x') & @CRLF)
Func n($0,$1,$2=1,$3=Assign,$4=StringReplace) ; Newton verfahren
Return IsString($1)?n($0&'-('&$1&')',0,$2):0*$3(6,Execute($4($0,'x',$2)))*$3(2,$2-$6/(Execute($4($0,'x',$2+1/10^9))-$6)/10^9)+$1=999?$2:n($0,$1+1,$2)
EndFunc
lg
M -
Es fehlen noch 2 wirklich simple Sachen, damit man richtige "Objekte" damit erzeugen kann.
1. Der Aufruf von minx mit $a.methode('s') muss funktionieren
2. Im Aufruf muss eine $self (oä) Variable bestehen die ByRef auf die Map wirken kann.Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Global $selfTest()
[/autoit] [autoit][/autoit] [autoit]Func Test()
[/autoit] [autoit][/autoit] [autoit]Local $Ball1 = Ball(100, 100, 50)
[/autoit] [autoit][/autoit] [autoit]
Local $Ball2 = Ball(200, 200, 100)$self = $Ball1 ; Das hier muss weg -> Der Funktionsaufruf braucht eine Referenz zur aufrufenden Map
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Ball1: ' & Call($Ball1.GetPos)[0] & ',' & Call($Ball1.GetPos)[1] & @CRLF)
$self = $Ball2
ConsoleWrite('Ball2: ' & Call($Ball2.GetPos)[0] & ',' & Call($Ball2.GetPos)[1] & @CRLF)$self = $Ball1
[/autoit] [autoit][/autoit] [autoit]
Call($Ball1.Move, 10, 10) ; Die dummen Calls sollte man eigentlich garnicht brauchen, IsFunc gibt 1 zurück !
ConsoleWrite('Ball1: ' & Call($Ball1.GetPos)[0] & ',' & Call($Ball1.GetPos)[1] & @CRLF)$self = $Ball2
[/autoit] [autoit][/autoit] [autoit]
Call($Ball2.Move, 1000, 1000, 200)
ConsoleWrite('Ball2: ' & Call($Ball2.GetPos)[0] & ',' & Call($Ball2.GetPos)[1] & @CRLF)EndFunc
[/autoit] [autoit][/autoit] [autoit]Func Ball($mx, $my, $d)
[/autoit] [autoit][/autoit] [autoit]; Konstruktor
[/autoit] [autoit][/autoit] [autoit]
Local $Ball[]
$Ball.X = $mx
$Ball.Y = $my
$Ball.D = $d; Methoden
[/autoit] [autoit][/autoit] [autoit]
$Ball.Move = __BallSetPos
$Ball.GetPos = __BallGetPosReturn $Ball
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func __BallGetPos()
[/autoit] [autoit][/autoit] [autoit]
Local $a[] = [$self.X, $self.Y]
Return $a
EndFuncFunc __BallSetPos($mx, $my, $d = 0)
[/autoit]
$self.X = $mx
$self.Y = $my
If $d Then $self.D = $d
EndFunc
Das $self Problem lässt sich leider nicht so einfach (auch nicht mit Workarounds) umgehen, da die Funktion keinerlei Information besitzt von wo sie aufgerufen wurde. -
Ich bin für 1.
zu 2: 3D Engines gibt es schon einige und die wahrscheinlichkeit dass im Zuge einer Ausarbeitung eine (für AutoIt) bessere Engine als D3D oder Irrlicht oder GL entsteht ist eher gering. Im Endeffekt ist es sinnvoller sich in eine bestehende Engine einzuarbeiten als eine neue zu schreiben.
zu 3: Prozedurale Grafiken sind eine schöne Sache. Da ich mich damit aber selbst schon ausgiebig beschäftigt habe und sie bereits an einigen Stellen nutze brauche ich hier kein Tutorial. Zudem wird es wenn es um CPU/GPU geht kaum noch was mit AutoIt zu tun haben.
zu 1: Hierzu habe ich beim Studium schon eine kleine Ausarbeitung machen müssen (iiiiih, Java) und 100/100 kassiert. Das Thema ansich ist meiner Meinung nach interessant und ggf für KIs, Bilderkennung, allgemeine Optimierungen nutzbar.
Ich freue mich jedenfalls auf ein Tutorial für Fortgeschrittene, egal zu welchem Thema
-
Das mit dem aktuell bleiben ist zurzeit so ne Sache. Viele User wollen nicht updaten, da einige Funktionen oder Konstanten jetzt andere Namen haben. Dadurch werden die meisten "großen" Skripte instabil oder funktionieren garnicht mehr. Ich habe mir aber die Mühe gemacht und etliche Male die blöde (aber richtigere) Bitmapstruct ersetzt, oder die unnötige Umbenennung der GDI+ Dllvariable berücksichtigt usw usw.
Ich mache niemandem einen Vorwurf, allerdings werde ich immer (halbwegs) aktuell bleiben (meistens kompatibel mit der letzten "Stable"). -
Ich nutze die Stable 3.3.12.0.
Problem 1: Ternärer Operator
[autoit]; Alt
[/autoit]
If [Ausdruck1] Then
$a = [Ausdruck2]
Else
$a = [Ausdruck3]
EndIf
; Neu
$a = [Ausdruck1] ? [Ausdruck2] : [Ausdruck3]
[autoit]
Problem 2: Implizite Arraydeklaration; Alt
[/autoit]
Local $a[3] = [1, 2, 3]
; Neu
Local $a = [1, 2, 3]
lg
M -
Moin,
Mithilfe der UDF lassen sich Datensätze in einen String verpacken und anschließend wieder entpacken. (klingt jetzt nicht so überragend, kann aber vieles vereinfachen)
Es kann ein Container (in dem Fall ein einfaches Array) erzeugt werden.
Diesem Container können Datensätze, bestehend aus Daten|Index|Beschreibung, hinzugefügt werden
Anschließend kann man den Container in einen String verwandeln und diesen z.B. als Datei speichern.
Die Daten dürfen nicht vom Typ DllStruct sein, da diese nicht vollständig rekonstruierbar sind. (Man kann zwar die Größe in Erfahrung bringen, aber nicht den Aufbau).Anwendungsbeispiele:
Ein Skript enthält einige Bilder, Sounds, usw. Man kann all diese Inhalte in einen Container stecken und z.B. mit 'Pic01' oder 'Snd01' durchnummerieren. In der Beschreibung steht dann ggf eine spezifischere Definition. Den damit erzeugten String kann man einfach in eine Datei schreiben, und die Daten dem Skript somit austauschbar zur Verfügung stellen.
Für kleine Spiele kann man damit auch Savegames in einer Datei speichern (ein Savegame besteht aus einer Vielzahl verschiedener Daten die man am besten in einer einzigen Datei verstaut).
uvm.Selbstverständlich kann man für alles was die UDF bietet auch die Ini-Funktionen benutzen. Als Index dient hier der Key, und via Key lässt sich der Datensatz ermitteln der z.B. ein B64 Bild enthalten kann.
Ich habe darauf geachtet, dass der Container unabhängig vom Inhalt (bei Strings) funktionieren sollte (dafür gibts aber keine Garantie), sodass z.B. eine B64 Umrechnung nicht mehr notwendig ist.lg
M -
Und dafür habe ich extra ne halbe Stunde das Deutsche Forum durchsucht...
Vielen Dank für die Info -
Minx und ich hatten das gleiche Verfahren irgendwann in der Vergangenheit mal auf einige wenige Bytes heruntergebrochen.
Leider finde ich diese Version nicht mehr. Im Forum liegt sie garantiert irgendwo... -
Der folgende Vorschlag ist ausdrücklich unoptimiert.
(Geschwindigkeitsfaktor >10 ist locker drin. Vorallem beim ArrayAdd (da jedes Mal ReDim genutzt wird))Er soll nur eine einfache Möglichkeit aufzeigen:
Vorher
- 10 Rechtecke/Pixel (warum so viele ?)
- Einfache Linie ohne Effekte (Einfluss höchstens Farblich möglich)
- Stufen in der LinieNachher
- 1 Punkt/Pixel (man kann auch weniger nehmen, aber die Geschwindigkeit reicht locker aus um diese Genauigkeit zu bieten)
- Linie wird per GraphicsDrawCurve gezeichnet -> Smoothing sowie Penwahl möglich !Todo:
Code ansehen und verstehen -> Code verbessernSpoiler anzeigen
[autoit]#include <GdiPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>Opt("MouseCoordMode", 2)
[/autoit] [autoit][/autoit] [autoit]
$hGUI = GUICreate("Funktionsplotter", 700, 418, -1, -1)GUICtrlCreateLabel("", 424, 168, 260, 1, 7)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel("", 424, 272, 260, 1, 7)Local $fXMin, $fXMax, $fYMin, $fYMax, $sEquation, $iMouseTemp
[/autoit] [autoit][/autoit] [autoit]$hXMin = GUICtrlCreateInput("-10", 488, 14, 57, 34, 1)
[/autoit] [autoit][/autoit] [autoit]
$hXMax = GUICtrlCreateInput("10", 488, 54, 57, 34, 1)
$hXScale = GUICtrlCreateInput("1", 488, 94, 57, 34, 1)
$hYMin = GUICtrlCreateInput("-10", 624, 14, 57, 34, 1)
$hYMax = GUICtrlCreateInput("10", 624, 54, 57, 34, 1)
$hYScale = GUICtrlCreateInput("1", 624, 94, 57, 34, 1)
$hAxis = GUICtrlCreateCheckbox("Achsen", 424, 136, 89, 17)
$hXValue = GUICtrlCreateLabel("0", 496, 288, 183, 30, 1)
$hYValue = GUICtrlCreateLabel("0", 496, 320, 183, 30, 1)
$hEquation = GUICtrlCreateInput("sin(cos(x))^9*13+sin(3.4*x)", 424, 214, 257, 34, 1)
$hDrawGraph = GUICtrlCreateButton("Zeiche Graphen", 416, 361, 275, 49)Local $aControls[20] = [GUICtrlCreateLabel("XMin:", 424, 16, 56, 30), GUICtrlCreateLabel("XMax:", 424, 56, 60, 30), GUICtrlCreateLabel("XScale:", 424, 96, 67, 30), _
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel("YMin:", 560, 16, 55, 30), GUICtrlCreateLabel("YMax:", 560, 56, 59, 30), GUICtrlCreateLabel("YScale:", 560, 96, 66, 30), _
GUICtrlCreateLabel("Funktion:", 424, 184, 86, 30), GUICtrlCreateLabel("X Wert:", 424, 288, 71, 30), GUICtrlCreateLabel("Y Wert:", 424, 320, 70, 30), _
$hXMin, $hXMax, $hXScale, $hYMin, $hYMax, $hYScale, $hAxis, $hXValue, $hYValue, $hEquation, $hDrawGraph]For $i = 0 To UBound($aControls) - 1
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetFont($aControls[$i], 16, 800, 0, "Calibri")
NextGUICtrlSetState($hAxis, 1)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI), _
$hWhiteBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF), _
$hRedBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
[/autoit] [autoit][/autoit] [autoit]_DrawFrame()
[/autoit] [autoit][/autoit] [autoit]OnAutoItExitRegister("_CleanExit")
[/autoit] [autoit][/autoit] [autoit]While Sleep(10)
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case -3
_CleanExit()Case $hDrawGraph
[/autoit] [autoit][/autoit] [autoit]
_DrawFrame()EndSwitch
[/autoit] [autoit][/autoit] [autoit]If $iMouseTemp <> MouseGetPos(0) and MouseGetPos(0) >= 8 and MouseGetPos(0) <= 408 and MouseGetPos(1) >= 8 and MouseGetPos(1) <= 408 Then
[/autoit] [autoit][/autoit] [autoit]
$fXMin = Number(GUICtrlRead($hXMin))
$fXMax = Number(GUICtrlRead($hXMax))
$sEquation = StringReplace(GUICtrlRead($hEquation), ",", ".")
$iMouseTemp = MouseGetPos(0)GUICtrlSetData($hXValue, Round((MouseGetPos(0) - / 400 * (Abs($fXMin) + Abs($fXMax)) + $fXMin, 5))
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($hYValue, Round(Execute(StringReplace($sEquation, "x", (MouseGetPos(0) - / 400 * (Abs($fXMin) + Abs($fXMax)) + $fXMin)), 5))
EndIf
WEndFunc _DrawFrame()
[/autoit] [autoit][/autoit] [autoit]
Local $fXMin = Number(GUICtrlRead($hXMin)), $fXMax = Number(GUICtrlRead($hXMax)), _
$fYMin = Number(GUICtrlRead($hYMin)), $fYMax = Number(GUICtrlRead($hYMax)), _
$fXScale = Number(GUICtrlRead($hXScale)), $fYScale = Number(GUICtrlRead($hYScale)), _
$sEquation = StringReplace(GUICtrlRead($hEquation), ",", "."), $fTmp, _
$iX = -1 * $fXMin / (Abs($fXMin) + Abs($fXMax)) * 398 + 9, _
$iY = -1 * $fYMin / (Abs($fYMin) + Abs($fYMax)) * 398 + 9, _
$aPoints[1][2]_GDIPlus_GraphicsFillRect($hGraphics, 8, 8, 400, 400, $hWhiteBrush)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawRect($hGraphics, 8, 8, 400, 400)If $fXMin > $fXMax Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(16, "Fehler", "XMin ist größer als XMax.")
ElseIf $fYMin > $fYMax Then
MsgBox(16, "Fehler", "YMin ist größer als YMax.")
Else
If BitAND(GUICtrlRead($hAxis), 1) and $fXMin * $fXMax < 0 Then
_GDIPlus_GraphicsDrawLine($hGraphics, $iX, 8, $iX, 408)
For $i = $fYMin To $fYMax Step $fYScale
_GDIPlus_GraphicsDrawLine($hGraphics, $iX - 3, (-1 * ($i - $fYMin) / (Abs($fYMin) + Abs($fYMax)) * 398 + 9) + 398, $iX + 3, (-1 * ($i - $fYMin) / (Abs($fYMin) + Abs($fYMax)) * 398 + 9) + 398)
Next
EndIf
If BitAND(GUICtrlRead($hAxis), 1) and $fYMin * $fYMax < 0 Then
_GDIPlus_GraphicsDrawLine($hGraphics, 8, $iY, 408, $iY)
For $i = $fXMin To $fXMax Step $fXScale
_GDIPlus_GraphicsDrawLine($hGraphics, ($i - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 398 + 9, $iY - 3, ($i - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 398 + 9, $iY + 3)
Next
EndIfFor $i = $fXMin To $fXMax Step (Abs($fXMin) + Abs($fXMax)) / 398
[/autoit] [autoit][/autoit] [autoit]
;~ _GDIPlus_GraphicsDrawLine($hGraphics, ($i - (Abs($fXMin) + Abs($fXMax)) / 400 - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 400 + 8, _
;~ (-1 * Execute(StringReplace($sEquation, "x", $i - (Abs($fXMin) + Abs($fXMax)) / 400)) - $fYMin) / (Abs($fYMin) + Abs($fYMax)) * 400 + 8, _
;~ ($i - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 400 + 8, _
;~ (-1 * Execute(StringReplace($sEquation, "x", $i)) - $fYMin) / (Abs($fYMin) + Abs($fYMax)) * 400 + 8, $hRedBrush)$fTmp = (-1 * Execute(StringReplace($sEquation, "x", $i)) - $fYMin) / (Abs($fYMin) + Abs($fYMax)) * 398 + 9
[/autoit] [autoit][/autoit] [autoit]If $fTmp >= 9 and $fTmp <= 407 Then
[/autoit] [autoit][/autoit] [autoit]
_ArrayAdd($aPoints, ($i - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 398 + 9 & '|' & $fTmp)
EndIf;~ _GDIPlus_GraphicsFillRect($hGraphics, ($i - $fXMin) / (Abs($fXMin) + Abs($fXMax)) * 398 + 9, $fTmp, 1, 1, $hRedBrush)
[/autoit] [autoit][/autoit] [autoit]
Next
EndIf$aPoints[0][0] = UBound($aPoints) - 1
[/autoit] [autoit][/autoit] [autoit]
;~ _ArrayDisplay($aPoints)
Local $hPen = _GDIPlus_PenCreate(0xFF402010, 2)
_GDIPlus_GraphicsDrawCurve($hGraphics, $aPoints, $hPen)
_GDIPlus_PenDispose($hPen)EndFunc
[/autoit] [autoit][/autoit] [autoit]Func _CleanExit()
[/autoit]
_GDIPlus_BrushDispose($hRedBrush)
_GDIPlus_BrushDispose($hWhiteBrush)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc
lg
M -
Das liegt vermutlich am verschiedenen Seitenverhältnis.
Es tut mir jetzt schon leid für den riesigen Screenshot
Bei mir läufts wunderbar, habe 2 Bildschirme mit jeweils 16:10. Läuft auf beiden parallel flüssig und "rund".Mir ist aufgefallen, dass Apps nicht übermalt werden. Habe aber auch keine Idee, wie man da etwas machen kann, Apps sind so ne Sache^^
System ist Win8.1, Auflösungen sind 1920x1200 und 1680x1050lg
M -
Wer sich natürlich einen Thread aufmacht und dann gestrichene 9h nicht nachsieht was abgeht, der hat keine Chance
-
@error wird nach jedem Funktionsaufruf gelöscht. Ihn als letztes abzufragen ist also sinnlos
-
Der Rechenaufwand zur Textsynthese aus Bildern (gilt selbstverständlich auch für Zahlen) ist weit über dem was mit AutoIt (nativ) möglich ist.
Das Problem bei der Sache ist, dass es keine "Formel" gibt um aus einem Haufen Pixel einen Buchstaben zu zaubern. Es gibt verschiedene Schriftarten, verschiedene Textgrößen, verschiedene Schriftfarben, usw.Im Prinzip ist diese Sache ähnlich wie eine klassische Vektorisierung (und die ist selbst mit guter Software heutzutage nicht immer Fehlerlos).
Das Problem muss anders angegangen werden. Dazu müsste aber bekannt sein woher die Zahl auf deinem Bildschirm kommt. Browser haben z.B. HTML (das kann man absuchen und die gewünschte Zahl herausfiltern).
Edit: Wenn man Alle Parameter der Schrift kennt ist es eventuell mit ImageSearch möglich einzelne Zahlen zu finden.
lg
M -
Ohje...
Da habe ich wohl nicht richtig gelesen