Dein Script funktioniert einwandfrei! Sowohl in der Scite-Konsole, als auch bei Win7 als Konsolenprogramm kompiliert. Jedenfalls bei mir....
Beiträge von Andy
-
-
Zitat
Selbst wenn du da einen 1-EUR Jober findest zum Programm schreiben, ist das noch immer 'ne Stange Geld.
und das mit dem Hintergrund, daß die (m.E. sehr professionell gemachte) Leitstelle im angegebenen Link für diese Funkspiele "zu mieten" ist! Mal die vorsichtig geschätzten 500-1000 Mannstunden Arbeit vorausgesetzt (der Programmierer hat keine Ahnung um was es geht und muss sämtliche Informationen erst erfahren/lernen) und mit einem relativ kleinen Stundenlohn multipliziert lässt sich die o.g. Leitstelle auf Jahre vom Ersteller mieten....
-
Hi, habe passend zum Thema gestern schon etwas (wie üblich etwas längeres^^) verzapft, aber durch die Forensoftware wurde der Beitrag ans Nuldevice geschickt....
Zunächst mal spielt der "Beep" eine Frequenz ab, ob die nun Sinusförmig ist, wage ich zu bezweifeln ^^, die Lautstärke (Amplitude) kannst du nicht beeinflussen.
Um einen (Sinus-)Ton auf einem Lautsprecher auszugeben, mußt du also y(t) (die elektrische Spannung, die den Lautsprecher zum Schwingen anregt) ausrechnen und damit den Lautsprecher ansteuern. Damit die Membran des Lautsprechers schwingt, muss sich die Spannung ändern, ansonsten knackt es nur einmal kurz. Diese Spannung je nach der vergangenen Zeit wird mit der folgenden Formel ausgedrückt:
y(t) = A * sin ( 2 * pi * f * t + phi)
Das A bestimmt die Amplitude, d.h. die "Lautstärke" des Tons, das kannst du bei BEEP() nicht beeinflussen
Die Frequenz f , nunja die wird nicht berechnet, sondern vorgegeben. f=1/T (T=Zeit von einem "Wellenberg" der Sinusfunktion zum nächsten)
Die Phasenverschiebung phi ist im vorliegenden Fall (eine Schwingung) auch egal, da es deinem Ohr völlig schnurz ist, ob das Signal eine Millisekunde früher oder später kommt.
Du kannst mit der Formel also den Wert auf der y-Achse zu jedem Zeitpunkt t errechnen.
Die Formel reduziert sich zu y(t)=sin(2*pi*f*t)2*pi ist der Kreisumfang, also einmal die "Abwicklung" des Kreises auf der x-Achse. Da die Sinusfunktion sich immer wiederholt, müssen nur die y-Werte zum Zeitpunkt t während einer Schwingung (2*pi) berechnet werden.
Gesucht ist also für jeden Zeitpunkt t die "Spannung" y(t), die an den Lautsprecher geschickt werden soll (diese Spannung lenkt die Membran aus!). Ist die Spannung y(t) über die Zeit t Sinusförmig, dann schwingt die Membrane und erzeugt einen "Sinuston". Soviel zur Theorie
AutoIt kommt ins Spiel...
Spoiler anzeigen
[autoit]$pi = atan(1)*4 ;3.14159265358979
[/autoit] [autoit][/autoit] [autoit]
$pi = ATan(1) * 4
$f = 100 ;frequenz in hertz
$TT = 1 / $f ;T=1/f
$w = 2 * $pi * $f ;omega=2*pi*f für Maschinenbauer gilt: OMEGA das weiß ich, Pi mal N durch dreißig!!! :o)
$yt = ""For $t = 0 To $TT Step $TT / 10 ;10 y(t)-Werte ()Amplituden) ermitteln für eine komplette sinusschwingung
[/autoit] [autoit][/autoit] [autoit][/autoit]
$yt &= Sin($w * $t) & @CRLF
Next
MsgBox(0, "Amplituden bei Frequenz " & $f & " Hz im Intervall 0-1/f", $yt)schön, wir haben nun 10 Amplituden unserer Sinusschwingung, wie bekommen wir die auf unserem Lautsprecher ausgegeben?
Am einfachsten mit einer Wave-Datei (wav). Bei 8-Bit Mono entspricht jedes auf den DateiHeader folgende Byte einer Amplitude. HEUREKA! Also erstellen wir eine *.wav-Datei mit unseren Daten und lassen diese nun auf dem Soundsystem ausgeben.
Allerdings reichen unsere 10 berechneten Amplituden bei weitem nicht aus, um einen "schönen" Ton zu erreichen...wir wählen 22050 Werte/Sekunde (Samplingrate). Geteilt durch eine gewähle Frequenz von 440Hz sind das rund 50 Werte PRO EINE SINUSSCHWINGUNG!Und hier kommt AutoIt ins Spiel.....
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Memory.au3>
#include <MemoryConstants.au3>;Das Script erstellt eine WAV-Datei im Speicher, spielt diese ab und speichert anschließend in eine Datei
[/autoit] [autoit][/autoit] [autoit]$pi = 4 *atan(1) ;pi=3,1415926....
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$sekunden = 5 ;so lange soll der ton inb der abgespeicherten Datei abgespielt werden
$samplingrate = 22050 ;abtastungen pro sekunde
$BitsPerSample = 16 ;8,16,24 äquivalent die "Farbtiefe bei einem Bild",
$Channels = 2 ;1,2,4, Kanäle, mono, stereo usw$block = Int($Channels * $BitsPerSample /
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;1
$bytes = $samplingrate * $block
$samplefaktor = $BitsPerSample / 8 ;lokale hilfsvariable
$filesize = $samplefaktor * $sekunden * $samplingrate * $Channels + 44 - 8;struktur mit dem Header einer WAV-Datei erstellen
[/autoit] [autoit][/autoit] [autoit]
$struct = DllStructCreate("byte[" & $samplefaktor * $sekunden * $samplingrate * $Channels + 44 & "]") ;platz für unser sampling$s = "char RIFF [4];" & _ ;RIFF
[/autoit] [autoit][/autoit] [autoit]
"uint FileSize;" & _ ;Dateigröße-8 Bytes
"char WAVE [4];" & _ ;WAVE
"char fmt [4];" & _ ;fmt Header Signatur
"uint fmt_len;" & _ ;länge restl. fmt
"word Format;" & _ ;Datenformat s. Tabelle z.B. Wikipedia 1=PCM
"word Channels;" & _ ;Anzahl Kanäle 1=MONO
"uint Samplerate;" & _ ;Abtastrate pro Sekunde (22050)
"uint Bytes;" & _ ;Abtastrate * Block (22050)
"word Block;" & _ ;Channels * BitsPerSample / 8 (1)
"word BitsPerSample;" & _ ;8, 16, oder 24 (8)
"char DATA [4];" & _ ;DATA Header Signatur
"uint Len;" ;Länge des folgenden DatenblocksSwitch $samplefaktor ;je nach einstellungen platz für die wav-Daten reservieren
[/autoit] [autoit][/autoit] [autoit]
Case 1
$s &= "byte WAVDATA[" & $sekunden*$samplefaktor * $samplingrate * $Channels & "]"
Case 2
$s &= "word WAVDATA[" & $sekunden*$samplefaktor * $samplingrate * $Channels & "]"
Case 4
$s &= "dword WAVDATA[" & $sekunden*$samplefaktor * $samplingrate * $Channels & "]"
EndSwitch$wavstruct = DllStructCreate($s, DllStructGetPtr($struct)) ;struct "überlagern" damit alle Daten byteweise in eine Datei geschrieben werden können
[/autoit] [autoit][/autoit] [autoit];Unsere Daten für die Sinuswelle
[/autoit] [autoit][/autoit] [autoit]
$f = 440 ;frequenz in hertz
$TT = 1 / $f ;T=1/f
$w = 2 * $pi * $f ;omega=2*pi*f für Maschinenbauer gilt: OMEGA das weiß ich, Pi mal N durch dreißig!!! :o)
$Amplitude = 100 ^ $samplefaktor ;Lautstärke, bei 8 bit 100, bei 16 bit 10000
$i=0 ;anzahl der geschriebenen bytes (funktionswerte)
;hier gehts los, wir erstellen eine komplette sinuswelle, diese wird so lange wiederholt, bis die Abspieldauer in sekunden erreicht ist
For $t = 0 To $sekunden Step 1 / $samplingrate ;samplingrate y(t)-Werte ()Amplituden) ermitteln
$i += 1
$yt = Int($Amplitude * Sin($w * $t)) ;unsere altbekannte formel
if $i<110 then consolewrite($i&" "&$yt & @CRLF )
DllStructSetData($wavstruct, "WAVDATA", $yt, $i) ;schreiben von y(t) in die struct
If $Channels = 2 Then ;wenn 2 kanäle (stereo), dann das byte für den 2. Kanal hinzufügen
$i += 1
DllStructSetData($wavstruct, "WAVDATA", $yt, $i)
EndIf
Next;jetzt werden die Daten in die struct geschrieben, es entsteht eine WAV-Datei im Speicher
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($wavstruct, "RIFF", "RIFF")
DllStructSetData($wavstruct, "FileSize", $filesize)
DllStructSetData($wavstruct, "WAVE", "WAVE")
DllStructSetData($wavstruct, "fmt", "fmt ")
DllStructSetData($wavstruct, "fmt_len", 16)
DllStructSetData($wavstruct, "Format", 1) ;PCM
DllStructSetData($wavstruct, "Channels", $Channels)
DllStructSetData($wavstruct, "Samplerate", $samplingrate)
DllStructSetData($wavstruct, "Bytes", $bytes) ;samplerate*block
DllStructSetData($wavstruct, "Block", $block)
DllStructSetData($wavstruct, "BitsPerSample", $BitsPerSample)
DllStructSetData($wavstruct, "DATA", "data")
DllStructSetData($wavstruct, "Len", Int($samplingrate / $f * $Channels * $samplefaktor));hier wird NUR DIE LÄNGE DER ERSTEN SINUSWELLE eingetragen, um den Sound im speicher abzuspielen$data = ""
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 1 To 14 ;anzeigen des WAV-Headers
$data &= DllStructGetData($wavstruct, $i) & @CRLF
Next
MsgBox(0, "Daten WAV-Header", StringLeft($data, 100))_Playsound(DllStructGetPtr($wavstruct), 1) ;abspielen des sounds aus dem speicher, Ton wird immer wiederholt
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Msgbox(0,"Ton mit Frequenz "&$f&" Hz","Spieldauer "&$sekunden&" Sekunden",$sekunden);sound mit Länge von Sekunden in Datei abspeichern ; dafür muss die länge des sounds in der struct geändert werden von einer wellenlänge(s.o.) zur Länge aller wellen bis zum ende der spielzeit
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($wavstruct, "Len", Int($sekunden *$samplingrate * $Channels * $samplefaktor));hier wird NUR DIE LÄNGE DER ERSTEN SINUSWELLE eingetragen, um den Sound im speicher abzuspielen$sdat = DllStructGetData($struct, 1) ;struktur in eine Datei schreiben
[/autoit] [autoit][/autoit] [autoit]
$wavdata = StringLeft(BinaryToString($sdat), $sekunden *$samplingrate * $Channels * $samplefaktor + 44)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $wavdata = ' & StringLen($wavdata) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$wav = FileOpen("test1.wav", 18)
$bindata = FileWrite($wav, $wavdata)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bindata = ' & $bindata & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
FileClose($wav)shellexecute("test1.wav") ;wavedatei abspielen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
exitFunc _PlaySound($sSoundFile, $mem = 0) ;mem=1 spielt sound aus dem speicher, dann muss $sSoundfile der pointer zum anfang der struct sein
[/autoit] [autoit][/autoit] [autoit]
Local Const $SND_ALIAS = 0x10000
Local Const $SND_ALIAS_ID = 0x110000
Local Const $SND_APPLICATION = 0x80
Local Const $SND_ASYNC = 0x1
Local Const $SND_FILENAME = 0x20000
Local Const $SND_LOOP = 0x8
Local Const $SND_MEMORY = 0x4
Local Const $SND_NODEFAULT = 0x2
Local Const $SND_NOSTOP = 0x10
Local Const $SND_NOWAIT = 0x2000
Local Const $SND_PURGE = 0x40
Local Const $SND_RESOURCE = 0x40004
Local Const $SND_SYNC = 0x0
If $mem = 1 Then
$a = DllCall('winmm.dll', 'int', 'PlaySoundA', 'ptr', $sSoundFile, 'int', 0, 'int', BitOR(4, 1, 8, 2, 0x10))Else
[/autoit]
$a = DllCall('winmm.dll', 'int', 'PlaySoundA', 'str', $sSoundFile, 'int', 0, 'int', BitOR(1, 8))
EndIf
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a[0] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
EndFunc ;==>_PlaySoundHausaufgabe: bastel eine schöne GUI^^
-
Zitat
4GB RAM, sind die unter XP ueberhaupt adressierbar
Nein, für XP sind 2 Gig auch ausreichend.
ZitatDen größten Effekt wirst Du mit einer neuen schnellen(!) Festplatte erzielen
Könnte sein, aber erstens hat das Board sicherlich kein Sata und zweitens nützt die schnellste Platte nichts, denn das (durch mehr RAM) "nicht geswappte" Ram ist tausendfach schneller^^
-
-
IdR bemerkt man (subjektiv) "Verbesserungen" im Programmablauf erst ab einer Geschwindigkeitssteigerung von zw. 20 und 30% . Für die 100€ solltest du Prozessor und Ram bekommen, die diesen Zustand locker erreichen. Ich vermute, sämtliche sonstigen Tuningmaßnahmen hast du bereits ausgenutzt, die da wären sämtliche Tuningprogramme und allen unnötigen Müll von der Maschine runterzuwerfen, neueste Treiber einzuspielen usw. Defragmentierung hilft ggf auch weiter (gerade bei Spielen!)
Vor Jahren hat die Aufrüstung eines Rechners mit 1Gig Ram statt der 512 MB dazu geführt, daß ich nicht mal den Prozessor upgegradet habe. Die "gefühlte Schwuppdizität" (und nur die ist wichtig^^) wurde jedenfalls verbessert, das Plattengerödel hörte weitgehend auf.Bei der Gelegenheit der Aufrüstung bietet es sich auch an, Kühler, Lüfter usw. sauberzumachen, von einem Bekannten bekam ich ein Notebook geschenkt, weil es "saulangsam" war. Kein Wunder, der Prozessor hatte sich aus überlebenstechnischen Gründen nach 10 Minuten Laufzeit bis aufs Minimum runtergetaktet. Sämtliche Kühler/Lüfter waren mit Staub zugesetzt! Zerlegt, gereinigt, zusammengebaut, läuft wie Lotte!
-
In China ist ein Sack Reis umgefallen, also ruf ich dort an, sag denen Bescheid und die schicken einen hin der den Sack wieder aufstellt!
Ersetze:
"In China" durch "Bei meinem Computer"
"ist ein Sack Reis umgefallen" durch "funktioniert ein Programm nicht mehr"
"also ruf ich dort an, sag denen Bescheid" durch "also installiere ich neu"
"die schicken einen hin der den Sack wieder aufstellt" durch "und alles funktioniert wieder"*don´t feed the troll*
-
Das Problem liegt nicht an Opera, sondern an Woltlab. Fixes für die Forensoftware sind dort anscheinend "in der Mache", aber nicht vor der nächsten großen Release vorgesehen. Wenn ich aber den mit der heissen Nadel gestrickten Kram dort sehe, der nichts anderes macht, als einem OperaUser das Javascript vorzuenthalten, dann viel Spass....das kann ich nämlich selbst abschalten....
Ja, ich habe auch bereits mehrmals Javascript ausgeschaltet um Posten zu können (mehrere Beiträge sind auch schon ins NUL-Device geflogen), allerdings werde ich weder auf den FF noch sonst irgendeinen Browser umsteigen nur weil der Hersteller einer Forensoftware aufgrund der Abneigung gegen einen bestimmten Browser nicht gewillt ist, in einer angemessenen Zeit seine Arbeit ordentlich zu machen!
In anderen Foren habe ich dieses Problem nicht, dort bekommen zahlende Betreiber funktionierende Software für ihr Geld. Oder setzt mein "buggy" Browser dort eine andere JS-Engine ein? -
Zitat
da man JAVA sonst auch in die Scriptsprachengruppierung fassen müsste.
Wo sie zusammen mit den meisten plattformunabhängigen "Sprachen" auch hingehören....Das ist genau der Sinn!
Es ist wesentlich einfacher, einen kleinen Teil eines Systems umzubauen, als das gesamte System. Heute läuft auf jeder Armbanduhr und in jeder Mikrowelle Java, kein Hersteller traut sich mit HARDWARE auf den Markt, für die es keine passenden Compiler/Interpreter/Wieauchimmerübersetzer gibt.
Java hat´s vorgemacht, aber Sun hat es durch ihr Lizenzsystem verbockt wie ehemals IBM mit dem Microchannel! .Net hätte aus den Fehlern lernen können, Billyboy hat´s verbockt. Und Apple lacht sich solange tot und scheffelt derweil Milliarden mit der Arbeit von anderen! Statt die Systeme weiter zu öffnen wird zzt immer mehr gekapselt. Selbst Google, die ausschliesslich mit "gegen den Strom schwimmen" erfolgreich wurden, fängt nun an mit den anderen mitzurudern..... -
Wobei es eigentlich wesentlich wichtiger ist, das aktuelle Problem schnell und vor allem einfach zu lösen.
Bis der .Net-"Programmierer" sein Projekt überhaupt eingerichtet hat, ist das AutoIt-"Script" schon am laufen...
Wobei wir wieder beim Startpost wären
Welches Problem wird durch das Programm "zu langsam" gelöst? -
Hi, um was gehts denn überhaupt?
"Schneller" ist relativ, 10x, 100x, 1000x schneller? 10^28x schneller? Oder reicht es, wenn einige Funktionen 10% schneller sind?
Generell sollte man seinen Code kennen, denn dort liegt das größte Potential. 90% der Zeit verbringt die meiste Software in bestimmten Programmteilen, den sog. "Hot Spots". Diese dann zu optimieren bringt dann natürlich am meisten.Das meiste Potential steckt allerdings in den verwendeten Algorithmen. Das zeigen die µIt´s und µIt-Light hier im Forum deutlich!
Allerdings muss man bedenken, daß man sich AutoIt als Sprache ausgesucht hat, weil man damit einfach,schnell und effizient Problemlösungen erstellen kann. Man muß man sich auch keine Gedanken über Datentypen, richtiges Alignement uvm. machen, was in anderen Programmiersprachen Kopfschmerzen verursacht^^
Zum Thema DLL, die erstellt eine ordentliche Entwicklungsumgebung per Knopfdruck. Und man hat den großen Vorteil, die enthaltenen Funktionen auch mit anderen Programmiersprachen nutzen zu können. Im Prinzip nichts anderes als eine "UDF", die nicht per <include>, sondern per DllCall() eingebunden wird.
Und mit welcher Sprache man diese DLL erstellt, ist auch schnurz, die meisten Compiler erzeugen heutzutage schnellen Code. Es gibt Basicdialekte (wozu man übrigens auch AuToIt zählen kann), bei denen muss man sich nicht groß umstellen. Es muß nicht immer C sein.
Außerdem gibt es kaum noch ein programmiertechnisches Problem, bei dem die Lösung NICHT in DLL-Form vorliegt... -
Hi, nur weil ich nicht auf @error teste heisst das nicht, daß du das auch so machen musst!
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
$file = "ausgabe.txt"
$a = _fileEinlesen($file)
_ArrayDisplay($a)Func _FileEinlesen($target)
[/autoit] [autoit][/autoit] [autoit]
;~ MsgBox(0, "", $target)
Dim $array_content
$a = _FileReadToArray($target, $array_content)
If @error Then
MsgBox(0, "Fehler im Modul _FileEinlesen()", "Datei " & $target & " kann nicht gelesen werden!")
Return SetError(1, 0, 0)
EndIf
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : UBound($array_content) = ' & UBound($array_content) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
if UBound($array_content) <= 2 then return $array_content ;wenn nur ein element
; _arraydisplay($array_content)
_ArraySort($array_content)
$auswertung = _ArrayUnique($array_content, 1, 1)$i = 0
[/autoit]
Do
$i += 1
Do
$split_1 = StringSplit($auswertung[$i], @TAB)
$split_2 = StringSplit($auswertung[$i + 1], @TAB)
If $split_1[1] = $split_2[1] Then _ArrayDelete($auswertung, $i + 1)
; _arraydisplay($auswertung,$i&" "&UBound($auswertung))
Until $split_1[1] <> $split_2[1] Or $i + 1 = UBound($auswertung) - 1
Until $i + 1 = UBound($auswertung) - 1
Return $auswertung
EndFunc ;==>_FileEinlesenBtw gehören noch wesentlich mehr @error-Abfragen in dein Script! Dann finden sich diese "Fehler" nämlich von selbst

