Die Objekte aus .NET waren nur ein Beispiel. Es handelt sich eher um eine grundsätzliche Fragestellung, nicht darum ob alles, was in der .NET-Klassenbibliothek definiert ist, auch mittels COM angesprochen werden kann. Um wieder auf das Beispiel zurückzukommen:
Kann ich mittels COM ein System.Collections.Stack Objekt erzeugen, dass dem überladenen Konstruktor Stack(Int32) der .NET Framework-Klassenbibliothek entspricht? Bzw. welches Tool liefert mir genauere Informationen darüber, welche COM-Objekte und Methoden darauf auf meinem System zur Verfügung stehen?
Beiträge von teh_hahn
-
-
Hi,
zwei kurze Fragen:- Gibt es eine Möglichkeit in AutoIt ein Objekt mittels COM zu erzeugen und dabei anzugeben, welchen Konstruktoraufruf man gerne hätte? Ein Beispiel wäre z.B. der .NET Stack?
- Gibt es eine Möglichkeit in AutoIt mittels COM eine statische Methode aufzurufen? Also nicht ObjCreate("NAMESPACE.CLASS").METHOD, sondern NAMESPACE.CLASS.METHOD?
Falls beides nicht mit COM möglich ist, kann mir jemand erläutern, wie ich das Ganze über DllCalls realisieren kann? Wie wird da von außen überhaupt ein Konstuktoraufruf realisiert?
Danke.
-
Alles klar, dann evtl. aus der Signatur nehmen. Wie schon an anderer Stelle angemerkt, kann dies bei Einsteigern/Neulingen den falschen Eindruck erwecken. Sollte auch kein schlechter Kommentar sein:
ZitatBei extrem häufiger Nutzung könnten diese aber durchaus Anwendung finden (weniger Schreibarbeit)...
Deine Funktionen haben mir immerhin Anregung für meine String-Bibliothek geliefert... -
Hi, da ich gerade auf der Suche nach String-Funktionen war, bin ich auf diesen Thread gestoßen. Deine Funktionen sind leider mehr oder weniger überflüssig, um sie in AutoIt einzusetzen. Folgender Code macht exakt identisches und fängt Fehler ab:
Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]Func _String_CheckState(Const $S)
[/autoit] [autoit][/autoit] [autoit]
Local $fReturn = False
If StringIsLower($S) Then
$fReturn = True
ElseIf StringIsUpper($S) Then
$fReturn = False
Else
SetError(1)
EndIf
Return $fReturn
EndFunc ;==>_String_CheckStateFunc _String_GetCharacter(Const $S, Const $iINDEX)
[/autoit] [autoit][/autoit] [autoit]
Return StringMid($S, $iINDEX, 1)
EndFunc ;==>_String_GetCharacterFunc _String_GetChars_FromTo(Const $S, Const $iSTART, Const $iEND)
[/autoit] [autoit][/autoit] [autoit]
Return StringMid($S, $iSTART, _String_GetLen_FromTo($S, $iSTART, $iEND))
EndFunc ;==>_String_GetChars_FromToFunc _String_GetLen_FromTo(Const $S, Const $iSTART, Const $iEND)
[/autoit] [autoit][/autoit] [autoit]
Return ($iEND - $iSTART + 1)
EndFunc ;==>_String_GetLen_FromToFunc _String_ToArray(ByRef $avArray, Const $S, Const $iINDEX)
[/autoit] [autoit][/autoit] [autoit]
Local Const $iSIZE = UBound($avArray)If Not UBound($avArray, 0) = 1 Then Return SetError(1, 0, False)
[/autoit] [autoit][/autoit] [autoit]
If $iINDEX < 0 Or $iINDEX > $iSIZE Then Return SetError(2, 0, False)ReDim $avArray[$iSIZE + 1]
[/autoit] [autoit][/autoit] [autoit]For $i = $iSIZE To ($iINDEX + 1) Step -1
[/autoit] [autoit][/autoit] [autoit]
$avArray[$i] = $avArray[$i - 1]
Next$avArray[$iINDEX] = $S
[/autoit]
Return True
EndFunc ;==>_String_ToArray
Wobei, wie bereits angemerkt, _String_ToArray schon als _ArrayInsert existiert (und meiner Meinung nach auch einer Array-Funktion darstellt und keine String-Funktion). Des Weiteren machen _String_CheckState und _String_GetLen_FromTo wenig Sinn, wobei nur noch zwei Einzeiler-UDFs übrig bleiben... Bei extrem häufiger Nutzung könnten diese aber durchaus Anwendung finden (weniger Schreibarbeit)... -
HeHe, kein Problem BugFix. Ich sehe das Folgendermaßen:
- Vorteil der lokalen Variablendeklaration zu Beginn: Übersichtlichkeit, Verständlichkeit, Wartbarkeit
- Vorteil der lokalen Variablendeklaration bei erster Nutzung: ?
Das Fragezeichen, weil ich glaube mal gehört zu haben, dass die meisten Programmiersprachen (bzw. der Linker der Sprache) ohnehin sämtliche lokalen Variablen einer Funktion bei einem Funktionsaufruf in den Speicher lädt, in welcher Reihenfolge bzw. an welcher Stelle sie in der Funktion auftauchen ist dabei irrelevant. Jemand mit mehr Erfahrung im Umgang mit Compilern/Linkern möge mich korrigieren, bzw. den tatsächlichen Sachverhalt schildern.Ich weiß aber, dass alle ANSI-C Standards bis C90 eine Deklaration der Variablen zu Beginn erzwungen haben. Erst mit dem Standard C99 konnten diese frei platziert werden.
Zudem sind Zuweisungen in Programmiersprachen wohl die Anweisungen mit der geringsten Komplexität, weswegen ein Performancegrund für die Zuweisung bei erster Nutzung kaum gelten kann. Anweisungen wie z.B.:
[autoit]Local $avArray[50000]
[/autoit]
sollten sowieso in keinem Quellcode vorkommen. -
Hi,
ZitatNun ich habe die Func() deswegen reingestellt, und verändert um zu lernen, Fehler zu begehen, diese auzubessern um daraus zu lernen (hab ich irgendwo schonmal gelesen), um mich dadurch zu verbessern.
Absolut. Dafür ist dieses Forum ja auch da!ZitatBzgl. Quellcode: lösch mal alle Kommentare und unnötigen Zeilenabstände weg, im Endeffekt bleiben 46 Zeilen Code (nur die Func alleine übrig). Vergleich _ArraySort+ mit verwendeter Funcs() (bei _ArraySort) knapp 132 Zeilen.
Absolut. Unter diesem Gesichtspunkt ist es weniger Quellcode. Bestehende Funktionen zu nutzen hat allerdings immer einen Vorteil: Muss etwas geändert werden, so kann dies an einer Stelle erledigt werden (Vermeidung von Redundanzen). Des Weiteren ist es immer gut, bestehende Schnittstellen zu nutzen.ZitatInwiefern fehlt der Funktion noch die Eindeutigkeit?
Ist schon etwas besser, anscheinend war die Version im Spoiler unterschiedlich zu der im Anhang. Problematisch ist immer noch:- Der $Split Parameter. Übergebe der Funktion z.B. mal "." oder 2 und z.B. Eine Zeichenkette mit mehr als einem Zeichen.
- Der $Nr_1_to_Nr_n Parameter. Übergebe z.B. ein 2D-Array und eine deklarierte Variable (nicht initialisiert, sprich einfach nur Local $vTest).
ZitatDie Func() habe ich deswegen UDF genannt, da unter UDF eigtl. alles fällt was von einem Benutzer mittels Func ....() #Befehle# EndFunc geschrieben wird, dass es vlt. nicht produktiv ist, hab ich nie behauptet, hast du glaub ich, aber auch nicht gesagt.
Ja, leider ist AutoIt da (auch in der Hilfedatei) viel zu ungenau. Eine UDF (User Defined Function) ist eine Benutzerfunktion, die mittels bestimmter Coding-Standards strukturiert entwickelt, kommentiert und ausführlich wurde. Sie ist so programmiert das sie über ein bestimmtes Projekt hinaus verwendet werden kann und erfüllt somit das Merkmal der Wiederverwendbarkeit. Dies steht in dieser Form nirgendwo niedergeschrieben, würde ich aber mal als grobe Definition nehmen.
Meiner Meinung nach fallen darunter z.B. folgende Eigenschaften, damit die Funktion zur UDF wird:- Einhaltung von http://www.autoitscript.com/autoit3/scite/…F_Standards.htm
- Verwendung von [autoit]#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
Opt("MustDeclareVars", 1)[/autoit] während der Entwicklung der UDF/UDF-Bibliothek. - Der Name interner Funktionen in der UDF-Bibliothek beginnt mit "__".
- UDFs sollten keine Global-Variablen verwenden, es sei denn es handelt sich um eindeutig definierte Konstanten.
- Versuch der Typisierung der Funktionsparameter, sprich: Kein 0/1 für Boolesche Werte (macht die Standard UDF-Bibliothek leider) sondern False/True. Abfangen invalider Übergabeparameter (siehe z.B. meine StringRegExp oben). Einsatz von ByRef und Const wo möglich, aber sinnvoll.
- Testen, Testen, Testen. 1. Schritt die eigenen UDFs dazu bringen mit einem AutoIt Fehler zu "crashen", sprich einen unbehandelten Fehler hervorzurufen, wie auch immer dies von "außen" möglich ist. 2. Fehler beheben. 3. Sinnvolle Testfälle für die UDF überlegen und Ergebnisse überprüfen. 4. Fehler beheben. usw.
- UDF/UDF-Bibliothek hier oder im englischen Forum http://www.autoitscript.com/forum/ posten (natürlich nur, falls für private Zwecke entwickelt) und um Feedback bitten.
- Anhand des Feedbacks die UDF/UDF-Bibliothek verbessern und erneut Testen.
ZitatIch wollte damit nur zeigen, wie man "Zahlen"-Arrays sortieren, die größte/kleinste Zahl in einem Array herausfindet, deswegen dann auch die ganzen Kommentare dazu.
Im Endeffekt ein Beispiel, obwohl es auch besser geht...bin noch Anfänger.
Was auch gut ist! Deine Funktion ist ja auch nicht "schlecht", da wir hier aber im UDF-Unterforum sind (Titel des Unterforums: "UDFs, Hinweise, speziellere Tutorials - hier ist Raum für Profis") ging es mir darum auf die von mir angesprochenen Dinge hinzuweisen, eben weil Neulinge/Einsteiger evtl. etwas unsensibel bzw. nicht erfahren genug sind.Ich denke auch, dass durch unseren Dialog in diesem Thread und besonders durch diesen Post für Lesende evtl. ein paar Dinge klarer werden. Von daher weiter so! Abschließend nochmal Deine UDF mit ein paar Verbesserungen (noch weiter zu bearbeitende Teile habe ich kommentiert):
Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]Func _SortMinMax($vNumbers, $fMIN = False, Const $sSEPARATOR = ",")
[/autoit] [autoit][/autoit] [autoit]
Local Const $iMININT = -9223372036954775808
Local $sTmp = ""
Local $iCount = 0
Local $iCopy = 0;~ ToDo: Evtl. noch nicht ausreichende Prüfung.
[/autoit] [autoit][/autoit] [autoit]
If Not $sSEPARATOR Or $sSEPARATOR = "-" Or StringIsDigit($sSEPARATOR) Or IsNumber($sSEPARATOR) Then Return SetError(3, 0, False)If IsArray($vNumbers) Then
[/autoit] [autoit][/autoit] [autoit]
If UBound($vNumbers, 0) <> 1 Then Return SetError(1, 0, False)
$iCount = UBound($vNumbers) - 1
For $i = 0 To $iCount
$sTmp &= $vNumbers[$i] & $sSEPARATOR
Next
;~ Wichtig: Separator mit einer Länge > 1 führten zuvor zu Fehlern.
$vNumbers = StringTrimRight($sTmp, StringLen($sSEPARATOR))
EndIfIf Not StringRegExp($vNumbers, "^(?:(-?\d*.?\d+)+?\" & $sSEPARATOR & ")+?(?1)$") Then Return SetError(2, 0, False)
[/autoit] [autoit][/autoit] [autoit]
$vNumbers = StringSplit($vNumbers, $sSEPARATOR);~ Es genügt, bei Element 1 zu beginnen.
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $vNumbers[0]
$vNumbers[$i] = Number($vNumbers[$i])
Next;~ ToDo: Nicht nachvollzogen, geht auf jeden Fall noch eleganter.
[/autoit] [autoit][/autoit] [autoit]
Local $avNumbers[$vNumbers[0] + 1] = [$vNumbers[0]]
For $i = 1 To $vNumbers[0]
$avNumbers[$i] = $iMININT
NextFor $i = 1 To $vNumbers[0]
[/autoit] [autoit][/autoit] [autoit]
For $j = 1 To $vNumbers[0]
If $vNumbers[$j] > $avNumbers[$i] Then
$avNumbers[$i] = $vNumbers[$j]
$iCount = $j
EndIf
Next
$vNumbers[$iCount] = $iMININT
NextIf $fMIN Then
[/autoit] [autoit][/autoit] [autoit]
Local $avNumbersCopy[$vNumbers[0] + 1]For $i = 1 To $avNumbers[0]
[/autoit] [autoit][/autoit] [autoit]
$avNumbersCopy[$i] = $avNumbers[$i]
NextFor $i = $avNumbers[0] To 1 Step -1
[/autoit] [autoit][/autoit] [autoit]
$iCopy += 1
$avNumbers[$i] = $avNumbersCopy[$iCopy]
Next
EndIfReturn $avNumbers
[/autoit]
EndFunc ;==>_SortMinMax -
Hi,
mittlerweile macht Deine Funktion ja etwas völlig anderes als noch zuvor. Wenn ich das richtig verstehe, möchtest Du nun Ganzzahlen sortieren können (sowohl auf- als auch absteigend) und Du möchtest sowohl Strings als auch Arrays übergeben können. Es besteht aber immer noch das Gleiche Problem wie zuvor: Der Funktion fehlt die Eindeutigkeit um als UDF durchzugehen. Des Weiteren wird Performance unnötigerweise verschwendet, da Arrays hin und her kopiert werden und bei einer Sortierung von der niedrigsten zur höchsten Ganzzahl zunächst andersherum sortiert wird! Deklarationen wie $Zahl_Min = -9223372036954775808 sind immer zu vermeiden, da sich der Wertebereich eines Integers von 32Bit auf 64Bit (oder sogar 128Bit) ändert (weiß spontan aber nicht, wie das bei AutoIt v3 ist),
Wozu der ganze Quellcode? Das Ganze lässt sich z.B. auf Folgendes zusammenfassen. Hier allerdings ohne $array[0] mit Anzahl der Elemente, ließe sich aber sehr simpel ändern. Auch wurde der Separator erneut festgesetzt und falls ein String übergeben wird, wird dieser validiert.
Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Func _MaxMinSort($vNumbers, Const $fMIN = False)
[/autoit] [autoit][/autoit] [autoit]
Local $iEnd = 0
If Not IsArray($vNumbers) Then
If Not StringRegExp($vNumbers, "^(?:(-?\d*.?\d+)+?\|)+?(?1)$") Then Return SetError(1, 0, False)
$vNumbers = StringSplit($vNumbers, "|", 2)
EndIf$iEnd = UBound($vNumbers) - 1
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iEnd
$vNumbers[$i] = Number($vNumbers[$i])
Next_ArraySort($vNumbers, $fMIN)
[/autoit] [autoit][/autoit] [autoit]Return $vNumbers
[/autoit]
EndFunc ;==>_MaxMinSort
Deine Beispiele dazu:Spoiler anzeigen
[autoit]Global $anArray[7] = ['1', 2, 235425.5421, -35326.352462, '3523', 556578457546.454, '3456534.34653']
[/autoit] [autoit][/autoit] [autoit]
Global $avTest[3] = ["2|34|356256|7843|9787945|67|-4|-245246|346|1", "-2|-34453.67434|57342", $anArray]
Global $avResult = 0For $vTest In $avTest
[/autoit]
$avResult = _MaxMinSort($vTest)
_ArrayDisplay($avResult)
Next
Ich merke dies nur kritisch an, da Deine Funktion in Deiner Signatur als UDF auftaucht und es bei Neulingen bzw. Einsteigern den Eindruck erwecken könnte, dass diese für den Produktiveinsatz geeignet ist. Dies ist meiner Meinung nach nicht der Fall. Die Verwendung von "Standard" UDFs wie _ArraySort, _ArrayMin und _ArrayMax ist absolut vorzuziehen, da diese erprobt sind und sich auf eine Aufgabe fokussieren.Wie zuvor auch: Ist nur als konstruktive Kritik und als Hilfe für hier Lesende gedacht!
-
Hi,
ist nicht böse gemeint, soll nur dazu anregen "genauer hinzuschauen", deswegen auch so eine penible Auflistung im Folgenden. Die UDF hat leider mehrere Fehler/Probleme:- Im ersten Schleifendurchlauf werden alle Werte nach Integer gecastet, dadurch Kommazahlen nicht vergleichbar.
- $Max wird mit 0 initialisiert, dadurch Vergleich von ausschließlich negativen/natürlichen Zahlen (je nach zweitem Parameter) nicht möglich.
- Aufruf von UBound() bei jeder Iteration, StringSplit() ohne zweiten Parameter liefert in Array-Element [0] eben diesen Wert ohne Ressourcenverschwendung.
- Split des ersten Parameters zu ungenau, UDFs sollten klare Vorgaben liefern.
- Prüfung am Ende sinnlos, da zuvor alles nach Integer gecastet wurde.
- Initialisierung von Schleifenvariablen überflüssig.
- Name der UDF / Einsatz des zweiten Parameters meiner Meinung nach "unglücklich".
Hier der erweiterte/korrigierte Quellcode, der in zwei Funktionen unterteilt wurde, sauber nach "AutoIt v3" Coding-Standards (hoffe mir sind nicht noch Fehler unterlaufen, ansonsten kurzer Hinweis bitte):Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]; #INDEX# =======================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Title .........: fwMath
; AutoIt Version : 3.3++
; Language ......: English
; Description ...: This library contains mathematical functions.
; Author(s)......: teh_hahn
; ===============================================================================================================================; #CURRENT# =====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; _Maximum
; _Minimum
; ===============================================================================================================================; #INTERNAL_USE_ONLY#============================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; __MaxMinIsValid
; __MaxMinToNumber
;================================================================================================================================; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Maximum
; Description ...: Evaluates which of the numbers is higher.
; Syntax.........: _Maximum($vNumbers)
; Parameters ....: $vNumbers - String containing the numbers, separated by "|".
; Return values .: Success - The higher of the numbers.
; Failure - False, sets @error to 1 if $vNumbers is invalid.
; Author ........: Ealendil
; Modified.......: teh_hahn
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Maximum($vNumbers)
Local $nMax = 0;~ Check if the number string is invalid.
[/autoit] [autoit][/autoit] [autoit]
If Not __MaxMinIsValid($vNumbers) Then Return SetError(1, 0, False);~ Split up the number string into substrings.
[/autoit] [autoit][/autoit] [autoit]
$vNumbers = StringSplit($vNumbers, "|");~ Convert all elements in the passed array to numbers.
[/autoit] [autoit][/autoit] [autoit]
__MaxMinToNumber($vNumbers);~ Set the highest number to the first number in the array.
[/autoit] [autoit][/autoit] [autoit]
$nMax = $vNumbers[1];~ Determine the highest number.
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $vNumbers[0]
If $vNumbers[$i] > $nMax Then $nMax = $vNumbers[$i]
NextReturn $nMax
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_Maximum; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _Minimum
; Description ...: Evaluates which of the numbers is lower.
; Syntax.........: _Minimum($vNumbers)
; Parameters ....: $vNumbers - String containing the numbers, separated by "|".
; Return values .: Success - The lower of the numbers.
; Failure - False, sets @error to 1 if $vNumbers is invalid.
; Author ........: Ealendil
; Modified.......: teh_hahn
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _Minimum($vNumbers)
Local $nMin = 0;~ Check if the number string is invalid.
[/autoit] [autoit][/autoit] [autoit]
If Not __MaxMinIsValid($vNumbers) Then Return SetError(1, 0, False);~ Split up the number string into substrings.
[/autoit] [autoit][/autoit] [autoit]
$vNumbers = StringSplit($vNumbers, "|");~ Convert all elements in the passed array to numbers.
[/autoit] [autoit][/autoit] [autoit]
__MaxMinToNumber($vNumbers);~ Set the lowest number to the first number in the array.
[/autoit] [autoit][/autoit] [autoit]
$nMin = $vNumbers[1];~ Determine the lowest number.
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $vNumbers[0]
If $vNumbers[$i] < $nMin Then $nMin = $vNumbers[$i]
NextReturn $nMin
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_Minimum; #INTERNAL_USE_ONLY#============================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: __MaxMinIsValid
; Description ...: Helper function to determine if the number string of _Maximum / _Minimum is valid.
; Syntax.........: __MaxMinIsValid(Const $S)
; Parameters ....: $S - String containing the numbers, separated by "|".
; Return values .: Success - True
; Failure - False
; Author ........: teh_hahn
; Modified.......:
; Remarks .......: For internal use only.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func __MaxMinIsValid(Const $S)
Return StringRegExp($S, "^(?:(-?\d*.?\d+)+?\|)+?(?1)$")
EndFunc ;==>__MaxMinIsValid; #INTERNAL_USE_ONLY#============================================================================================================
[/autoit]
; Name...........: __MaxMinToNumber
; Description ...: Helper function to convert a string-array to a numeric-array.
; Syntax.........: __MaxMinToNumber(ByRef $avNumbers)
; Parameters ....: $avNumbers - Integer specifying the direction to traverse through the array-dimension:
; Return values .: None
; Author ........: teh_hahn
; Modified.......:
; Remarks .......: For internal use only.
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func __MaxMinToNumber(ByRef $avNumbers)
For $i = 1 To $avNumbers[0]
$avNumbers[$i] = Number($avNumbers[$i])
Next
EndFunc ;==>__MaxMinToNumber
Dies soll wie gesagt nur "Lerneffekt" haben, Die UDFs _ArrayMin und _ArrayMax ist besser für diesen Anwendungszweck geeignet! -
Hallo,
ich hab zu dem Thema leider nichts gefunden (auch nicht im englischen Forum), ich weiß aber das es dazu mal einen Thread gab, den ich momentan nicht finden kann. Ich möchte meine AU3-Libraries (die allesamt mit der "offiziellen" Syntax zur Kommentierung von Headern versehen sind) parsen und automatisch HTML-Dateien (die genauso aussehen wie die offizielle AutoIt3-Hilfe) generieren. Die damalige lib Au3Lib hatte auch eine solche Hilfedatei, deswegen glaube ich, dass es schon so ein Tool gibt. Ziel ist es halt alle meine libs zu bündeln und eine CHM-Datei zu generieren.
Vielleicht kann ja jemand damit dienen, wäre echt super. Ansonsten schreibe ich mal direkt einen der Entwickler an.
-
Hi,
ganz vergessen mich bei Dir zu bedanken, progandy. Genau so sollte es sein. Meine finale Version (für dieses Problem) sieht folgendermaßen aus:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("MustDeclareVars", 1)
[/autoit] [autoit][/autoit] [autoit]Exit main()
[/autoit] [autoit][/autoit] [autoit]Func main()
[/autoit] [autoit][/autoit] [autoit]
Local $asMatch = 0
Local $sTextErr = "notAllowed{1;43}{23;32}{2;32}{24;3}notAllowed"
Local $sTextOk = "{1;43}{23;32}{2;32}{24;3}{0;21990}"$asMatch = _Coordinate_StringToArray($sTextErr)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($asMatch)
$asMatch = _Coordinate_StringToArray($sTextOk)
_ArrayDisplay($asMatch, "OK")
EndFunc ;==>mainFunc _Coordinate_StringToArray(Const $sTEXT)
[/autoit]
If Not StringRegExp($sTEXT, "^(\{\d+;\d+\})+?$") Then Return SetError(@error, 0, 0)
Local Const $asMatch = StringRegExp($sTEXT, "\{\d+;\d+\}", 3)
If @error Then Return SetError(@error, 0, 0)
Return $asMatch
EndFunc ;==>_Coordinate_StringToArray
Ich brauchte dann doch die geschweiften Klammern. ( Xenobiologist : Klar, würde das gehen, allerdings nur für vier Koordinaten in String-Form. Mein Beispiel war allerdings auch unschön gewählt. Trotzdem danke!)PS: Brauchte das Pattern für eine Klasse in Java, da hab ich Euch einfach mal für missbraucht.
-
-
Hallo,
ich hänge grade bei folgendem Problem:
Spoiler anzeigen
[autoit]#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("MustDeclareVars", 1)
[/autoit] [autoit][/autoit] [autoit]Exit main()
[/autoit] [autoit][/autoit] [autoit]Func main()
[/autoit] [autoit][/autoit] [autoit]
Local $sTextErr = "öfajß9{1;43}{23;32}{2;32}{24;3}h8f20"
Local $sTextOk = "{1;43}{23;32}{2;32}{24;3}";~ Funktioniert nicht für beide, da +? natürlich den kleinsten Treffer zurückgibt (erkennt aber, dass $sTextErr inkorrekt ist).
[/autoit] [autoit][/autoit] [autoit]
Debug(_Coordinate_StringToArray_1($sTextErr), $sTextErr)
Debug(_Coordinate_StringToArray_1($sTextOk), $sTextOk);~ Funktioniert nicht für $sTextErr, da keine Anfangs- und Endekennung (erkennt $sTextErr also als korrekt an).
[/autoit] [autoit][/autoit] [autoit]
Debug(_Coordinate_StringToArray_2($sTextErr), $sTextErr)
Debug(_Coordinate_StringToArray_2($sTextOk), $sTextOk)
EndFunc ;==>mainFunc Debug(Const $asMatch, Const $sTEXT = "")
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($asMatch, $sTEXT)
EndFunc ;==>DebugFunc _Coordinate_StringToArray_1(Const $sTEXT)
[/autoit] [autoit][/autoit] [autoit]
Local Const $asMatch = StringRegExp($sTEXT, "^(?:{(\d+;\d+){1}})+$", 3)
If @error Then Return SetError(@error, 0, "")
Return $asMatch
EndFunc ;==>_Coordinate_StringToArray_1Func _Coordinate_StringToArray_2(Const $sTEXT)
[/autoit]
Local Const $asMatch = StringRegExp($sTEXT, "(?:{(\d+;\d+){1}})+?", 3)
If @error Then Return SetError(@error, 0, "")
Return $asMatch
EndFunc ;==>_Coordinate_StringToArray_2
Wie aus dem Quellcode hervorgeht, möchte ich die Rückgabe, wie bei UDF 1, muss aber auf Anfang und Ende prüfen...Wäre dankbar für ein verbessertes Pattern!
MFG
-
Hallo,
1. RAR-Dateien behandeln mit AutoIt sollte grundsätzlich gehen. Das Format scheint ja OpenSource zu sein, da 7Zip es unterstützt. Ich wüsste jetzt aber kein Beispiel, zudem sollte das Ganze auch recht aufwendig sein, wenngleich nicht unbedingt sinnlos, da zumindest bei Archiven mit geringer Kompression die Festplatte und nicht der Algorithmus der Flaschenhals sein sollte. Schaue dafür am Besten im englischen Forum nach.
2. Ja, ist möglich. Eine komplette Lösung mit AutoIt macht aber keinen Sinn, da dies viel zu langsam ist. Hier eine UDF die ich (von welchem Autor sie ursprünglich stammt weiß ich leider nicht) modifiziert habe. Sie funktioniert mittels OpCode und einem DLL-API-Call:Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#Region - Example.
Local Const $sTEXTPART0 = "The quick brown fox "
Local Const $sTEXTPART1 = "jumps over the lazy dog"
Local Const $sTEXTFULL = $sTEXTPART0 & $sTEXTPART1
MsgBox(64, "_HashCRC32", "FullString: " & _HashCRC32($sTEXTFULL) _
& @CRLF & "PartialStrings: " & _HashCRC32($sTEXTPART1, _HashCRC32($sTEXTPART0)))
#EndRegion - Example.Func _HashCRC32(Const $vDATA, Const $iCRC32 = 0x000000)
[/autoit] [autoit][/autoit] [autoit]
Local Const $sOPCODECRC = "0xC800040053BA2083B8EDB9000100008D41FF516A0859D1E8730231D0E2F85989848DFCFBFFFFE2E78B5D088B4D0C8B451085DB7416E3148A1330C20FB6D2C1E80833849500FCFFFF43E2ECF7D05BC9C21000"
Local Const $STRUCT_CODEBUFFER = DllStructCreate("byte[" & BinaryLen($sOPCODECRC) & "]")
Local Const $STRUCT_INPUT = DllStructCreate("byte[" & BinaryLen($vDATA) & "]")DllStructSetData($STRUCT_CODEBUFFER, 1, $sOPCODECRC)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($STRUCT_INPUT, 1, $vDATA)Local Const $vReturn = _WinAPI_CallWindowProc(DllStructGetPtr($STRUCT_CODEBUFFER), _
[/autoit] [autoit][/autoit] [autoit]
DllStructGetPtr($STRUCT_INPUT), BinaryLen($vDATA), BitNOT(Dec($iCRC32)), 0)
If @error Then Return SetError(@error, 0, False)Return StringLower(Hex($vReturn))
[/autoit]
EndFunc ;==>_HashCRC32
Das Beispiel sollte für sich sprechen! -
Hallo, AutoIt mit C# zu vergleichen ist wie Äpfel mit Birnen zu vergleichen.
Zu Deinen Fragen:
1. Ja, z.B. hiermit: http://www.autoitscript.com/forum/index.php?showtopic=71458&hl=Movie+Player
2. Ja, siehe Help-File (GUISetStyle)
3. Ja, siehe Unterforum "Datenbanken" (Ansonsten ADO anschauen, z.B. von w3schools)
4. Ja, siehe Funktion Random
5. Weiß ich nicht genau, aber der Interpreter wird mit in die EXE gepackt (dann diverse Komprimierungen etc.). -
Nein,
[autoit]
$WS_POPUP ist in WindowsConstants.au3 deklariert:#include <WindowsConstants.au3>
[/autoit]
Siehe auch Hilfedatei. -
[autoit]
#include <Array.au3>
[/autoit][autoit][/autoit][autoit]Local $asDate[7] = [6]
[/autoit][autoit][/autoit][autoit]
$asDate[1] = "27-02-2009 18-20-00"
$asDate[2] = "22-02-2009 13-00-00"
$asDate[3] = "25-02-2009 20-20-00"
$asDate[4] = "22-02-2009 20-30-00"
$asDate[5] = "22-02-2009 20-05-00"
$asDate[6] = "27-02-2009 14-20-00"_ArrayDisplay($asDate, "Unsorted")
[/autoit]
_ArraySort($asDate, 0, 1)
_ArrayDisplay($asDate, "Sorted") -
Ja, ich sehe schon das sich das nicht wirklich abdecken lässt. Eine Frage noch: Wie kann ich das HTML des gesamten Documents eines Tabs auslesen?
[autoit]Func _FFGetInnerHTML(ByRef $iFFSocket, Const $vTAB = 0, Const $iTIMEOUT = 10000)
[/autoit]
Local Const $sURI = _FFSetGet($iFFSocket, "getBrowser().getBrowserAtIndex(" & $vTAB & ").contentDocument.html.innerHTML", $iTIMEOUT)
If @error Then Return SetError(@error, 0, "")
Return $sURI
EndFunc ;==>_FFGetHTML
funktioniert nicht. Ich will quasi den gleichen Text zurückbekommen, wie mit _FFReadHTML, bloß das ich nicht die Tabs wechseln möchte. -
Hallo Stilgar,
stimmt. Das es nicht unbedingt Standard ist einen Befehl auf einen Tab anzuwenden und dann zu wechseln sehe ich ein. (ist nur in meinem Skript so, daher bei mir höherer Schreibaufwand.)
Die Inet.au3 würde ich auch auf keinen Fall inkludieren. Ich hätte da auch eher an eine kleine Helper-Funktion extra für den Firefox gedacht.
Der _FFGetSet würde ich jedoch zusätzliche Methoden wie deiner spendieren und diese dann in eine FFGet.au3 und FFSet.au3 auslagern (die der Benutzer dann inkludieren kann. Ich habe mich noch nicht mit den FF-Properties beschäftigt, aber damit könnte man die Gängisten (wenn nicht alle sogar alle sinnvollen) Properties in Get & Set Funktionen verpacken und somit Syntax-Fehler ausschließen. Die Frage ist, wie generisch man das hinbekommt. Die Set-UDFs wären dann Synonym dazu zu sehen. -
Hallo,
wie ich sehe wird gerade fleißig an der FF.au3 gewerkelt. Ich bin gestern in einem Skript, dass ich benutze auf die neue Version umgestiegen und mir sind ein paar Dinge aufgefallen:
1. DIe Änderungen an den UDFs halte ich durchweg für sinnvoll, aber
2. Umlaute sollten wirklich standardmäßig akzeptiert werden.
3. Mehr oder weniger alle UDFs sollten die Angabe des Tabs erlauben, auf den die Funktion angewandt werden soll und damit zu:
4. UDF zum Auslesen der aktuelle URL implementieren:Spoiler anzeigen
[autoit]Func _FFTabGetLocationURL(ByRef $iFFSocket, Const $iTIMEOUT = 10000, Const $vTAB = 0, Const $sMODE = "index")
[/autoit]
_FFTabSetSelected($iFFSocket, $vTAB, $sMODE)
If @error Then Return SetError(1, 0, "")
Local Const $sLOCATION = _FFSetGet($iFFSocket, ".location.href", $iTIMEOUT)
If @error Then Return SetError(2, 0, "")
Return $sLOCATION
EndFunc ;==>_FFTabGetLocationURL
Hier sieht man nochmal, was ich mit Angabe des Tabs meine. Ein weiteres Beispiel wäre:Spoiler anzeigen
[autoit]Func _FFTabReadHTML(ByRef $iFFSocket, Const $vTAB = 0, Const $sMODE = "index", Const $iFILTER = 0)
[/autoit]
_FFTabSetSelected($iFFSocket, $vTAB, $sMODE)
If @error Then Return SetError(1, 0, "")
Local Const $sHTML = _FFReadHTML($iFFSocket, $iFILTER)
If @error Then Return SetError(2, 0, "")
Return $sHTML
EndFunc ;==>_FFTabReadHTML
Am kritischsten sehe ich aber wirklich die Umlaute! Ansonsten super Bibliothek! Weiter so! -
Ähm, _StringBetween gibt ein String-Array zurück... Außerdem waren da noch andere Fehler und Unnötiges in Deinem Skript.
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <INet.au3>
#include <IE.au3>
#include <String.au3>Exit main()
[/autoit] [autoit][/autoit] [autoit]Func OnAutoItStart()
[/autoit] [autoit][/autoit] [autoit]
Opt("GUICloseOnEsc", 0)
Opt("MustDeclareVars", 0)
EndFunc ;==>OnAutoItStartFunc main()
[/autoit] [autoit][/autoit] [autoit]
;~ Constants & Variables
Local Const $STMPFILE = @ScriptDir & "\tmp.html"
Local $oIE = 0, $hIECtrl = 0, $sHTML = "";~ GUI creation
[/autoit] [autoit][/autoit] [autoit]
GUICreate("GUI TEST", 650, 500)
GUICtrlCreateTab(0, 0, 650, 500)
GUICtrlCreateTabItem("Login");~ HTML parsing & file interaction
[/autoit] [autoit][/autoit] [autoit]
FileDelete($STMPFILE)
$sHTML = _StringBetween(_INetGetSource('http://autoit.de/index.php?form=UserLogin&'), _
'<script type="text/javascript" src="wcf/js/AjaxRequest.class.js"></script>', _
'<div id="footer">')
If @error Then MsgBox(16, "Parse Error", "Unable to parse the webpage!")
$sHTML = $sHTML[0]
FileWrite($STMPFILE, $sHTML)_IEErrorHandlerRegister()
[/autoit] [autoit][/autoit] [autoit]
$oIE = _IECreateEmbedded()
$hIECtrl = GUICtrlCreateObj($oIE, 0, 25, 650, 450)GUISetState()
[/autoit] [autoit][/autoit] [autoit]_IENavigate($oIE, "file://" & $STMPFILE)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Return 0
WEnd
EndFunc ;==>main