1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Symbiose: Array + Structure = StrucList ; Zugriff kpl. assoziativ

    • BugFix
    • 6. Juni 2009 um 18:09

    Das verweist auf die beiden Array-Funktionen, die sind aber sowohl im Post als auch im Download enthalten.

  • Symbiose: Array + Structure = StrucList ; Zugriff kpl. assoziativ

    • BugFix
    • 6. Juni 2009 um 17:33

    Hi,
    ich hatte ja schon mal versucht ein "assoziatives Array" zu erstellen, um jenen die Arbeit zu erleichtern, die mit Indexzugriff so ihre Problemchen haben.
    Ich habe das Konzept jetzt kpl. überarbeitet und durch Symbiose von Array und Struktur einen Speichertyp erstellt, der die Vorteile beider Typen nutzt - die StrukturListe.
    Jedes Element wird über eine Struktur definiert und mit dem ersten Wert der Struktur, dem IndexWert, angesprochen.
    Wobei ich der Einfachheit halber eine Beschränkung auf die Datentypen i=Integerwert, f=Fließkommawert und c=Zeichenfolge vorgenommen habe. Um auch die Zeichenfolge in der Länge variabel zu halten wird beim Erstellen der Struktur die max. Länge festgelegt, oder mit "-1" der Standard ( 128 ) übernommen.
    Da Werte in Strukturen sowohl per 1-basiertem Index als auch per vergebenem Bezeichner angesprochen werden können, ergibt sich nun die Möglichkeit Werte direkt über den Namen zu setzen/zu lesen.

    Im beigefügten Bsp. habe ich alle bisher existierenden Funktionen eingesetzt und kommentiert.
    Eine ausführliche Funktionsbeschreibung findet ihr im jeweiligen Funktionsheader.
    (Um Includes zu vermeiden sind zwei umbenannte Arrayfunktionen mit enthalten.)

    Edit: Noch nen Kopierfehler gefixt.

    Edit 28.02.2010
    - 2 weitere Funktionen zum Schreiben der Liste in Datei und Lesen aus Datei
    - als Standardseparator wird nun mit "Default" das Zeichen von Opt("GUIDataSeparatorChar") verwendet

    Funktionsübersicht StrukturListe

    _StrucList_Create()
    Erzeugt eine Strukturliste mit max. 20 Strukturelementen
    Erstes Element ($s1) MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)!
    ElementSyntax: "typ;Bezeichnung", z.B. "c;Artikelbezeichnung" od. "i;Anzahl" od. "f;Preis"
    Typen: "c" - Zeichenkette; "i" - Integerwert; "f" - Fließkommawert

    _StrucList_AddIndex()
    Fügt der Liste einen neuen Index (wahlweise mit Werten) hinzu

    _StrucList_SetValue()
    Fügt Detailwerte für einen Indexwert hinzu
    Entweder Einzelwerte oder alle Details gemeinsam als Zeichenkette

    _StrucList_GetValue()
    Rückgabe eines oder aller Detailwerte(s) für den angegebenen Indexwert
    Bei Rückgabe aller Werte wahlweise als Array od. Trennzeichen-String

    _StrucList_GetIndices()
    Rückgabe aller Indexwerte der Strukturliste als Trennzeichen-String oder Array

    _StrucList_Delete()

    Löschen eines oder aller Listenelemente

    _StrucList_Count()
    Gibt die Anzahl der Listenelemente zurück

    _StrucList_SearchIndex()
    Ermittelt, ob ein IndexWert in der Liste enthalten ist

    _StrucList_WriteToFile()
    Speichert Struktur und Werte in einer Datei

    _StrucList_CreateFromFile()

    Erstellt eine Strukturliste aus einer mit _StrucList_WriteToFile gespeicherten Liste

    Beispielskript
    [autoit]

    #include <StructureList.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; eine Structure-List erstellen
    ; erstes Element MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)
    ; erster Parameter setzt die max. Länge von Stringelementen, mit "-1" = 128
    Local $strucList = _StrucList_Create(-1, 'c;Artikel', 'i;ArtNr', 'i;Menge', 'f;EKNetto', 'f;VKNetto')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; der List ein Element zufügen
    If _StrucList_AddIndex($strucList, 'Schlagschrauber') Then _
    ConsoleWrite('Schlagschrauber zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; die Werte für das Element einzeln hinzufügen
    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'ArtNr', 102030) Then _
    ConsoleWrite('Schlagschrauber, Detail: ArtNr zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'Menge', 25) Then _
    ConsoleWrite('Schlagschrauber, Detail: Menge zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'EKNetto', 35.05) Then _
    ConsoleWrite('Schlagschrauber, Detail: EKNetto zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'VKNetto', 49.50) Then _
    ConsoleWrite('Schlagschrauber, Detail: VKNetto zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ein weiteres Element zufügen
    If _StrucList_AddIndex($strucList, 'Kettensäge') Then _
    ConsoleWrite('Kettensäge zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ein neues Element inklusive Daten zufügen (z.B. aus Datei ausgelesen)
    Local $ValuesToSet = "Turboflex|107090|41|75.05|95.40"
    If _StrucList_AddIndex($strucList, -1, $ValuesToSet) Then _
    ConsoleWrite('Turboflex hinzugefügt, inklusive aller Details' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; die Werte in einem String übergeben !! Reihenfolge identisch, wie in der Struktur, ohne Indexelement
    $ValuesToSet = "104050|17|188.45|225.30"
    If _StrucList_SetValue($strucList, 'Kettensäge', -1, $ValuesToSet, Default) Then _
    ConsoleWrite('Kettensäge, alle Details hinzugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Werte für ein Element abfragen
    ConsoleWrite('Schlagschrauber, ArtNr: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'ArtNr') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, Menge: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'Menge') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, EKNetto: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'EKNetto') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, VKNetto: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'VKNetto') & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; alle Werte eines Elements gemeinsam zurückgeben

    [/autoit] [autoit][/autoit] [autoit]

    ; - als trennzeichenbasierter String
    ConsoleWrite('Schlagschrauber, Details als String: ' & @CRLF & @TAB & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 0 , Default) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Turboflex, Details als String: ' & @CRLF & @TAB & _
    _StrucList_GetValue($strucList, 'Turboflex', 0, Default) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; - als Array
    Local $aRet = _StrucList_GetValue($strucList, 'Kettensäge', 0, 'A')
    ConsoleWrite('Kettensäge, Details als Array:' & @CRLF)
    For $i = 0 To UBound($aRet) - 1
    ConsoleWrite(@TAB & 'Array[' & $i & ']: ' & $aRet[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Anzahl Elemente ausgeben
    ConsoleWrite('Anzahl Elemente = ' & _
    _StrucList_Count($strucList) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; alle Index-Elemente ausgeben

    [/autoit] [autoit][/autoit] [autoit]

    ; - als trennzeichenbasierter String
    ConsoleWrite('Alle Index-Elemente als String: ' & @CRLF & @TAB & _
    _StrucList_GetIndices($strucList, ';') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; - als Array
    Local $aRet = _StrucList_GetIndices($strucList, 'A')
    ConsoleWrite('Alle Index-Elemente als Array:' & @CRLF)
    For $i = 0 To UBound($aRet) - 1
    ConsoleWrite(@TAB & 'Array[' & $i & ']: ' & $aRet[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ein Element löschen
    ConsoleWrite('Anzahl Elemente vor Löschen: ' & _
    _StrucList_Count($strucList) & @CRLF)
    If _StrucList_Delete($strucList, 'Schlagschrauber') Then
    ConsoleWrite(@TAB & 'Element Schlagschrauber gelöscht' & @CRLF)
    ConsoleWrite('Anzahl Elemente nach Löschen: ' & _
    _StrucList_Count($strucList) & @CRLF & @CRLF)
    Else
    ConsoleWrite(@TAB & 'Löschen fehlgeschlagen.' & @CRLF & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; auf Existenz eines Elements (IndexWert) prüfen
    ConsoleWrite('Element Kettensäge vorhanden?' & @TAB & _
    _StrucList_SearchIndex($strucList, 'Kettensäge') & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; === Liste in Datei speichern
    _StrucList_WriteToFile($strucList, @ScriptDir & '\StrucList.txt')

    [/autoit] [autoit][/autoit] [autoit]

    ; === aus Datei neu laden
    $strucList2 = _StrucList_CreateFromFile(@ScriptDir & '\StrucList.txt')
    ; === Indexwerte der gelesenen Liste
    ConsoleWrite('index values read from file: ' & _StrucList_GetIndices($strucList2, Default) & @CRLF & @CRLF)

    [/autoit]
    Code Funktionen
    [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_Create($charLen, $s1 [, ...$s20])
    ; Description:: Erzeugt eine Strukturliste mit max. 20 Strukturelementen
    ; Erstes Element ($s1) MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)!
    ; ElementSyntax: "typ;Bezeichnung", z.B. "c;Artikelbezeichnung" od. "i;Anzahl" od. "f;Preis"
    ; Typen: "c" - Zeichenkette; "i" - Integerwert; "f" - Fließkommawert
    ; Parameter(s): $charLen - die max. Länge für Elemente vom Typ "c - Zeichenkette", Standard= -1 (128 Zeichen)
    ; $s1 - erstes Strukturelement(Indexelement), MUSS einmalig und eineindeutig sein
    ; optional: $s2...20 - weitere Strukturelemente
    ; Return Value(s): Erfolg - Rückgabe Strukturlist-Variable
    ; Fehler - kein Strukturelement definiert
    ; Author(s): BugFix ([email='bugfi@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_Create($charLen = -1, $s1 = '', $s2 = '', $s3 = '', $s4 = '', $s5 = '', $s6 = '', $s7 = '', $s8 = '', $s9 = '', $s10 = '', _
    $s11 = '', $s12 = '', $s13 = '', $s14 = '', $s15 = '', $s16 = '', $s17 = '', $s18 = '', $s19 = '', $s20 = '')
    If $charLen < 1 Then $charLen = 128
    If $s1 = '' Then Return SetError(1,0,0)
    Local $val, $type, $struc = ''
    For $i = 1 To 20
    $val = Eval('s' & $i)
    If $val = '' Then
    ExitLoop
    Else
    $type = StringLeft($val, 1)
    $val = StringTrimLeft($val, 2)
    EndIf
    Switch $type
    Case 'i'
    $struc &= 'int64 ' & $val & ';'
    Case 'f'
    $struc &= 'double ' & $val & ';'
    Case Else
    $struc &= 'wchar ' & $val & '[' & $charLen & '];'
    EndSwitch
    Next
    Local $aStruc[1][2] = [[StringTrimRight($struc, 1)]]
    Return $aStruc
    EndFunc ;==>_StrucList_Create

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_AddIndex(ByRef $strucList, $IndexValue=-1, $sValues='', $Separator = Default)
    ; Description:: Fügt der Liste einen neuen Index (wahlweise mit Werten) hinzu
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
    ; angesprochen werden
    ; - mit $IndexValue = -1 werden gleich alle Werte eingetragen
    ; optional: $sValues - wenn $IndexValue = -1, Trennzeichenstring mit allen einzutragenden Werten
    ; optional: $Separator - wenn $IndexValue = -1, Trennzeichen für Wert-String
    ; Return Value(s): Erfolg 1
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; @error = 2 - $IndexValue ist bereits vorhanden
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_AddIndex(ByRef $strucList, $IndexValue = -1, $sValues = '', $Separator = Default)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    If $IndexValue <> -1 Then
    _ArraySearch($strucList, $IndexValue, 1)
    If Not @error Then Return SetError(2,0,0)
    ReDim $strucList[UBound($strucList) + 1][2]
    $strucList[UBound($strucList) - 1][0] = $IndexValue
    $strucList[UBound($strucList) - 1][1] = DllStructCreate($strucList[0][0])
    DllStructSetData($strucList[UBound($strucList) - 1][1], 1, $IndexValue)
    Else
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    Local $aSet = StringSplit($sValues, $Separator)
    _ArraySearch($strucList, $aSet[1], 1)
    If Not @error Then Return SetError(2,0,0)
    ReDim $strucList[UBound($strucList) + 1][2]
    $strucList[UBound($strucList) - 1][0] = $aSet[1]
    $strucList[UBound($strucList) - 1][1] = DllStructCreate($strucList[0][0])
    For $i = 1 To UBound($aSet) -1
    DllStructSetData($strucList[UBound($strucList) - 1][1], $i, $aSet[$i])
    Next
    EndIf
    Return 1
    EndFunc ;==>_StrucList_AddIndex

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_SetValue(ByRef $strucList, $IndexValue, $Element, $Value, $Separator = Default)
    ; Description:: Fügt Detailwerte für einen Indexwert hinzu
    ; Entweder Einzelwerte durch Angabe $Element/$Wert oder
    ; alle Details gemeinsam als Zeichenkette durch: $Element=-1 / $Value=Wert-String / Stringseparator
    ; Bei Übergabe aller Detailwerte muß die Reihenfolge identisch zur Struktur sein!
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
    ; angesprochen werden
    ; $Element - Bezeichnung des Elements, dessen Wert gesetzt werden soll (-1 = alle Werte in einem String)
    ; - das Element kann mit Namen oder 1-basiertem Index in der Struktur angesprochen werden
    ; $Value - Wert für $Element (wenn $Element = -1, String mit allen Werten, außer Indexwert)
    ; optional: $Separator - wenn $Element = -1, Trennzeichen für Wert-String
    ; Return Value(s): Erfolg 1
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_SetValue(ByRef $strucList, $IndexValue, $Element, $Value, $Separator = Default)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    Local $index = _ArraySearch($strucList, $IndexValue, 1)
    If @error Then Return SetError(2,0,0) ; IndexWert nicht enthalten
    If $Element <> -1 Then
    DllStructSetData($strucList[$index][1], $Element, $Value)
    Else
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    Local $aSet = StringSplit($Value, $Separator, 2), $iElement = 2
    For $j = 0 To UBound($aSet) - 1
    $tmp = DllStructSetData($strucList[$index][1], $iElement, $aSet[$j])
    $iElement += 1
    Next
    EndIf
    Return 1
    EndFunc ;==>_StrucList_SetValue

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_GetValue(ByRef $strucList, $IndexValue, $Element = 0, $Separator = 'A')
    ; Description:: Rückgabe eines/aller Detailwerte(s) für den angegebenen Indexwert.
    ; Bei Rückgabe aller Werte wahlweise als Array od. Trennzeichen-String.
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
    ; angesprochen werden
    ; $Element - Bezeichnung des Elements, dessen Wert gelesen werden soll (0 = alle Werte in einem String)
    ; - das Element kann mit Namen oder 1-basiertem Index in der Struktur angesprochen werden
    ; optional: $Separator - wenn $Element = 0, Trennzeichen für Wert-String
    ; - mit $Separator = 'A' werden die Werte als Array zurückgegeben
    ; Return Value(s): Erfolg Rückgabe Wert- String/Array
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; @error = 2 - $IndexValue ist nicht vorhanden
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_GetValue(ByRef $strucList, $IndexValue, $Element = 0, $Separator = 'A')
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    Local $index = _ArraySearch($strucList, $IndexValue, 1)
    If @error Then Return SetError(2, 0, 0)
    Local $Out = ''
    If IsString($Element) Or $Element > 0 Then
    $Out = DllStructGetData($strucList[$index][1], $Element)
    Else
    Local $n = 1, $sep = '|', $tmp
    If $Separator <> 'A' Then
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    $sep = $Separator
    EndIf
    While True
    $tmp = DllStructGetData($strucList[$index][1], $n)
    If @error = 2 Then ExitLoop
    $Out &= $tmp & $sep
    $n += 1
    WEnd
    $Out = StringTrimRight($Out, StringLen($sep))
    If $Separator = 'A' Then $Out = StringSplit($Out, '|', 2)
    EndIf
    Return $Out
    EndFunc ;==>_StrucList_GetValue

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_GetIndices(ByRef $strucList, $Separator = 'A')
    ; Description:: Rückgabe aller Indexwerte der Strukturliste als Trennzeichen-String oder Array
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; optional: $Separator - Trennzeichen für Ausgabestring
    ; - mit $Separator = 'A' werden die Werte als Array zurückgegeben
    ; Return Value(s): Erfolg Rückgabe String/Array mit allen Indexwerten
    ; Fehler @error = 1 - $strucList ist keine Strukturvariable
    ; @error = 2 - Strukturliste ist leer
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_GetIndices(ByRef $strucList, $Separator = 'A')
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    If UBound($strucList) = 1 Then Return SetError(2,0,0)
    Local $Out = '', $sep = '|'
    If $Separator <> 'A' Then
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    $sep = $Separator
    EndIf
    For $i = 1 To UBound($strucList) - 1
    $Out &= $strucList[$i][0] & $sep
    Next
    $Out = StringTrimRight($Out, StringLen($sep))
    If $Separator = 'A' Then $Out = StringSplit($Out, '|', 2)
    Return $Out
    EndFunc ;==>_StrucList_GetIndices

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_Delete(ByRef $strucList, $IndexValue = -1)
    ; Description:: Löschen eines/aller Listenelemente
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; optional: $IndexValue - IndexWert, der gelöscht werden soll (-1 löscht alle Elemente)
    ; Return Value(s): Erfolg 1
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; @error = 2 - $IndexValue ist nicht vorhanden
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_Delete(ByRef $strucList, $IndexValue = -1)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    If $IndexValue < -1 Then $IndexValue = -1
    If $IndexValue = -1 Then
    Local $aTmp[1][2] = [[$strucList[0][0]]]
    $strucList = $aTmp
    Return 1
    EndIf
    Local $index = _ArraySearch($strucList, $IndexValue, 1)
    If @error Then Return SetError(2,0,0)
    _ArrayDelete($strucList, $index)
    Return 1
    EndFunc ;==>_StrucList_Delete

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_Count(ByRef $strucList)
    ; Description:: Gibt die Anzahl der Listenelemente zurück
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; Return Value(s): Erfolg Anzahl der Listenelemente
    ; Fehler 0 @error=1 - $strucList ist keine Strukturvariable
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_Count(ByRef $strucList)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    Return UBound($strucList) - 1
    EndFunc ;==>_StrucList_Count

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_SearchIndex(ByRef $strucList, $IndexValue)
    ; Description:: Ermittelt, ob ein IndexWert in der Liste enthalten ist
    ; Parameter(s): $strucList - eine zuvor mit _StrucList_Create() erzeugte Liste
    ; $IndexValue - IndexWert, der gesucht wird
    ; Return Value(s): Erfolg TRUE = gefunden / FALSE = nicht gefunden
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_SearchIndex(ByRef $strucList, $IndexValue)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    _ArraySearch($strucList, $IndexValue, 1)
    If @error Then
    Return False
    Else
    Return True
    EndIf
    EndFunc ;==>_StrucList_SearchIndex

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_WriteToFile(ByRef $strucList, $sFile, $Separator = Default)
    ; Description:: Speichert die Struktur mit Werten in eine Datei
    ; Parameter(s): $strucList - eine mit _StrucList_Create() / _StrucList_CreateFromFile erstellte Liste
    ; $sFile - kpl. Dateipfad
    ; $Separator - mit 'Default' wird das Zeichen von Opt("GUIDataSeparatorChar") verwendet
    ; Return Value(s): Erfolg 1
    ; Fehler 0 @error = 1 - $strucList ist keine Strukturvariable
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_WriteToFile(ByRef $strucList, $sFile, $Separator = Default)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    Local $fh, $sTmp, $j = 1, $sToWrite = $strucList[0][0] & @CRLF
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    For $i = 1 To UBound($strucList) -1
    While True
    $sTmp = DllStructGetData($strucList[$i][1], $j)
    If @error Then ExitLoop
    $sToWrite &= $sTmp & $Separator
    $j += 1
    WEnd
    $j = 1
    $sToWrite = StringTrimRight($sToWrite, StringLen($Separator)) & @CRLF
    Next
    $fh = FileOpen($sFile, 10)
    FileWrite($fh, $sToWrite)
    FileClose($fh)
    EndFunc ;==>_StrucList_WriteToFile

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _StrucList_CreateFromFile($sFile, $Separator = Default)
    ; Description:: Erzeugt eine Strukturliste aus einer Datei
    ; Parameter(s): $sFile - kpl. Dateipfad
    ; $Separator - mit 'Default' wird das Zeichen von Opt("GUIDataSeparatorChar") verwendet
    ; Return Value(s): Erfolg Strukturvariable
    ; Fehler 0 @error = 1 - $sFile existiert nicht
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_CreateFromFile($sFile, $Separator = Default)
    If Not FileExists($sFile) Then Return SetError(1,0,0)
    If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
    Local $aFile, $aTmp
    _FileReadToArray($sFile, $aFile)
    Local $aStruct[$aFile[0]][2]
    $aStruct[0][0] = $aFile[1]
    If $aFile[0] = 1 Then Return $aStruct
    For $i = 2 To $aFile[0]
    $aTmp = StringSplit($aFile[$i], $Separator)
    $aStruct[$i-1][0] = $aTmp[1]
    $aStruct[$i-1][1] = DllStructCreate($aStruct[0][0])
    For $j = 1 To $aTmp[0]
    DllStructSetData($aStruct[$i-1][1], $j-1, $aTmp[$j])
    Next
    Next
    Return $aStruct
    EndFunc ;==>_StrucList_CreateFromFile

    [/autoit]

    Probiert mal und gebt Feedback, falls ihr Veränderungen/Erweiterungen dazu wünscht.

    Dateien

    Bsp_StructureList.au3 4,54 kB – 404 Downloads StructureList.au3 21,54 kB – 472 Downloads
  • dllcall / ???

    • BugFix
    • 5. Juni 2009 um 10:05

    Du mußt einen Buffer als Array Integer vorbereiten und auf diesen mit einem Pointer verweisen.
    Probier mal so:

    [autoit]

    $Buffer = DllStructCreate('int[8]')
    DllCall("C:\WINDOWS\system32\K8047D.dll", "char", "ReadData", "ptr", DllStructGetPtr($Buffer))
    For $i = 0 To 7
    ConsoleWrite(DllStructGetData($Buffer, 1, $i) & @CRLF)
    Next

    [/autoit]

    NB: Bist du dir beim Rückgabetyp des DllCalls sicher? "char" halte ich für wenig wahrscheinlich, "int" oder "long" wird wohl richtig sein. Wenn du eine Beschreibung zur Dll hast, schau mal nach.

  • Wie erstelle ich richtig UDFs?

    • BugFix
    • 4. Juni 2009 um 18:19

    Die Behandlung der optionalen Parameter (sofern vorhanden) sollte geregelt sein.
    Also überprüfen, ob der Wert in einem erwarteten Bereich liegt - wenn nicht mit Fehler beenden oder auf einen Standardwert setzen.
    Die Fehlerbehandlung nimmt i.A. einen wesentlichen Teil der Funktion ein. Es müssen alle falschen Werte abgefangen werden.
    Wenn irgend möglich, sollte vermieden werden, innerhalb der Funktion auf andere Funktionen zuzugreifen, die ein Include erfordern. Ggf. selbst 'nachbauen'.

  • Proxys und damit Zusammenhängendes ^^

    • BugFix
    • 3. Juni 2009 um 23:57

    Genug jetzt. Um es mal mit Altkanzler Schröder zu sagen: Klarer Verstoß gegen die Forenregeln und Basta!
    [Thread Closed]

  • Router prob

    • BugFix
    • 1. Juni 2009 um 16:25

    Ich sehe nur einen Grund, warum man ständig eine neue IP benötigt:
    Aktivitäten, wie Flooding etc. die zu einem Bann der IP führen.
    Sag, falls ich falsch liege, aber m.E. hast du nichts koscheres im Sinn. Falls du keine sinnvolle Erklärung für dein Ansinnen vorbringst, werde ich den Thread schließen.

  • WinGetText in Cmd.exe

    • BugFix
    • 1. Juni 2009 um 14:30

    Im Hilfe-Beispiel steht dir foo.bar, das mußt du natürlich mit deinem Aufruf ersetzen.
    Und ich vermute, du hast noch nicht verstanden, was mit der Codezeile

    [autoit]

    Run(@ComSpec & " /c BEFEHL", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]

    bewirkt wird - Du bist dann bereits in der Kommandozeile, ein Aufruf der cmd.exe ist also Quatsch.
    Ebenso das WinWait - total überflüssig.
    Und Befehle werden nicht mit Send an das cmd-Fenster übertragen, sondern mit StdinWrite.

    Nutze doch erstmal das Hilfebsp., damit du verstehst, was passiert. Dann kannst du Parameter verändern, nach deinem Geschmack.

  • WinGetText in Cmd.exe

    • BugFix
    • 1. Juni 2009 um 11:42

    Ich sehe keinen Befehl für die Commandexe. Und halte dich bitte an die Syntax aus dem Hilfebsp.

    [autoit]

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]
  • Ordner Read

    • BugFix
    • 1. Juni 2009 um 11:25

    Habe es gefunden,
    du hast zwar den ItemIndex ausgelesen, aber keiner weiterverarbeitenden Variablen zugewiesen.

    [autoit]

    Func _SHLV_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hListView1 = $SHELLLISTVIEWHANDLE

    [/autoit][autoit][/autoit][autoit]

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hListView1
    Local $nIndex = -2
    Switch $iCode
    Case $NM_RETURN
    ConsoleWrite("jkjkjkjkjl hj lu" & @CRLF)
    $nIndex = _GUICtrlListView_GetSelectedIndices($hListView1,True)
    If IsArray($nIndex) And $nIndex[0]=1 Then
    $nIndex = $nIndex[1]
    ContinueCase
    EndIf
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    If $nIndex = -2 Then
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $nIndex = DllStructGetData($tInfo, "Index") ; "$nIndex =" fehlte ! ####################
    EndIf

    [/autoit]
  • WinGetText in Cmd.exe

    • BugFix
    • 1. Juni 2009 um 10:34

    Schau dir mal in der Hilfe: StdoutRead an.

  • Hilfe für HastyNotes

    • BugFix
    • 1. Juni 2009 um 10:28

    Gib mal einen Link mit Erklärungen zum Preview-Objekt an, dann kann man weitersehen.
    Ich hab mal kurz gegoogelt, finde aber keine Verweise auf dieses Objekt.

  • LayerAds-Adresse

    • BugFix
    • 31. Mai 2009 um 20:34
    Zitat von Dankeschön

    .... Wie mache ich daraus denn eine normale Website ?

    Zitat von Dankeschön

    Da mir, wie anscheinend immer, niemand antworten will,


    Vielleicht solltest du Fragen zu AutoIt stellen, damit steigt die Wahrscheinlichkeit Antworten zu bekommen, in einem AutoIt-Forum enorm. :P

  • Skriptbsp.: Diagramm in Excel

    • BugFix
    • 31. Mai 2009 um 15:45

    Hi,
    habe mal ein Muster erstellt zur Diagrammerstellung in Excel per AutoIt.
    Es ist durchkommentiert.
    Die Konstanten für weitere Diagrammtypen findet man in Excel ==> Extra ==> Makro ==> Visual Basic-Editor, dort im Objektkatalog.
    Im Suchfenster "XlChartType" eingeben, dann werden alle Konstanten aufgelistet.

    Spoiler anzeigen
    [autoit]

    Const $xlColumns = 2
    Const $xl3DPieExploded = 70
    Const $xlDataLabelsShowValue = 2

    [/autoit] [autoit][/autoit] [autoit]

    Local $oExcel = ObjCreate("Excel.Application") ; Excel-Objekt erstellen
    $oExcel.Visible = 1
    $oExcel.SheetsInNewWorkbook = 1 ; Anzahl der gewünschten Sheets beim Erstellen festlegen
    Local $oBook = $oExcel.Workbooks.Add ; im Excel-Objekt ein Workbook-Objekt erstellen
    Local $oSheet = $oBook.Sheets(1) ; Sheet-Objekt für Sheet 1 erstellen (Name oder Index)
    $oSheet.Name = 'Mein Sheet' ; Eigenschft Name ändern

    [/autoit] [autoit][/autoit] [autoit]

    ; oder vorhandene Datei öffnen:
    ;~ Local $oBook = $oExcel.WorkBooks.Open($sFilePath, Default, False)
    ;~ Local $oSheet = $oBook.Worksheets.Item(1) ; Index od. Name des Sheets

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten in neuem Sheet eintragen

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Range-Offset-Adressierung ermöglicht einfaches Navigieren mit Schleifen

    [/autoit] [autoit][/autoit] [autoit]

    ; Syntax: NewRange = Objekt.Range("StartZelle").Offset(ZeilenOffset, SpaltenOffset)
    ; Offset=0 ist die betreffende Zeile/Spalte selbst, die Adressierung ist relativ zur StartZelle
    ; negative Werte betreffen also Zeilen/Spalten oberhalb/vor der StartZelle

    [/autoit] [autoit][/autoit] [autoit]

    ; Spaltenbeschriftung B1:H1
    For $i = 0 To 7
    If $i = 7 Then
    $oSheet.Range("B1").Offset(0, $i).Value = 'SUMME'
    Else
    $oSheet.Range("B1").Offset(0, $i).Value = 'HEADER ' & $i+1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeilenbeschriftung A2:A10
    For $i = 0 To 8
    $oSheet.Range("A2").Offset($i, 0).Value = 'NAME ' & $i+1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Werte eintragen B2:H10
    For $i = 0 To 8
    For $j = 0 To 6
    $oSheet.Range("B2").Offset($i, $j).Value = Random(8,30,1)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Formeln Summen Zeilen und Summe gesamt
    Local $r = 2
    For $i = 0 To 9
    If $i = 9 Then
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(I2:I10)"
    Else
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(B"&$r&":H"&$r&")"
    $r += 1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Diagramm im $oSheet erstellen
    ; Um die Positionierung des Diagramms an einer Zelle auszurichten, kann man die Werte vorab abfragen
    ; und das Diagramm gleich mit diesen Parametern erstellen, oder anschließend verschieben

    [/autoit] [autoit][/autoit] [autoit]

    Local $width = 300, $height = 200

    [/autoit] [autoit][/autoit] [autoit]

    ; Ausrichtung linksbündig an Zelle B13:
    ;~ Local $left = $oSheet.Range("B13").Left
    ;~ Local $top = $oSheet.Range("B13").Top

    [/autoit] [autoit][/autoit] [autoit]

    ; Ausrichtung rechtsbündig an Zelle I13:
    Local $left = $oSheet.Range("J13").Left - $width ; Zelle J13: left = Zelle I13: right !
    Local $top = $oSheet.Range("I13").Top

    [/autoit] [autoit][/autoit] [autoit]

    ; Objekt Diagramm erstellen
    Local $oChart = $oSheet.ChartObjects.Add($left, $top, $width, $height).Chart

    [/autoit] [autoit][/autoit] [autoit]

    With $oChart
    .ChartType = $xl3DPieExploded ; Diagrammtyp festlegen
    .SetSourceData($oSheet.Range("I2:I10"), $xlColumns) ; Datenbereich für Diagramm
    .SeriesCollection(1).XValues = "='Mein Sheet'!Z2S1:Z10S1" ; Beschriftung Legende setzen (Namen aus A2:A10)
    .HasTitle = True ; Titel aktivieren
    .ChartTitle.Characters.Text = "Einzelsummen / Name (Gesamt = " & $oSheet.Range('I11').Value & ")" ; Titel
    .ApplyDataLabels($xlDataLabelsShowValue, False, True) ; Segmente Beschriften mit Werten
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    ; Diagramm (Zeichnungsfläche=Shape) ausrichten, wenn nicht vorab positioniert
    ;~ With $oSheet
    ;~ .Shapes(1).Top = $oSheet.Range("B13").Top ; Ausrichtung Top an Zelle B13.top
    ;~ .Shapes(1).Left = $oSheet.Range("B13").Left ; Ausrichtung Left an Zelle B13.left
    ;~ .Select
    ;~ EndWith

    [/autoit]
  • ExcelMore.au3

    • BugFix
    • 29. Mai 2009 um 00:29

    Modifizierte Version für _ExcelBookNew() hinzugefügt.

  • Hallo an alle bin Trader und brauche hilfe

    • BugFix
    • 27. Mai 2009 um 08:31
    Zitat von systemtrader

    3, Aufgund der Indikatoenberechnung, die RBS Marketindex
    Handelsplattform
    Ferngesteuert bedinnen um zu kaufen und zu verkaufen, also per
    Maus simulation.


    Dann schau mal auf die Handelsplattform. Wenn du dafür einen Zugang hast, hast du auch in AGB's eingewilligt. Mach diese mal zugänglich.
    Ich kann mich irren - aber nach meinen Erfahrungen im Deutschen Recht scheint es mir sehr unwahrscheinlich, dass ein automatischer Handel überhaupt zulässig ist.

  • Warum funktioniert das nicht ? / Fenster verstecken

    • BugFix
    • 26. Mai 2009 um 23:33
    Zitat von keksi

    Nein ich möcht nur paar Leute auf der LAN damit ärgern. *gg


    Forumregeln beachten! :cursing:

    Zitat von Auszug Forenregeln

    Folgende Inhalte sind nicht erwünscht oder gar komplett verboten......
    - Programme, die anderen, auch Freunden, einen Schreck einjagen sollen oder sich sonst über andere Nutzer lustig machen ("Spaßviren")

  • DockIt

    • BugFix
    • 26. Mai 2009 um 22:55

    Hi,
    habe mal noch ein Bsp. für Docking an den Desktoprand hinzugefügt. s. Post 1

  • Fenster: Rahmen berechnen

    • BugFix
    • 26. Mai 2009 um 17:58

    Deine Rechnung ist nicht komplett ;)
    So stimmt es:

    [autoit]

    MsgBox(0, "", $a[29] - ($a[6] + $a[16]) )

    [/autoit]
  • Andockbare GUI

    • BugFix
    • 26. Mai 2009 um 17:35

    Hier mal eine Komplettlösung:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $CatchWidth = 70 ; Pixelbereich indem das Fenster gefangen wird
    Global $BorderDiff = 5 ; Pixelabstand zum Rand

    [/autoit] [autoit][/autoit] [autoit]

    Global $gui = GUICreate("Dock on Border", 300, 300)
    GUISetState(@SW_SHOW, $gui)

    [/autoit] [autoit][/autoit] [autoit]

    ; WM_MOVE registrieren:
    GUIRegisterMsg($WM_MOVE, "WM_MOVE")

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOVE($hWndGUI)
    If Not(WinGetHandle($gui) = $hWndGUI) Then Return $GUI_RUNDEFMSG
    Local $aPos = WinGetPos($gui)
    Local $Catch_Left = $CatchWidth, $Catch_Right = @DesktopWidth - $CatchWidth
    Local $Catch_Top = $CatchWidth, $Catch_Bottom = @DesktopHeight - $CatchWidth
    Select
    Case $aPos[0] <= $Catch_Left
    If $aPos[1] <= $Catch_Top Then
    WinMove($gui, '', $BorderDiff, $BorderDiff)
    ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
    WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', $BorderDiff, $aPos[1])
    EndIf
    Case $aPos[0] + $aPos[2] >= $Catch_Right
    If $aPos[1] <= $Catch_Top Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
    ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $aPos[1])
    EndIf
    Case $aPos[1] <= $Catch_Top
    If $aPos[0] <= $Catch_Left Then
    WinMove($gui, '', $BorderDiff, $BorderDiff)
    ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
    Else
    WinMove($gui, '', $aPos[0], $BorderDiff)
    EndIf
    Case $aPos[1] + $aPos[3] >= $Catch_Bottom
    If $aPos[0] <= $Catch_Left Then
    WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
    ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
    WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
    Else
    WinMove($gui, '', $aPos[0], @DesktopHeight - $BorderDiff - $aPos[3])
    EndIf
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_MOVE

    [/autoit]

    Edit: Hatte nen kleine Bug bei Top drin - gefixt.

  • Andockbare GUI

    • BugFix
    • 26. Mai 2009 um 17:00

    Hab ich verstanden und dieses Skript zeigt doch den Weg. Nur dass du als Andockkriterium die Desktopränder benötigst.
    Versuch mal dein Glück und melde dich, wenn es nicht swird.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™