Deine Frage wirft bei uns mehr Fragen auf als dass sie zu Antworten anregt.
Erkläre konkret was du vorhast - und zwar mit Skriptbeispiel. Dann können wir dir auch entsprechende Ratschläge geben.
Im Moment verstehe ich nur Bahnhof.
Beiträge von BugFix
-
-
@Andy, vermutlich müssen wir für 3.3.12 die nativen Stringfunktionen per FASM einbinden um den Speed von 3.3.8 wieder zu erreichen.
Oder wir nutzen Stringoperationen über LuaEmbedded
. Lua-Skripte im Textbereich sind etwa >10 mal schneller als in AutoIt. Rechnen wird den Portierungszeitaufwand raus, könnte etwa die Hälfte stehen bleiben -- immer noch schneller als mit der aktuellen Version. 
-
Ergänzend zu Oscars Tipps:
- Notizdatei bearbeitbar machen (Notiz wählen, lesen/editieren/löschen)
- Mehrere Notizen in einer Datei erfassen mit Datumsstempel (z.B. [JJJJ-MM-TT]) und mit Suche nach Datum ausgeben
- Notiz als Termin mit Alarm
Das sind Dinge, die alle Facetten der Dateiarbeit abdecken und dir somit ein gutes Lernpolster geben. Das kann man dann später auch noch ausweiten mit Notizversand im Netzwerk - aber da sollten vorher erst mal die Grundlagen stehen.
-
Für mich sieht das so aus, als ob, nachdem in einigen Threads im EN-Forum das "elitäre" RegEx mit "simplen" Stringfunktionen geschwindigkeitsmäßig an die Wand gespielt wurde, dieses "Sakrileg" in den neueren AutoIt-Versionen einfach "korrigiert" wurde.
Das klingt sehr wahrscheinlich. RegEx in AutoIt ist nicht sonderlich schnell, dass ist sicherlich dem Jos sofort aufgefallen als er seine AutoIt-Tools in Lua geschrieben hat und somit vergleichen konnte. Dort sind schon die Stringoperationen mit Pattern nutzbar (was ich sehr praktisch finde) und zusätzlich kann man dann noch mit einer RegEx-Library arbeiten, beides affenartig schnell. Und da es syntaktisch durchaus vorteilhaft ist mit Pattern zu arbeiten, musste wohl ein Grund konstruiert werden eine RegEx-Nutzung zum Goldstatus zu erheben. Und sei es darum all jenen, die mit RegEx nicht so warm werden klar zu machen (völlig zu unrecht) , sie seien keinesfalls elitär?
Ich verwende viel RegEx, das ist einfach dem Umstand geschuldet, dass ich viel komplexe Textverarbeitung mache (auch in Lua und Python) und somit kein Weg an RegEx vorbeiführt. Da fängt man dann schon an in RegEx zu denken und übersieht durchaus, dass manchmal eine simple native Stringoperation den Zweck auch erfüllt. -
dass eine Webseite alle 30 Minuten aufruft und diese ausliest
Lies doch die Seite nicht aus einem Browserfenster, sondern direkt per InetGet. Dann stellt sich die Problematik gar nicht.
-
Einer InputBox das kaufmännische Euro-Format vorgeben kann man aber nicht, oder?
Doch das geht, GuiRegisterMsg verwenden mit WM_COMMAND und $EN_CHANGE auswerten - den Inhalt lesen und sofort im erforderlichen Format zurückschreiben.
-
Vielleicht hilft dir das weiter.
-
In deinem Fall könntest du Eval() / Assign() für deine Variable $flabelnote zwar verwenden, nicht aber für $STATION. Eval/Assign kann nicht mit Arrays genutzt werden.
Also ändere dein Skript auf reine Arraynutzung. Ist im Moment vielleicht etwas Arbeit - da es aber nicht anders geht, bleibt dir eh keine Wahl. -
dass hatte ich auch schon herausgefunden, aber dann ist es nicht mehr an das Hauptfenster gebunden... Darum ging es ja...
Verwende WS_EX_MDICHILD und erstelle die GUI am Anfang und nicht bei jedem Aufruf neu:
AutoIt
Alles anzeigenGlobal $gDatenbankMain, $OpenDatabase = 0 Opt("GUIOnEventMode", 1) #Region $gMain = GUICreate("Diluma Formular Builder V 1.0", @DesktopWidth-20, @DesktopHeight-100, -1, -1, Default, $GUI_WS_EX_PARENTDRAG) GUISetOnEvent($GUI_EVENT_CLOSE, "wClose") $mFile = GUICtrlCreateMenu("&Datei") $mDateiOeffnen = GUICtrlCreateMenuItem("&öffnen" , $mFile) $mDateiSpeichern = GUICtrlCreateMenuItem("&speichern" , $mFile) $mDateiExit = GUICtrlCreateMenuItem("&Exit" & @TAB & " Esc", $mFile) GUICtrlSetOnEvent(-1, "wClose") $mFile2 = GUICtrlCreateMenu("&Datenbank") $mDatenbankOeffnen = GUICtrlCreateMenuItem("&Anbindung setzen" , $mFile2) GUICtrlSetOnEvent(-1, "DatenbankOeffnen") ; Child $gDatenbankMain = GUICreate("Datenbank Anbindung", 363, 123, 0, 0,BitOR($WS_CAPTION,$WS_MINIMIZEBOX,$WS_SYSMENU), $WS_EX_MDICHILD, $gMain) GUISetOnEvent($GUI_EVENT_CLOSE, "wClose") $gHost = GUICtrlCreateInput("", 96, 8, 249, 21) $gDatenbank = GUICtrlCreateInput("", 96, 34, 121, 21) $gBenutzer = GUICtrlCreateInput("", 96, 60, 121, 21) $gPasswort = GUICtrlCreateInput("", 96, 86, 121, 21) $g1Label1 = GUICtrlCreateLabel("Host", 16, 10, 26, 17) $g1Label2 = GUICtrlCreateLabel("Datenbank", 16, 34, 57, 17) $g1Label3 = GUICtrlCreateLabel("Benutzername", 16, 60, 72, 17) $g1Label4 = GUICtrlCreateLabel("Passwort", 16, 88, 47, 17) $gBTestDatabase = GUICtrlCreateButton("Test", 232, 32, 113, 25) $gBSpeicherDatenbank = GUICtrlCreateButton("speichern", 232, 64, 113, 41) GUISetState(@SW_SHOW, $gMain) #EndRegion while 1 Sleep(50) WEnd Func DatenbankOeffnen() If $OpenDatabase = 1 Then Return GUISetState(@SW_HIDE, $gMain) GUISetState(@SW_SHOW, $gDatenbankMain) $OpenDatabase = 1 EndFunc Func wClose() Switch @GUI_WINHANDLE ; See which GUI sent the CLOSE message Case $gMain Exit Case $gDatenbankMain GUISetState(@SW_HIDE, $gDatenbankMain) GUISetState(@SW_SHOW, $gMain) $OpenDatabase = 0 EndSwitch EndFunc -
Das würde bedeuten Mehrdimmensionale Arrays können nicht zeilenweise befüllt werden?
Arrays können ausschliesslich während der Deklaration komplett befüllt werden (egal ob 1D oder 2D). Ein bereits erstelltes Array ist nur noch über jedes einzelne Element befüllbar.
Kann man syntaktisch umgehen, indem man Arrays im Array verwendet. Allerdings muss man dann beim Lesen/Schreiben von Werten innerhalb dieses Array-Im-Array selbiges zuerst in eine separate Variable lesen um Zugriff zu erlangen. Wobei zum Lesen ein Kapseln des Zugriffs schon reicht:AutoIt
Alles anzeigenLocal $aInner_1[] = [1,2,3] Local $aInner_2[] = [4,5,6] Local $aOuter[] = [$aInner_1,$aInner_2] ; Lesen For $i = 0 To UBound($aOuter) -1 For $j = 0 To UBound($aOuter[$i]) -1 ConsoleWrite('Outer[' & $i & '] - Inner[' & $j & ']: ' & ($aOuter[$i])[$j] & @CRLF) Next Next ; Schreiben For $i = 0 To UBound($aOuter) -1 $aTmp = $aOuter[$i] For $j = 0 To UBound($aTmp) -1 $aTmp[$j] += 10 Next $aOuter[$i] = $aTmp Next -
Die Funktion hatte ich 2007 geschrieben. Jetzt habe ich mal noch den Code etwas aufgeräumt und eine Syntaxanpassung an die aktuelle Version vorgenommen-
AutoIt
Alles anzeigen;=============================================================================== ; Description: returns the date of easter in specified year between 1583 and 2999 ; Parameter(s): $year ; Return Value(s): On Success - easterdate (sunday) ; On Failure - -1 ; Author(s): BugFix (bugfixautoit.de) ;=============================================================================== Func _Easter($year) ;Determination Easter with formula by C. F. Gauss Local $a, $b, $c, $d, $e, $H1, $H2, $N, $M, $EasterDay, $EasterMonth If $year < 1583 Or $year > 2999 Then Return -1 $a = Mod($year, 19) $b = Mod($year, 4) $c = Mod($year, 7) $H1 = Int($year/100) $H2 = Int($year/400) $N = 4 + $H1 - $H2 $M = 15 + $H1 - $H2 - Floor(Int((8 * $H1 + 13)/25)) $d = Mod((19 * $a + $M), 30) $e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7) $EasterDay = ($d + $e = 35) ? 50 : (($d = 28 And $e = 6 And $a > 10) ? 49 : (22 + $d + $e)) $EasterMonth = '03' If $EasterDay > 31 Then $EasterDay -= 31 $EasterMonth = '04' EndIf ; $EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay ; english notation $EasterDate = StringRight('0' & $EasterDay, 2) & "." & $EasterMonth & "." & $year ; german notation Return $EasterDate EndFunc ;==>_Easter -
du weißt aber schon das du so nur eine Zeitangabe speichern kannst?
Ja, das ist auch das Ziel.
-
Zur Lösung würde ich zu HeapAlloc raten.
Ist mit Sicherheit die sauberste Lösung. Für den von mir gewollten Zweck werde ich aber auf Local Static zurückgreifen. Zum Einen wird die Struktur u.U. mehrfach hintereinander genutzt und zum Anderen muß der User dann nicht dran denken den Speicher freizugeben.
Danke noch mal.
-
Grr, ist ja eigentlich klar. Danke für die Erleuchtung.

