Das verweist auf die beiden Array-Funktionen, die sind aber sowohl im Post als auch im Download enthalten.
Beiträge von BugFix
-
-
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") verwendetFunktionsü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 ListeBeispielskript
[autoit]#include <StructureList.au3>
[/autoit] [autoit][/autoit] [autoit]; eine Structure-List erstellen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; 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'); der List ein Element zufügen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If _StrucList_AddIndex($strucList, 'Schlagschrauber') Then _
ConsoleWrite('Schlagschrauber zugefügt' & @CRLF & @CRLF); die Werte für das Element einzeln hinzufügen
[/autoit] [autoit][/autoit] [autoit]
If _StrucList_SetValue($strucList, 'Schlagschrauber', 'ArtNr', 102030) Then _
ConsoleWrite('Schlagschrauber, Detail: ArtNr zugefügt' & @CRLF)If _StrucList_SetValue($strucList, 'Schlagschrauber', 'Menge', 25) Then _
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Schlagschrauber, Detail: Menge zugefügt' & @CRLF)If _StrucList_SetValue($strucList, 'Schlagschrauber', 'EKNetto', 35.05) Then _
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Schlagschrauber, Detail: EKNetto zugefügt' & @CRLF)If _StrucList_SetValue($strucList, 'Schlagschrauber', 'VKNetto', 49.50) Then _
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Schlagschrauber, Detail: VKNetto zugefügt' & @CRLF & @CRLF); ein weiteres Element zufügen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If _StrucList_AddIndex($strucList, 'Kettensäge') Then _
ConsoleWrite('Kettensäge zugefügt' & @CRLF & @CRLF); ein neues Element inklusive Daten zufügen (z.B. aus Datei ausgelesen)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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); die Werte in einem String übergeben !! Reihenfolge identisch, wie in der Struktur, ohne Indexelement
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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); Werte für ein Element abfragen
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Schlagschrauber, ArtNr: ' & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 'ArtNr') & @CRLF)ConsoleWrite('Schlagschrauber, Menge: ' & _
[/autoit] [autoit][/autoit] [autoit]
_StrucList_GetValue($strucList, 'Schlagschrauber', 'Menge') & @CRLF)ConsoleWrite('Schlagschrauber, EKNetto: ' & _
[/autoit] [autoit][/autoit] [autoit]
_StrucList_GetValue($strucList, 'Schlagschrauber', 'EKNetto') & @CRLF)ConsoleWrite('Schlagschrauber, VKNetto: ' & _
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_StrucList_GetValue($strucList, 'Schlagschrauber', 'VKNetto') & @CRLF & @CRLF); alle Werte eines Elements gemeinsam zurückgeben
[/autoit] [autoit][/autoit] [autoit]; - als trennzeichenbasierter String
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Schlagschrauber, Details als String: ' & @CRLF & @TAB & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 0 , Default) & @CRLF & @CRLF)ConsoleWrite('Turboflex, Details als String: ' & @CRLF & @TAB & _
[/autoit] [autoit][/autoit] [autoit]
_StrucList_GetValue($strucList, 'Turboflex', 0, Default) & @CRLF & @CRLF); - als Array
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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); Anzahl Elemente ausgeben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Anzahl Elemente = ' & _
_StrucList_Count($strucList) & @CRLF & @CRLF); alle Index-Elemente ausgeben
[/autoit] [autoit][/autoit] [autoit]; - als trennzeichenbasierter String
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Alle Index-Elemente als String: ' & @CRLF & @TAB & _
_StrucList_GetIndices($strucList, ';') & @CRLF); - als Array
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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); ein Element löschen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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; auf Existenz eines Elements (IndexWert) prüfen
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Element Kettensäge vorhanden?' & @TAB & _
_StrucList_SearchIndex($strucList, 'Kettensäge') & @CRLF & @CRLF); === Liste in Datei speichern
[/autoit] [autoit][/autoit] [autoit]
_StrucList_WriteToFile($strucList, @ScriptDir & '\StrucList.txt'); === aus Datei neu laden
[/autoit]
$strucList2 = _StrucList_CreateFromFile(@ScriptDir & '\StrucList.txt')
; === Indexwerte der gelesenen Liste
ConsoleWrite('index values read from file: ' & _StrucList_GetIndices($strucList2, Default) & @CRLF & @CRLF)Code Funktionen
[autoit];==================================================================================================
[/autoit] [autoit][/autoit] [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][/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]
; 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]
; 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_CreateFromFileProbiert mal und gebt Feedback, falls ihr Veränderungen/Erweiterungen dazu wünscht.
-
Du mußt einen Buffer als Array Integer vorbereiten und auf diesen mit einem Pointer verweisen.
[autoit]
Probier mal so:$Buffer = DllStructCreate('int[8]')
[/autoit]
DllCall("C:\WINDOWS\system32\K8047D.dll", "char", "ReadData", "ptr", DllStructGetPtr($Buffer))
For $i = 0 To 7
ConsoleWrite(DllStructGetData($Buffer, 1, $i) & @CRLF)
NextNB: 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.
-
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'. -
Genug jetzt. Um es mal mit Altkanzler Schröder zu sagen: Klarer Verstoß gegen die Forenregeln und Basta!
[Thread Closed] -
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. -
Im Hilfe-Beispiel steht dir foo.bar, das mußt du natürlich mit deinem Aufruf ersetzen.
[autoit]
Und ich vermute, du hast noch nicht verstanden, was mit der CodezeileRun(@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.
-
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] -
Habe es gefunden,
[autoit]
du hast zwar den ItemIndex ausgelesen, aber keiner weiterverarbeitenden Variablen zugewiesen.Func _SHLV_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit][autoit][/autoit][autoit]
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $hListView1 = $SHELLLISTVIEWHANDLE$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit]
$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 -
Schau dir mal in der Hilfe: StdoutRead an.
-
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. -
.... Wie mache ich daraus denn eine normale Website ?
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.
-
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
[/autoit] [autoit][/autoit] [autoit]
Const $xl3DPieExploded = 70
Const $xlDataLabelsShowValue = 2Local $oExcel = ObjCreate("Excel.Application") ; Excel-Objekt erstellen
[/autoit] [autoit][/autoit] [autoit]
$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; oder vorhandene Datei öffnen:
[/autoit] [autoit][/autoit] [autoit]
;~ Local $oBook = $oExcel.WorkBooks.Open($sFilePath, Default, False)
;~ Local $oSheet = $oBook.Worksheets.Item(1) ; Index od. Name des Sheets; 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)
[/autoit] [autoit][/autoit] [autoit]
; Offset=0 ist die betreffende Zeile/Spalte selbst, die Adressierung ist relativ zur StartZelle
; negative Werte betreffen also Zeilen/Spalten oberhalb/vor der StartZelle; Spaltenbeschriftung B1:H1
[/autoit] [autoit][/autoit] [autoit]
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; Zeilenbeschriftung A2:A10
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To 8
$oSheet.Range("A2").Offset($i, 0).Value = 'NAME ' & $i+1
Next; Werte eintragen B2:H10
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To 8
For $j = 0 To 6
$oSheet.Range("B2").Offset($i, $j).Value = Random(8,30,1)
Next
Next; Formeln Summen Zeilen und Summe gesamt
[/autoit] [autoit][/autoit] [autoit]
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; Diagramm im $oSheet erstellen
[/autoit] [autoit][/autoit] [autoit]
; 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 verschiebenLocal $width = 300, $height = 200
[/autoit] [autoit][/autoit] [autoit]; Ausrichtung linksbündig an Zelle B13:
[/autoit] [autoit][/autoit] [autoit]
;~ Local $left = $oSheet.Range("B13").Left
;~ Local $top = $oSheet.Range("B13").Top; Ausrichtung rechtsbündig an Zelle I13:
[/autoit] [autoit][/autoit] [autoit]
Local $left = $oSheet.Range("J13").Left - $width ; Zelle J13: left = Zelle I13: right !
Local $top = $oSheet.Range("I13").Top; Objekt Diagramm erstellen
[/autoit] [autoit][/autoit] [autoit]
Local $oChart = $oSheet.ChartObjects.Add($left, $top, $width, $height).ChartWith $oChart
[/autoit] [autoit][/autoit] [autoit]
.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; Diagramm (Zeichnungsfläche=Shape) ausrichten, wenn nicht vorab positioniert
[/autoit]
;~ 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 -
Modifizierte Version für _ExcelBookNew() hinzugefügt.
-
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. -
Nein ich möcht nur paar Leute auf der LAN damit ärgern. *gg
Zitat von Auszug ForenregelnFolgende 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") -
Hi,
habe mal noch ein Bsp. für Docking an den Desktoprand hinzugefügt. s. Post 1 -
Deine Rechnung ist nicht komplett
[autoit]
So stimmt es:MsgBox(0, "", $a[29] - ($a[6] + $a[16]) )
[/autoit] -
Hier mal eine Komplettlösung:
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Global $CatchWidth = 70 ; Pixelbereich indem das Fenster gefangen wird
[/autoit] [autoit][/autoit] [autoit]
Global $BorderDiff = 5 ; Pixelabstand zum RandGlobal $gui = GUICreate("Dock on Border", 300, 300)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $gui); WM_MOVE registrieren:
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_MOVE, "WM_MOVE")While True
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEndFunc WM_MOVE($hWndGUI)
[/autoit]
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_MOVEEdit: Hatte nen kleine Bug bei Top drin - gefixt.
-
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.