-
Hallo, mal ein Beispiel....
Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>Dim $Material_Radio[10] ;platz für 10 Buttons
[/autoit] [autoit][/autoit] [autoit]
Dim $status_Radio[10] ;platz für 10 Buttons#region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Form1", 556, 336, 192, 121)
$Group1 = GUICtrlCreateGroup("Material", 0, 0, 281, 145)
$Material_Radio[0] = GUICtrlCreateRadio("Fliesen", 0, 25, 100, 17)
$Material_Radio[1] = GUICtrlCreateRadio("Holz", 0, 50, 100, 17)
$Material_Radio[2] = GUICtrlCreateRadio("Sand", 0, 75, 100, 17)
$Material_Radio[3] = GUICtrlCreateRadio("Eimer", 0, 100, 100, 17)
$Material_Radio[4] = GUICtrlCreateRadio("Streckmetall", 100, 25, 100, 17)$Group2 = GUICtrlCreateGroup("Auftrag Status", 280, 0, 273, 145)
[/autoit] [autoit][/autoit] [autoit]
$status_Radio[0] = GUICtrlCreateRadio("Bestellt", 280, 24, 113, 17)
$status_Radio[1] = GUICtrlCreateRadio("Geliefert", 280, 48, 113, 17)$Edit1 = GUICtrlCreateEdit("", 0, 144, 553, 161)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Button2 = GUICtrlCreateButton("Übernehmen", 232, 304, 75, 25, $WS_GROUP)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW)#endregion ### END Koda GUI section ###
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button2 ;"Übernehmen" Button abfragen
_Edit_beschreiben()
EndSwitch
WEndFunc _Edit_beschreiben()
[/autoit]
$material = "" ;noch kein Material ausgewählt
$Status = "" ;noch kein status ausgewählt
For $i = 0 To UBound($Material_Radio) - 1 ;alle materialen durchsuchen
If BitAND(GUICtrlRead($Material_Radio[$i]), $GUI_CHECKED) = $GUI_CHECKED Then ;wenn Material-Radiobutton gechecked, dann
$material = GUICtrlRead($Material_Radio[$i], 1) ;material merken
EndIf
If BitAND(GUICtrlRead($status_Radio[$i]), $GUI_CHECKED) = $GUI_CHECKED Then ;wenn Status-Radiobutton gechecked, dann
$Status = GUICtrlRead($status_Radio[$i], 1) ;Status merken
EndIf
Next
If $material = "" Then ;kein Material ausgewählt
MsgBox(0, "Fehler Eingabe", "Es wurde kein Material ausgewählt!")
Return
EndIf
If $Status = "" Then ;kein Status ausgewählt
MsgBox(0, "Fehler Eingabe", "Es wurde kein Auftrag Status ausgewählt!")
Return
EndIf
$neue_zeile = "Material: " & $material & @TAB & @TAB & "Status: " & $Status ;zeile generieren
$text = GUICtrlRead($Edit1, 0) ;inhalt EDIT1
If StringInStr($text, $neue_zeile) = 0 Then ;nur eintragen, falls noch nicht im Edit1 vorhanden
GUICtrlSetData($Edit1, $text & $neue_zeile & @CRLF)
EndIf
EndFunc ;==>_Edit_beschreiben -
Hallo, mal auf die schnelle ein Beispiel, wie man die Wortliste entschlacken könnte, statt Arrays bieten sich in einem "Wörterbuch" aber auch die sehr schnellen
[autoit]$obj = ObjCreate("System.Collections.ArrayList") ;oder
[/autoit]
$oDictionary = ObjCreate('Scripting.Dictionary')-Funktionen an
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>$ausgabedatei = "Ausgabe_test.txt"
[/autoit] [autoit][/autoit] [autoit]
FileDelete($ausgabedatei) ;zum test löschen
$datei_inhalt = ""
Dim $array_inhaltFor $i = 1 To 100 ;ein zufälliger dateiinhalt wird erstellt
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$datei_inhalt &= "wort" & Random(1, 5, 1) & @TAB & "---> Liste Wort enthalten in Datei" & Random(1, 2, 1) & " und Datei" & Random(3, 4, 1) & @CRLF
$datei_inhalt &= "wort" & Random(1, 5, 1) & @TAB & "---> Liste Wort enthalten in Datei" & Random(3, 4, 1) & " und Datei" & Random(1, 2, 1) & @CRLF
Next
$datei_inhalt &= "wort" & Random(7, 8, 1) & @TAB & "---> Liste Wort enthalten in Datei" & Random(3, 4, 1) & " und Datei" & Random(1, 2, 1) & @CRLF
FileWrite($ausgabedatei, $datei_inhalt) ; dateiinhalt in datei schreiben
MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$datei_inhalt' & @LF & @LF & 'Return:' & @LF & $datei_inhalt) ;### Debug MSGBOX$split = _FileReadToArray($ausgabedatei, $array_inhalt) ;dateiinhalt in ein array
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $split = ' & $split & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console_ArrayDisplay($array_inhalt, "Dateiinhalt")
[/autoit] [autoit][/autoit] [autoit]_ArraySort($array_inhalt) ;sortieren
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($array_inhalt, "sortiert")$auswertung = _ArrayUnique($array_inhalt, 1, 1) ;mehrfache wörter eliminieren
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($auswertung, "Unique");nun die doppelt vorkommenden Hinweise im Text reduzieren, "wort1 in Datei1 und Datei2"<>"wort1 in Datei2 und Datei1"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$i = 0
Do
$i += 1 ;nächstes wort
Do
$split_1 = StringSplit($auswertung[$i], @TAB) ;zeile splitten
$split_2 = StringSplit($auswertung[$i + 1], @TAB) ;nächste zeile splitten
If $split_1[1] = $split_2[1] Then _ArrayDelete($auswertung, $i + 1) ;falls beide wörter gleich sind, zeile eliminieren
Until $split_1[1] <> $split_2[1] Or $i + 1 = UBound($auswertung)-1 ;solange, bis es keine doppelten wörter gibt, oder das ende der liste erreicht ist
Until $i + 1 = UBound($auswertung)-1 ;solange, bis das ende der liste erreicht ist_ArrayDisplay($auswertung, "Auswertung abgeschlossen")
[/autoit]
FileDelete($ausgabedatei) ;zum test löschen -
Wenn ich mir die Scriptausschnitte anschaue, vermute ich auch einen Bedarf am OnEventmodus^^
[autoit]
Weiterhin würde ich empfehlen, sämtliche Fenster beim Programmstart zu erstellen und dann nur noch bei Bedarf mittelsGuiSetState()
[/autoit]ein- bzw. auszublenden @SW_ENABLE bzw SW_DISABLE.
-
Der Test per CTRL+C sollte nur prüfen, ob du überhaupt an den "Text" kommst, das klappt jedenfalls schonmal.
ZitatWenn ich an den Text der dargstellt wird rankommen würde, würde mir das ja auch schon helfen, dann kann man sich den Bereich ja rausziehen.
Wo ist dann das Problem?
[autoit]
Mit$text=clipget()
[/autoit]bekommst du doch den Text ins AutoIt....
Aber irgendwie muss ja die Ctrl-C-Funktion an den SAP-Fensterinhalt kommen, ggf. über eine der 32000 (teils undokumentierten) API-Funktionen

