Nein wieso denn? Zwischen Func/Endfunc wird die gewünschte Funktion definiert und diese kannst du dann wie im Beispiel oben an jeder Stelle des Skripts aufrufen.
Beiträge von nuts
-
-
-
Also früher war es mal so, dass die Array Rückgabe eines COM Objektes von autoit nicht unterstützt wurde.
Finde allerdings den Hinweis darauf nicht mehr in der Hilfe, daher nicht sicher ob dies noch gilt.
-
Dankeschön.
-
Hi Leute,
ist mir zwar etwas peinlich aber mir raucht der Kopf und daher dieser Thread.
Gesucht ist ein RepExp Pattern für folgenden String:
xyz123 steht dabei für eine beliebige Anzahl von Buchstaben und Ziffern, konstant im Aufbau sind die Sonderzeichen "-" und "\".
Gesucht ist alles ( aka "Suchstring" = beliebig viele Buchstaben und Ziffern) was zwischen dem zweiten "-" (von links) und dem ersten "\" steht.
Gruß & danke
Nuts
-
Devcon.exe ist ja auch nur ein wrapper um bestimmte Funktionen anzusprechen.
Hat enable/disable/status etc eigentlich schonmal jemand direkt in autoit umgesetzt?
Meine Fähigkeiten übersteigt das leider ...
-
Falls es jemand mal brauchen kann und die Variante von alpines wie ich nicht so richtig versteht hier noch meine Lösung:
Spoiler anzeigen
Code
Alles anzeigen#include <GUIConstants.au3> #Include <GUITreeView.au3> #Include <ArrayTree.au3> Global $s_inifile=FileOpenDialog("select ini file", @ScriptDir & "\" , "INI (*.ini)") if @error then exit Global $a_INI=_INI_to_3DArray($s_inifile) _ArrayDisplayTree($a_INI, "Example: INI to 3D Array") MsgBox(0, "", UBound($a_ini,3)) Func _INI_to_3DArray($s_data) ; ; ~~ nuts (www.autoit.de) ~~ ; ; $s_data = full path to .ini file ; ; returns a 3D Array with all sections (sectionnames and key/value) ; @error=1 => error in IniReadSectionNames ; @error=2 => error in IniReadSection Local $i_max=0 Local $b_redim=true Local $i_limit=50 Local $a_section Local $a_sectionNames=IniReadSectionNames($s_data) if @error then Return SetError(1,0,0) Local $i_sectionNames=Int($a_sectionNames[0]) Local $a_return[$i_sectionNames][$i_limit][2] ; create 3D Array for $i=1 to $a_sectionNames[0] $a_section=IniReadSection($s_data, $a_sectionNames[$i]) If @error then Return SetError(2,0,0) if $i_max < $a_section[0][0] then $i_max=$a_section[0][0]+1 If $i_max > $i_limit then ; Redim 3D Array if necessary ReDim $a_return[$i_sectionNames][$i_max][2] $b_redim=false ;MsgBox(0, "Redim", "slow redim ... :( ") ; debug endif $a_return[$i-1][0][0]=$a_sectionNames[$i] $a_return[$i-1][0][1]=$a_section[0][0] for $x=1 to $a_section[0][0] $a_return[$i-1][$x][0]=$a_section[$x][0] $a_return[$i-1][$x][1]=$a_section[$x][1] next next If $b_redim then Redim $a_return[$i_sectionNames][$i_max][2] ;MsgBox(0, "Redim", "slow redim on return ... :( ") ; debug endif Return $a_return endfunc
Damit sollten die Redims minimiert werden. Besonders schnell ist bei grossen INI's (gefühlt) trotzdem nicht, aber ich mache auch keine Anwendungen bei denen die Geschwindigkeit eine besonderere Rolle spielt.
-
Sehr cool und danke fürs teilen.
Mit den Listeview Gruppen kämpfe ich auch von Zeit zu Zeit und da ist dein Beispiel sicher mal hilfreich.
P.S.
Hast du ne Ahnung ob man auch leere Gruppen ohne Items erstellen und anzeigen kann? Ich verwende die Listview Gruppen für einen Editor für INI Dateien und sobald das letzte Key/Value Paar gelöscht wird muss die ganze Gruppe gelöscht werden.
-
Danke das sieht auch interessant aus.
Denke damit bastle ich mir passendes.
-
Ja also jedes mal "Redimmen" will ich auf jeden Fall nicht, aber du hast recht da ist ein Denkfehler drin. Wie kann ich denn zählen wieoft ich "Redimmen" muss? Die Information liegt mir doch erst vor wenn ich alle Sektionen durch habe?
Neuer Versuch:
Code
Alles anzeigenFunc _INI_to_3DArray($s_data) ; $s_data = full path to .ini file ; ; return 3D Array with all sections ; @error=1 => error in IniReadSectionNames ; @error=2 => error in IniReadSection Local $i_max=0 Local $i_limit=101 Local $a_section Local $a_sectionNames=IniReadSectionNames($s_data) if @error then Return SetError(1,0,0) Local $a_return[Int($a_sectionNames[0])][$i_limit][2] ; create 3D Array for $i=1 to $a_sectionNames[0] $a_section=IniReadSection($s_data, $a_sectionNames[$i]) If @error then Return SetError(2,0,0) if $i_max<$a_section[0][0] then $i_max=$a_section[0][0] If $a_section[0][0] > $i_limit-1 then ; if section has more than 100 entrys => resize 3D Array $s_limit=$a_section[0][0]+1 ReDim $a_return[Int($a_sectionNames[0])][$i_limit][2] endif $a_return[$i-1][0][0]=$a_sectionNames[$i] $a_return[$i-1][0][1]=$a_section[0][0] for $x=1 to $a_section[0][0] $a_return[$i-1][$x][0]=$a_section[$x][0] $a_return[$i-1][$x][1]=$a_section[$x][1] next next Redim $a_return[Int($a_sectionNames[0])][$i_max+1][2] Return $a_return endfunc
-
Hab das jetzt mal umgesetzt.
Vielleicht kann jemand nochmal drüber schauen? Weil mir raucht grad der Kopf vor lauter 3D Array ...
Code
Alles anzeigen#include <GUIConstants.au3> #Include <GUITreeView.au3> #Include <ArrayTree.au3> Global $s_inifile=FileOpenDialog("select ini file", @ScriptDir & "\" , "INI (*.ini)") if @error then exit Global $a_INI=_INI_to_3DArray($s_inifile) _ArrayDisplayTree($a_INI, "Example: INI to 3D Array") Func _INI_to_3DArray($s_data) ; $s_data = full path to .ini file ; ; return 3D Array with all sections ; @error=1 => error in IniReadSectionNames ; @error=2 => error in IniReadSection Local $i_max=0 Local $i_limit=101 Local $a_section Local $a_sectionNames=IniReadSectionNames($s_data) if @error then Return SetError(1,0,0) Local $a_return[Int($a_sectionNames[0])][$i_limit][2] ; create 3D Array for $i=1 to $a_sectionNames[0] $a_section=IniReadSection($s_data, $a_sectionNames[$i]) If @error then Return SetError(2,0,0) if $i_max<Int($a_section[0][0]) then $i_max=Int($a_section[0][0]) If $i_max > $i_limit-1 then ; if section has more than 100 entrys => resize 3D Array $s_limit=$i_max+1 ReDim $a_return[Int($a_sectionNames[0])][$i_limit][2] endif $a_return[$i-1][0][0]=$a_sectionNames[$i] $a_return[$i-1][0][1]=$a_section[0][0] for $x=1 to $a_section[0][0] $a_return[$i-1][$x][0]=$a_section[$x][0] $a_return[$i-1][$x][1]=$a_section[$x][1] next next Redim $a_return[Int($a_sectionNames[0])][$i_max+1][2] Return $a_return endfunc
-
Gefunden: https://www.autoitscript.com/forum/topic/51…raydisplaytree/
Allerdings muss in der Array.au3 eine Anpassung vorgenommen werden:
wird zu:
edit\ Ich habe mal eine lauffähige Version angehängt und das Beispiel für meine Zwecke erweitert.
So muss die 3D Array Struktur für meine .ini dann aussehen oder?
Zitat#Include "Array.au3"
; Example 2: 3D Array
;1. Dimension => Anzahl der Sektionen
;2. Dimmension => Anzahl der key/value Paare je Sektion
;3. Dimension => immer 2, da nur key/value möglich?
Global $aMain[2][2][2] = [[["1. section - 1. key", "1. section - 1. value"], ["1. section - 2. key", "1. section - 2. value"]], _
[["2. section - 1. key", "2. section - 1. value"], ["2. section - 2. key", "2. section - 2. value"]]]
_ArrayDisplayTree($aMain, "Example 2: 3D Array")
-
Die Struktur scheint für meine Aufgabe gut zu passen, danke.
Gab es hier mal nicht eine UDF, die ein 3D Array als treeview anzeigen konnte? Finde die leider nicht mehr ...
-
Puh 3D Array ... ewig nicht verwendet (weil nie 100% verstanden ), aber wenn das sinnvoll ist werd ich mal die Theorie wiederholen.
-
Hallo zusammen,
ich habe hier ein kleines Problem beim Konzept meines Skriptes.
Der Benutzer kann in einer festgelegten .ini Datei bestimmte Abläufe definieren.
D.h. die .ini sieht ca. so aus, wobei dem Skript weder die Sektionen (Namen und Anzahl) noch der Inhalt der Sektionen vorher bekannt sind (da editierbar durch Benutzer):
Nun bekommt der Benutzer die Namen der Sektionen grafisch zur Auswahl angeboten um die als Key/Value definierten Abläufe in Gang zu bringen.
Ich würde jetzt gern die .ini am Start des Skript in einem Rutsch einlesen und dann je nach Usereingabe gleich die erforderlichen Daten (key/value Paare der gewählten Sektion) als 2D Array vorliegen haben.
Nur wie geht das?
Man könnte für jede Sektion ein eigenes 2D Array erstellen, aber dann hat man im Skript eine dynamische Anzahl an 2D Arrays, da auch die Anzahl der Sektionen im Vorfeld unbekannt ist.
Eigentlich würde ich das gerne vermeiden, da das (zumindest für mich) schwer lesbaren Code ergibt.
Alternativ würde mir noch einfallen die .ini in ein "großes" 2D einzulesen, welches alle Sektionen und die jeweiligen key/value Paare enthält.
Dabei stellt sich für mich dann die Frage: Wie finde ich aufgrund der Benutzerauswahl die passenden Einträge in diesem Array? Über _Arraysearch?
Vielleicht habt ihr ja eine pfiffige Idee? Die Datenstruktur muss auch nicht unbedingt ein Array sein sollte sich eine andere Form als geeigneter herausstellen.
Gruß und danke schonmal
nuts
P.S. Ich benötige kein funktionierendes Skript, sondern eher ein Hinweis wie man sowas sinnvoll im Code organisiert.
-
Hi Oscar,
super Skript.
Du hast nicht zufällig so ein Beispiel mit "echtem Datenbank-Unterbau (SQLite oder sowas) rumliegen?Gruß und vielen Dank fürs Teilen!
nuts
-
Danke das gefällt mir gut, sehr elegant.
-
Das entspricht ca. meiner Lösung um die Items für eine bestimmte Gruppe zu bestimmen.
Funktioniert gut.Wie man am besten alle Gruppen und zugehörige Items eines Listviews auf einen Schlag ermittelt bin ich noch am grübeln. 3D Array ist wohl besser, aber dazu muss ich die Array Tutorials nochmal wiederholen.
-
Danke für deine Mühen.
Irgendwie scheint mir ein 2D Array für ein ganzes Listview mit Gruppen ungeeignet zu sein.
Ein Listview mit mehreren Spalten passt super zum 2D Array, kommen Gruppen hinzu fehlt eine Dimension.P.S. Wenn der Thread auf erledigt steht motiviert es nicht gerade sich den Thread anzuschauen ...
-
Also wirklich zufrieden bin ich mit meiner Lösung noch nicht ... was soll die Eile?
Und die zweite Geschichte mit 2D Array erfordert ein Redim bei jedem verarbeiteten Item?
Da bin ich auch noch etwas am probieren.