An dem Befehl wirds nicht leigen. da brauch ich schon den zusammenhang -> ganzes script.
Was das prüfen angeht ob irgendwas ausgewählt ist: guictrlread($COMBO)<>"". Wenn nichts ausgewählt ist, wird ein leerer String zurückgegeben
Beiträge von Kanashius
-
-
Ja, while fällt weg.
Löschfunktion: sieh dir mal IniDelete an (IniDelete($sIniToChange,GUICtrlRead($iComboSection),GUICtrlRead($iComboData)))
Was den schutz angeht: am einfachsten wäre es, wenn du einfach beim Buttonklick prüfst, ob in den controls was steht (mit guictrlread(...)). Ansonsten müsstest du mit WM_Notifity/WM_Command arbeiten um zu erkennen, wann benutzereingaben getätigt werden, damit du in dem fall, dass alle inhalt haben den button enablen kannst. Das ist denke ich für dich als anfänger noch etwas zu schwer -
Nur zur Verbesserung, damit du was lernst
AutoItwhile _GUICtrlComboBox_DeleteString($iComboData,0)<>-1 _GUICtrlComboBox_ResetContent($iComboData) $data="" GUICtrlSetData($iInputValue,$data) WEnd ;besser so: ;Wieso alle Elemente einzeln löschen (Whileschleife), wenn der Reset Befehl alle löscht? (hatte den Befehl zu dem zeitpunkt nicht gefunden) ;Diese beiden aufrufe solltest du nicht in die Whileschleife packen. Warum auch, muss ja nicht x Mal gemacht werden, sondern nur einmal. _GUICtrlComboBox_ResetContent($iComboData) GUICtrlSetData($iInputValue,"") ;ne exra variable ist hier unnötig.
-
Generell würde ich empfehlen immer mit UBound($array) zu arbeiten. Ich finde, das mit der Anzahl im ersten Eintrag ist eher unnötig... Wenn ich eine so große Schleife habe, dass der UBound() aufruf ne Rolle speilt speicher ich das eben extra in ne variable... aber immer nen Wert in ein Datenarray zu packen, der da eigentlich nichts verloren hat, weil er keinen Datensatz darstellt finde ich einfach nur nervig. Insbesondere, wo das nur bei manchen Funktionen der Fall ist. Ich finde, dass sollte man komplett rausnehmen.
-
Oh, hatte nicht dran gedacht, dass der das hinzufügt. Habs oben geändert.
-
Wenn du den Befehl in SciTe eintippst (und Scite4AutoIt) nutzt, kannst du auch, wenn du auf die Funktion geklickt hast mit F1 die Hilfe zu dem Befehl direkt aufrufen.
AutoIt
Alles anzeigen#include <GuiComboBox.au3> ;global variables Global $sIniToChange="test.ini" ;Gui $hGui=GUICreate("Change Ini",400,300) $iComboSection=GUICtrlCreateCombo("",10,10,185) $iComboData=GUICtrlCreateCombo("",205,10,185) $iInputValue=GUICtrlCreateInput("",10,40,380) $iButtonSave=GUICtrlCreateButton("Save Value",10,70,380) ;loadIni $ar=IniReadSectionNames($sIniToChange) $string="" ;Gehe alle Namen durch (außer den ersten Eintrag, da steht die Anzahl der Einträge drin for $i=1 to UBound($ar)-1 step 1 ;Wenn der Name nicht SETUP ist, füge ihn der Combobox hinzu if $ar[$i]<>"SETUP" then $string&=$ar[$i] ;Wenn wir nicht beim letzten Namen sind füge den Trenner für einzelne Einträge hinzu if $i<>UBound($ar)-1 then $string&="|" endif endif next ;schreibe die Einträge in die Combo GUICtrlSetData($iComboSection,$string) ;showGui GUISetState(@SW_SHOW,$hGui) while 1 ;Frag ob irgendwelche nutzereingaben erfolgt sind $msg=GUIGetMsg() Switch $msg ;Combo wurde geklickt Case $iComboSection while _GUICtrlComboBox_DeleteString($iComboData,0)<>-1 WEnd ;lade die Section und füge alle Variablen in die 2te Combo ein $ar=IniReadSection($sIniToChange,GUICtrlRead($iComboSection)) $string="" for $i=1 to UBound($ar)-1 step 1 $string&=$ar[$i][0] if $i<>UBound($ar)-1 then $string&="|" endif next GUICtrlSetData($iComboData,$string) Case $iComboData ;les die Variable, die in Section+key steht, welche oben ausgewählt wurden $data=IniRead($sIniToChange,GUICtrlRead($iComboSection),GUICtrlRead($iComboData),"") ;setze den Input auf diesen Wert GUICtrlSetData($iInputValue,$data) Case $iButtonSave ;schreibe die Änderung in die Inidatei IniWrite($sIniToChange,GUICtrlRead($iComboSection),GUICtrlRead($iComboData),GUICtrlRead($iInputValue)) Case -3 ;Programm beenden, wenn das Fenster geschlossen wird exit EndSwitch WEnd
Das Script dürfte genau das machen, was du möchtest, falls du noch hilfe brauchst, oder nicht weiterkommst kannst du ja hier fragen :).
Kannst ja nen bisschen Basteln.MfG Kanashius
-
Wenn du einfach Daten speichern willst machs doch einfach in einer Datei, die du Zeilenweise einließt. Jede Zeile ist ein Eintrag im DropDownmenü.
Was auch immer du mit der Kommandozeile willst, keine Ahnung, was du meinst.
Was für Errors, und was für Scripte.
Ich hab weder verstanden, was du genau willst, noch, woran es scheitert. Magst du das bitte noch etwas genauer erläutern?MfG Kanashius
Normaler for-schleifen aufbau:
-
nutz doch um alle Dateien aufzulisten.
_FileListToArrayRec ( $sFilePath [, $sMask = "*" [, $iReturn = $FLTAR_FILESFOLDERS [, $iRecur = $FLTAR_NORECUR [, $iSort = $FLTAR_NOSORT [, $iReturnPath = $FLTAR_RELPATH]]]]]
Dann mitAutoItlocal $searchPath="searchpath" local $ignorePath=["pfad1","pfad2"] $files=_FileListToArrayRec($searchPath,"*",1,1,0,2) for $i=0 to ubound($ignorePath)-1 step 1 for $j=0 to ubound($files)-1 step 1 if stringinstr($files[$j],$i)<>1 then ;was auch immer passieren soll :) endif next next
Bei _FileListToArrayRec kannst du bei $sMask auch alle Ordner eintragen, die er nicht auflisten soll.
Ich hoffe, das hilft dir weiter.MfG Kanashius
-
Super!
(Welcher Programmierer benutzt auch schon speiziellere sonderzeichen in Dateinamen . Ich vermeide oft sogar Leerzeichen^^. Spätestens wenn man einmal Probleme damit hatte macht man das nicht mehr ) -
Das Prinzip gefällt mir gut, allerdings würd ich die Abfragen, ob eine Eingabe zulässig ist, z.B. auch mit in die GUI nehmen. Sonst muss man für jede der Funktionen, die nur bestimmte Werte haben sollen, noch ne Funktion schreiben -> wäre eher blöd. So sitzt es bequem bei dem (z.B.) Inputfeld.
Ich würds aber auch nur für größere Projekte verwenden. Bei kleineren ist es eher unübersichtlich -
Tutorials helfen allen weiter. Das Buch von @peethebee wird ja auch weiterverlinkt.
Wenn es also sinnvoll ist und Autoit behandelt solltest du es hier auch posten dürfen. -
Beim Fileopen musst du angeben, welches TextFormat deine Datei benutzt. (Kannst du leicht herausfinden, wenn du Notepad++ öffnest und dann dort unter Kodierung nachsiehst.) Bei Fileopen dann einfach die Passenden Flacks setzen. (Bei mir müsste beim FileReadToArray statt des Dateinamens der handle übergeben werden, der bei fileopen herauskommt:)
Für die Flags: siehe Hile. Standartmäßig wird glaub ich ANSI verwendet. (ISO...) Für russische Zeichen benötigst du vermutlich UTF8 (FLAG: 128), musst du aber mit Notepad++ oder ähnlichem mal gucken.
Fürs speichern gilt dasgleiche -
Ich wüsste jetzt nicht, warum das langsamer sein sollte, aber versuch doch mal ControlSend, oder gleich controlsettext. Dürfte einfacher sein (wenns mit deinem fenster geht)
-
Was die geschwindigkeit angeht: Poste mal das ganze Script. Ich vermute, du hast da ein paar stellen, die ausbremsen. Dann können wir das schneller machen.
Hab dir mal nen Script geschreiben. kannst ja mal testen. Müsste ziemlich schnell durchlaufen ;DAutoIt
Alles anzeigen$file = "Datei.txt" _readData($file) Func _readData($file) $ar = FileReadToArray($file) $lastMainWord = "" For $i = 0 To UBound($ar) - 1 Step 1 If Not $ar[$i] = "" Then If StringRegExp($ar[$i], "^{.+}$", 0) Then $ar[$i] = "" Else If StringInStr($ar[$i], "Feld") = 1 Then $ar[$i] = $lastMainWord Else If Not StringRegExp($ar[$i], "^\d", 0) Then $lastMainWord = $ar[$i] $ar[$i] = "" EndIf EndIf EndIf EndIf Next #cs Falls es nicht in eine Datei geschrieben werden soll, sondern als Array zurückgegeben werden soll: local $count=0 for $i=0 to ubound($ar)-1 step 1 if $ar[$i]<>"" then $count+=1 endif next local $ar2[$count] $count=0 for $i=0 to ubound($ar)-1 step 1 if $ar[$i]<>"" then $ar2[$count]=$ar[$i] $count+=1 endif next return $ar2 #ce $file = FileOpen($file, 2) For $i = 0 To UBound($ar) - 1 Step 1 If $ar[$i] <> "" Then FileWriteLine($file, $ar[$i]) EndIf Next FileClose($file) Return True EndFunc ;==>_readData
Falls du an dem Code etwas nicht verstehst kannst du mich gerne fragen
Edit: Da war @Christoph54 schneller
-
Hier hast du deinen Standart, zumindest für Windows ;D
(Google: zahlen der tasten msdn, und dann nen bisschen scrollen ;))
https://msdn.microsoft.com/de-de/library/…1(v=vs.71).aspx
Die restlichen Tasten hängen glaub ich von der Tastatur ab -
Auf die schnelle habe ich da 2 gute Info-Seiten gefunden:
Memory auslesen
Memory bearbeiten (mit Prozess)
Ich hoffe, das hilft dir weiter, auch wenn ich mich frage, ob es so viel Sinn macht, den Memory zu blockieren/änderungen darin festzustellen.
Wenn wirklich jemand da dran will, kommt er auch dran. Du kannst es nur schwerer machen. Alles, was ohne Passworteingabe eines Users,... läuft kann irgendwie geknackt werden... Der Computer muss ja auch irgendwie an die Daten kommen. Will jemand den Memory deines Programmes auslesen und weiß wie das geht, hat er vermutlich auch das Wissen/Können, um da anders dranzukommen.MfG Kanashius
-
Hilfe zu _IsPressed:
_IsPressed ( $sHexKey [, $vDLL = 'user32.dll'] )01 Left mouse button -> _IsPressed(01)
Du kannst nicht einfach den String der Taste übergeben, wenn dort steht, dass eine HexVariable (Zahl) gefordert wird
Wenn du in einer Schleife,... aufrufst würde ich dir empfehlen DllOpen("user32.dll") an _isPressed zu übergeben, sonst muss die dll bei jedem aufruf der methode neu geladen werden -> langsam
Zum ermitteln kannst du ja einfach die taste gedrückt halten und dann nen progamm starten, dass in ner schleife alle zahlen von 0 bis bsp. 1000 durchgeht, und die zahl ausgibt, bei der _ispressed true ergibt -
Naja... AutoIt ist gut und schön, da es aber eine Scriptsprache ist, kannst du alles was auf Geschwindigkeit (große Datenmengen) geht, meist vergessen.
Dafür kann man sich alleine den Epub-Reader von mir ansehen: EPUB/E-Book Verwaltung und Reader
Das Laden von ~40000 Datensätzen (hab zum testen welche erstellt), dauert mit dem AutoIt-Programm ~30 sek., Allein das leeren der ListView dauert EWIG. (neu erstellen wäre schneller...).
In QT (C++) geht das Laden in ~3 sekunden und das leeren der Listview merk ich nichtmal wirklich...
(Ich bin mir natürlich bewusst, dass man mit Sicherheit beide Scripte noch optimieren kann ;), ist jetzt auch nur nen Beispiel.) -
An sich jedesmal, da du bei jedem Aufruf ein neues Brush-Objekt erzeugst. Gibst du es nicht wieder frei bleibt es im Speicher enthalten. Kannst du einfach testen, indem du ne Endliosschleife um den Befehl packst und den Arbeitsspeicher beobachtest. Bei 3 Brushes wird das aber nicht auffallen, wenn du die nicht wieder freigibst
-