-
Heisst deine dll test1 oder test1.dll? Der vollständige Dateinamename sollte so auch in den dllcall().
Je nach Compiler ggf auch cdecl beachten, damit die Parameter richtig übergeben (zurückgegeben) werden.Edit: nach dem dll-call zuerst auf @error testen....
-
Hallo zusammen,
Ich möchte NICHT, daß die von mir vorgestellte Version mit dem "Embedded-Assembler" im Wettbewerb gewertet wird. Ich habe die Variante nur vorgestellt um zu zeigen, was mit einigen Zeilen Code auch in AutoIt Geschwindigkeitsmäßig machbar ist (obwohl es nach Optimierung auch noch ca. 100x schneller geht!).
Generell bin ich mit Blick auf die Zielgruppe des µIt-Light dafür, daß ausschliesslich die im Orginal AutoIt-Download enthaltenen Funktionen verwendet werden dürfen.Weiterhin sollten "selbstgeschriebene" Funktionen mit DLL-Calls z.B. der API nicht berücksichtigt werden.
Den µIt-Light habe ich immer als Ansporn für die Anfänger/ und "leicht" Fortgeschrittenen gesehen um an der Programmiertechnik und der Implementation von Algorithmen zu feilen (und um von den anderen zu lernen!). Und ich denke, so soll es auch bleiben....
-
Zitat
3. Man verschwendet gar keine Gedanken daran
"If you want to know how it works, read the source...."Bei dieser Art Fragen wundere ich mich immer, weshalb jemand "seinen" Code schützen möchte aber in einer "Scriptsprache" Programme schreibt, welche ( nach 2 Minuten googlen ) als absolut ungeeignet dafür erscheint.
Zitatwie man es diesen Decompile kiddies erschweren kann
Schreibe dein Programm selbstmodifizierend, packe es in einen selbstgeschriebenen Packer, lade nur Codefragmente in den Speicher uswusf. oder schreibe ein Programm, was für "Decompilekiddies" (ist das die Zielgruppe?) völlig uninteressant ist! -
Zitat
Ist aber nichts für den schmalen Geldbeutel
Und wie schon gesagt nichts für den Otto-Normalverbraucher.
Falls sowieso von extern Glasfaser Einzug hält, bietet sich die dann auch als interne "Verkabelung" an, damit hat auch die "Auflegerei" ein Ende....Preis spielt ja keine Rolle^^