-
Was meinst du exakt mit "fehlerhafte Werte"?
Ist ja krass, ich bekomme folgende Ausgabe (reproduzierbar):
Bash
Alles anzeigenCheck Feld 1: 2015 Check Feld 2: 05 Check Feld 3: 26 Check Feld 4: 14 Check Feld 5: 03 Check Feld 6: 31 Return 1: y Return 2: n Return 3: Return 4: Return 5: Return 6: 31Ich verwende auch die 3.3.12.0
-
Hier die Osterformel alleine:
AutoIt
Alles anzeigen;=============================================================================== ; Description: returns the date of easter in specified year between 1583 and 2999 ; Parameter(s): $year ; Return Value(s): On Success - easterdate (sunday) ; On Failure - -1 ; Author(s): BugFix (bugfix@autoit.de) ;=============================================================================== Func _Easter($year) ;Determination Easter with formula by C. F. Gauss If $year > 1582 And $year < 3000 Then $a = Mod($year, 19) $b = Mod($year, 4) $c = Mod($year, 7) $H1 = Int($year / 100) $H2 = Int($year / 400) $N = 4 + $H1 - $H2 $M = 15 + $H1 - $H2 - Floor(Int((8 * $H1 + 13) / 25)) $d = Mod((19 * $a + $M), 30) $e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7) If $d + $e = 35 Then $Easter = 50 Else If $d = 28 And $e = 6 And $a > 10 Then $Easter = 49 Else $Easter = 22 + $d + $e EndIf EndIf If $Easter < 32 Then $EasterDay = $Easter $EasterMonth = "03" Else $EasterDay = $Easter - 31 $EasterMonth = "04" EndIf If $EasterDay < 10 Then $EasterDay = "0" & $EasterDay EndIf ; $EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay ; english notation $EasterDate = $EasterDay & "." & $EasterMonth & "." & $year ; german notation Else $EasterDate = -1; input year is out of range EndIf Return $EasterDate EndFunc ;==>_easter -
Das Main-Window hat einen sehr seltsamen Style-Mix. Einige dieser Styles widersprechen sich selbst (z.B. POPUP und CAPTION).
Erstelle also das Main erst mal mit gültigem Style, vielleicht ist dein Problem dann schon gelöst. -
das "." darf offensichtlich nicht verwendet werden:
Ist zwar unverständlich, wenn es in der Stable angeführt wird aber auch eine Verwendung von DllStructGetData statt dessen führt zum selben Fehler.
-
Du kannst Variablen auch vorher erstellen und als Referenz übergeben, sodass diese innerhalb der Funktion befüllt werden. Geht mit einzelnen Werten oder auch mit Array-Variablen.
-
Hi,
ich habe das Problem mal auf folgende Funktion reduziert, in der der Fehler entsteht.
Ich erstelle eine Struktur und befülle diese mit Werten. Die Struktur selbst wird als Pointer in einer anderen Struktur abgespeichert, ebenso der Struktur--String. Die Überprüfumg innerhalb der Funktion ist erfolgreich. Jedoch liefert dieselbe Überprüfung mit der zurückgegebenen Struktur fehlerhafte Werte. Jemand eine Idee warum?AutoIt
Alles anzeigen$tRet = _SomeFunc() $tRetTime = DllStructCreate($tRet.tagTime, $tRet.Time) For $i = 1 To 6 ConsoleWrite('Return ' & $i & ': ' & DllStructGetData($tRetTime, $i) & @CRLF) Next Func _SomeFunc() Local $tagTime = 'char Year[4];char Month[2];char Day[2];char Hour[2];char Min[2];char Sec[2]' Local $tTime = DllStructCreate($tagTime) DllStructSetData($tTime, 'Year', @YEAR) DllStructSetData($tTime, 'Month', @MON) DllStructSetData($tTime, 'Day', @MDAY) DllStructSetData($tTime, 'Hour', @HOUR) DllStructSetData($tTime, 'Min', @MIN) DllStructSetData($tTime, 'Sec', @SEC) Local $t = DllStructCreate('struct;ptr Time;char tagTime[75];endstruct') DllStructSetData($t, 'Time', DllStructGetPtr($tTime)) DllStructSetData($t, 'tagTime', $tagTime) ; prüfen ob Struktur gefüllt und auslesbar Local $tCheck = DllStructCreate($t.tagTime, $t.Time) For $i = 1 To 6 ConsoleWrite('Check Feld ' & $i & ': ' & DllStructGetData($tCheck, $i) & @CRLF) Next Return $t EndFunc