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

  • CSV_Objekt - UDF

    • BugFix
    • 30. Dezember 2014 um 00:14

    Ich habe mich mal ein wenig mit dem AutoItObject beschäftigt und damit eine objektbasierte CSV-UDF erstellt.
    Aus den Funktionsbeschreibungen und dem Bsp. sind alle Hinweise zur Anwendung ersichtlich.

    CSV_Object.au3
    [autoit]

    ;-- TIME_STAMP 2014-12-29 23:20:03 v 0.1

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

    ; Requires the AutoItObject-UDF: http://www.autoitscript.com/forum/topic/11…df/#entry775262

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

    ; #CURRENT# ========================================================================================
    ; FUNCTION REGISTERED METHODE SHORT DESCRIPTION
    ; _CSVObject Creates an object from an csv file.
    ; _CSVObject_FirstLine .First Points to the first data line.
    ; _CSVObject_NextLine .Next Points to the next data line.
    ; _CSVObject_PrevLine .Previous Points to the previous data line.
    ; _CSVObject_LastLine .Last Points to the last data line.
    ; _CSVObject_SetField .SetField Sets value of one field in current data line.
    ; _CSVObject_GetDS .GetDS Gets all values from the current data line.
    ; _CSVObject_SetDS .SetDS Sets all values in the current data line.
    ; _CSVObject_FieldList .FieldList Returns a list of all field names.
    ; _CSVObject_PropertySet .PropertySet Sets one field in current data line (to use in loops).
    ; _CSVObject_FieldNamesSet .FieldNamesSet Sets new field names.
    ; _CSVObject_WriteToFile .WriteToFile Writes from object back to csv-file.
    ; ==================================================================================================

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

    #include-once
    #include "AutoitObject.au3"
    #include <Array.au3>
    #include <File.au3>

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

    Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
    OnAutoItExitRegister ("_OnExit")

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

    _AutoItObject_StartUp()

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

    ;===================================================================================================
    ; Function Name....: _CSVObject
    ; Description......: Creates an object of a specified csv file.
    ; Parameters ......: $sFile Path to the csv file.
    ; ......optional...: $sFieldLine A string with field names. Default '' = 1st line includes the field names.
    ; .................: With 'num' will enumerated the fields, starting by 1.
    ; ......optional...: $sSeparator The field separator. Default is ';'.
    ; Return Value(s)..: Success The csv file object
    ; .................: Failure @error = 1 $sFile not exists.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject($sFile, $sFieldLine='', $sSeparator=';')
    If Not FileExists($sFile) Then Return SetError(1,0,0)
    Local $aLines
    _FileReadToArray($sFile, $aLines)
    If $sFieldLine <> '' Then
    _ArrayInsert($aLines, 1, $sFieldLine)
    $aLines[0] += 1
    EndIf
    Local $sSplit = ($sFieldLine = 'num' Or $sFieldLine = '') ? $aLines[1] : $sFieldLine
    Local $aFields = StringSplit($sSplit, $sSeparator)
    Local $aTmp[$aFields[0]+1] = [$aFields[0]] ; Array zum Speichern der Feldnamen
    Local $iMin = ($sFieldLine = 'num') ? 1 : 2

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

    Local $self = _AutoItObject_Create()
    _AutoItObject_AddMethod($self, "First", "_CSVObject_FirstLine") ; gehe zum: ersten DS
    _AutoItObject_AddMethod($self, "Next", "_CSVObject_NextLine") ; gehe zum: nächsten DS
    _AutoItObject_AddMethod($self, "Previous", "_CSVObject_PrevLine") ; gehe zum: vorigen DS
    _AutoItObject_AddMethod($self, "Last", "_CSVObject_LastLine") ; gehe zum: letzten DS
    _AutoItObject_AddMethod($self, "SetField", "_CSVObject_SetField") ; Ändert Wert eines Feldes im aktuellen DS
    _AutoItObject_AddMethod($self, "GetDS", "_CSVObject_GetDS") ; Gibt den aktuellen DS als 1D-WerteArray (Standard) od. 2D-Array ([Feldname,Wert]) zurück
    _AutoItObject_AddMethod($self, "SetDS", "_CSVObject_SetDS") ; setzt den gesamten DS neu, alle Werte werden in einem Separator-getrennten String übergeben
    _AutoItObject_AddMethod($self, "FieldList", "_CSVObject_FieldList") ; Gibt ein Array mit den Feldnamen zurück
    _AutoItObject_AddMethod($self, "PropertySet", "_CSVObject_PropertySet") ; zum dynamischen Neubefüllen der Properties
    _AutoItObject_AddMethod($self, "FieldNamesSet", "_CSVObject_FieldNamesSet") ; Feldnamen ändern oder erstmalig setzen
    _AutoItObject_AddMethod($self, "WriteToFile", "_CSVObject_WriteToFile") ; schreibt den Inhalt des Objektes in eine Datei
    _AutoItObject_AddMethod($self, "ShowDS", "__ShowDS") ; [intern] Aktualisiert Feldinhalte für den aktuellen DS im Objekt
    _AutoItObject_AddMethod($self, "Line2Array", "__LineToArray") ; [intern] Hilfsfunktion
    _AutoItObject_AddMethod($self, "Array2Line", "__ArrayToLine") ; [intern] Hilfsfunktion
    _AutoItObject_AddMethod($self, "FieldIndex", "__FieldIndex") ; [intern] Hilfsfunktion
    _AutoItObject_AddProperty($self, "FilePath", $ELSCOPE_PUBLIC, $sFile) ; Dateipfad von dem eingelesen wurde
    _AutoItObject_AddProperty($self, "ArrayLines", $ELSCOPE_PUBLIC, $aLines) ; Array mit allen Zeilen der Datei
    _AutoItObject_AddProperty($self, "Separator", $ELSCOPE_PUBLIC, $sSeparator) ; der verwendete Separator, Standard ist ';'
    _AutoItObject_AddProperty($self, "CurrentIndex", $ELSCOPE_PUBLIC, $iMin) ; Index des aktuellen DS (an Index '0' steht Anzahl)
    _AutoItObject_AddProperty($self, "MinIndex", $ELSCOPE_PRIVATE, $iMin) ; Index des ersten DS der Datei ('1' wenn kein Feldnamen-DS, sonst '2')
    _AutoItObject_AddProperty($self, "MaxIndex", $ELSCOPE_PRIVATE, $aLines[0]) ; Index des letzten DS der Datei
    _AutoItObject_AddProperty($self, "HasFieldNames", $ELSCOPE_PRIVATE, $iMin-1) ; '0' wenn keine Feldnamen vorhanden, sonst '1'
    ; Array der verwendeten Feldnamen als Property erstellen
    Local $aFirstDataLine = StringSplit($aLines[$iMin], $sSeparator)
    For $i = 1 To $aFields[0]
    If $sFieldLine = 'num' Then
    _AutoItObject_AddProperty($self, String($i), $ELSCOPE_PUBLIC, $aFirstDataLine[$i])
    $aTmp[$i] = String($i) ; Feldnummer als Feldname eintragen
    Else
    _AutoItObject_AddProperty($self, $aFields[$i], $ELSCOPE_PUBLIC, $aFirstDataLine[$i])
    $aTmp[$i] = $aFields[$i]
    EndIf
    Next
    _AutoItObject_AddProperty($self, "ArrayFields", $ELSCOPE_PRIVATE, $aTmp)

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

    Return $self
    EndFunc ;==>_CSVObject

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_FirstLine
    ; Description......: Sets pointer to first data line. Sets current values to all fields.
    ; Parameter(s).....: $self The csv object.
    ; Return Value(s)..: -1 If current line is already the first, otherwise the current index.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_FirstLine($self)
    With $self
    Local $iCurrent = .CurrentIndex
    Local $iFirst = .MinIndex
    If $iFirst = $iCurrent Then Return -1
    .CurrentIndex = $iFirst
    EndWith
    $self.ShowDS($self.ArrayLines[$self.CurrentIndex])
    Return $self.CurrentIndex
    EndFunc ;==>_CSVObject_FirstLine

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_NextLine
    ; Description......: Sets pointer to next data line. Sets current values to all fields.
    ; Parameter(s).....: $self The csv object.
    ; Return Value(s)..: -1 If current line is already the last, otherwise the current index.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_NextLine($self)
    With $self
    Local $iCurrent = .CurrentIndex
    Local $iLast = .MaxIndex
    If $iLast = $iCurrent Then Return -1
    .CurrentIndex = $iCurrent +1
    EndWith
    $self.ShowDS($self.ArrayLines[$self.CurrentIndex])
    Return $self.CurrentIndex
    EndFunc ;==>_CSVObject_NextLine

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_PrevLine
    ; Description......: Sets pointer to previous data line. Sets current values to all fields.
    ; Parameter(s).....: $self The csv object.
    ; Return Value(s)..: -1 If current line is already the first, otherwise the current index.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_PrevLine($self)
    With $self
    Local $iCurrent = .CurrentIndex
    Local $iFirst = .MinIndex
    If $iFirst = $iCurrent Then Return -1
    .CurrentIndex = $iCurrent -1
    EndWith
    $self.ShowDS($self.ArrayLines[$self.CurrentIndex])
    Return $self.CurrentIndex
    EndFunc ;==>_CSVObject_PrevLine

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_LastLine
    ; Description......: Sets pointer to last data line. Sets current values to all fields.
    ; Parameter(s).....: $self The csv object.
    ; Return Value(s)..: -1 If current line is already the last, otherwise the current index.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_LastLine($self)
    With $self
    Local $iCurrent = .CurrentIndex
    Local $iLast = .MaxIndex
    If $iLast = $iCurrent Then Return -1
    .CurrentIndex = $iLast
    EndWith
    $self.ShowDS($self.ArrayLines[$self.CurrentIndex])
    Return $self.CurrentIndex
    EndFunc ;==>_CSVObject_LastLine

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_SetField
    ; Description......: Sets the value of one field in the current data set.
    ; Parameter(s).....: $self The csv object.
    ; .................: $sField The field name.
    ; .................: $value The new value.
    ; Return Value(s)..: Success 1
    ; .................: Failure @error - $sField not exists
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_SetField($self, $sField, $value)
    Local $aLines = $self.ArrayLines
    Local $aLine = $self.Line2Array($aLines[$self.CurrentIndex])
    Local $index = $self.FieldIndex($sField)
    If @error Then Return SetError(@error,0,0)
    $aLine[$index] = $value
    $aLines[$self.CurrentIndex] = $self.Array2Line($aLine)
    $self.ArrayLines = $aLines
    Return 1
    EndFunc ;==>_CSVObject_SetField

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_GetDS
    ; Description......: Returns the current data set as 1D array of values or 2D array with [field name, value].
    ; Parameter(s).....: $self The csv object.
    ; .................: $ret2D Default '0' - Array of values, '1' - [field name, value]
    ; Return Value(s)..: Array with data
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_GetDS($self, $ret2D=0)
    Local $aLines = $self.ArrayLines
    Local $aLine = StringSplit($aLines[$self.CurrentIndex], $self.Separator)
    Local $aFields = $self.ArrayFields
    Local $aOut[$aFields[0]+1] = [$aFields[0]]
    If $ret2D = 1 Then
    ReDim $aOut[$aFields[0]+1][2]
    $aOut[0][0] = $aFields[0]
    EndIf
    For $i = 1 To $aFields[0]
    If $ret2D = 1 Then
    $aOut[$i][0] = $aFields[$i]
    $aOut[$i][1] = $aLine[$i]
    Else
    $aOut[$i] = $aLine[$i]
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_CSVObject_GetDS

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_SetDS
    ; Description......: Sets new values to the current data set.
    ; Parameter(s).....: $self The csv object.
    ; .................: $valString Separator delimited string with one value for each field.
    ; Return Value(s)..: 1
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_SetDS($self, $valString)
    Local $aLines = $self.ArrayLines
    Local $aFields = $self.ArrayFields
    Local $aLine[$aFields[0]+1] = [$aFields[0]]
    Local $aSet = StringSplit($valString, $self.Separator)
    For $i = 1 To $aFields[0]
    $aLine[$i] = $aSet[$i]
    Next
    $aLines[$self.CurrentIndex] = $self.Array2Line($aLine)
    $self.ArrayLines = $aLines
    Return 1
    EndFunc ;==>_CSVObject_SetDS

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_FieldList
    ; Description......: Returns the current field list as array or string.
    ; Parameter(s).....: $self The csv object.
    ; .................: $retArr Default '1' - returns array with field names, '0' returns an separator delimited string.
    ; Return Value(s)..: The array or string with field names.
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_FieldList($self, $retArr=1)
    If $retArr = 1 Then Return $self.ArrayFields
    Local $sFields = ''
    For $i = 1 To $self.ArrayFields[0]
    $sFields &= $self.ArrayFields[$i] & $self.Separator
    Next
    Return StringTrimRight($sFields, 1)
    EndFunc ;==>_CSVObject_FieldList

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_PropertySet
    ; Description......: Sets a new value to a property. To use i.e. in loops.
    ; Parameter(s).....: $self The csv object.
    ; .................: $Property The property to set.
    ; .................: $newVal The new value.
    ; Return Value(s)..: 1
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_PropertySet($self, $Property, $newVal)
    _AutoItObject_RemoveMember($self, $Property)
    _AutoItObject_AddProperty($self, $Property, $ELSCOPE_PUBLIC, $newVal)
    Return 1
    EndFunc ;==>_CSVObject_PropertySet

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_FieldNamesSet
    ; Description......: Sets new field names.
    ; Parameter(s).....: $self The csv object.
    ; .................: $sFieldNames Separator delimited string with new field names.
    ; Return Value(s)..: 1
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_FieldNamesSet($self, $sFieldnames)
    Local $aTmpFields = StringSplit($sFieldnames, $self.Separator)
    Local $aCurrent = $self.GetDS(1)
    For $i = 1 To $aCurrent[0][0]
    _AutoItObject_AddProperty($self, $aTmpFields[$i], $ELSCOPE_PUBLIC, $aCurrent[$i][1])
    _AutoItObject_RemoveMember($self, $aCurrent[$i][0])
    Next
    Local $aLines = $self.ArrayLines
    If $self.HasFieldNames = 0 Then
    $aLines[0] += 1
    $self.HasFieldNames = 1
    $self.ArrayLines = $aLines
    $self.MinIndex = 2
    $self.MaxIndex += 1
    $self.CurrentIndex += 1
    _ArrayInsert($aLines, 1, $sFieldnames)
    Else
    $aLines[1] = $sFieldnames
    EndIf
    $self.ArrayLines = $aLines
    $self.ArrayFields = $aTmpFields
    Return 1
    EndFunc ;==>_CSVObject_FieldNamesSet

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

    ;===================================================================================================
    ; Function Name....: _CSVObject_WriteToFile
    ; Description......: Writes the csv object back to an file. If the file was without field names and
    ; .................: the field names was set by object - they will also written to file.
    ; .................: Exceptions are automatically generated field names in the 'num' mode.
    ; Parameter(s).....: $self The csv object.
    ; .................: $sFullPath Default '-1' - uses the path from reading, overwrites the old file.
    ; .................: $sLinebreak Default '@CRLF' - the line ending character.
    ; Return Value(s)..: 1
    ; Author...........: BugFix
    ;===================================================================================================
    Func _CSVObject_WriteToFile($self, $sFullPath=-1, $sLinebreak=@CRLF)
    If $sFullPath = -1 Or $sFullPath = Default Then $sFullPath = $self.FilePath
    If FileExists($sFullPath) Then FileDelete($sFullPath)
    Local $sWrite = ''
    For $i = $self.MinIndex-$self.HasFieldNames To $self.MaxIndex
    $sWrite &= $self.ArrayLines[$i] & $sLinebreak
    Next
    Return FileWrite($sFullPath, StringTrimRight($sWrite, StringLen($sLinebreak)))
    EndFunc ;==>_CSVObject_WriteToFile

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

    #region - internal use only

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

    Func __ShowDS($self, $sNewDataLine)
    Local $aLine = StringSplit($sNewDataLine, $self.Separator)
    For $i = 1 To $self.ArrayFields[0]
    $self.PropertySet($self.ArrayFields[$i], $aLine[$i])
    Next
    Return 1
    EndFunc ;==>__ShowDS

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

    Func __LineToArray($self, $Line)
    Return StringSplit($Line, $self.Separator)
    EndFunc ;==>__LineToArray

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

    Func __ArrayToLine($self, $Array)
    Local $line = ''
    For $i = 1 To UBound($Array) -1
    $line &= $Array[$i] & $self.Separator
    Next
    Return StringTrimRight($line, 1)
    EndFunc ;==>__ArrayToLine

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

    Func __FieldIndex($self, $Field)
    Local $index = -1
    For $i = 0 To $self.ArrayFields[0]
    If $self.ArrayFields[$i] = $Field Then
    $index = $i
    ExitLoop
    EndIf
    Next
    If $index < 0 Then Return SetError(1,0,0)
    Return $index
    EndFunc ;==>__FieldIndex

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

    Func _OnExit()
    _AutoItObject_Shutdown()
    EndFunc ;==>_OnExit

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

    Func _ErrFunc()
    ConsoleWrite("! COM Error ! Number: 0x" & Hex($oError.number, 8) & " ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF)
    Return
    EndFunc ;==>_ErrFunc

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

    #endregion

    [/autoit]
    Bsp.
    [autoit]

    ;-- TIME_STAMP 2014-12-30 00:05:57

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

    #include 'CSV_Object.au3'

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

    Global $file = "test.csv"
    Global $oCSV = _CSVObject($file)

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

    Global $aAll, $a1D, $a2D

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

    ; alle Daten anzeigen
    $aAll = $oCSV.ArrayLines
    _ArrayDisplay($aAll, 'Show All')

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

    ; Iteration
    Do
    $a2D = $oCSV.GetDS(1)
    _ArrayDisplay($a2D, 'Next - Index #' & $oCSV.CurrentIndex)
    Until $oCSV.Next = -1

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

    $oCSV.Previous
    $a1D = $oCSV.GetDS
    _ArrayDisplay($a1D, 'Previous - Index #' & $oCSV.CurrentIndex)

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

    $oCSV.First
    $a1D = $oCSV.GetDS
    _ArrayDisplay($a1D, 'First - Index #' & $oCSV.CurrentIndex)

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

    $oCSV.Last
    $a1D = $oCSV.GetDS
    _ArrayDisplay($a1D, 'Last - Index #' & $oCSV.CurrentIndex)

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

    ; Ausgabe Feldnamen
    ConsoleWrite($oCSV.FieldList(0) & @CRLF)

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

    ; Ändern eines Feldwertes NICHT über direkte Wertzuweisung an die Property, dann werden Daten im csv-Objekt nicht mit geändert!
    ; Ändern einzelner Wert im aktuellen DS (z.Zt. letzter)
    $oCSV.SetField('Charly', 'WERT_NEU')

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

    ; Ändern aller Werte im ersten DS
    $oCSV.First
    $oCSV.SetDS('A;B;C;D;E;F;G')

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

    ; Änderungen ansehen
    $aAll = $oCSV.ArrayLines
    _ArrayDisplay($aAll, 'Änderungen')

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

    ; Feldnamen ändern
    $oCSV.FieldNamesSet('Juliette;Kilo;Lima;Mike;November;Oscar;Papa')

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

    ; Änderungen ansehen
    $aAll = $oCSV.ArrayLines
    _ArrayDisplay($aAll, 'neue Feldnamen')

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

    ; geänderte Datei speichern
    $oCSV.WriteToFile

    [/autoit]
  • AutoIt-Object -- dynamische Wertezuweisung an Properties

    • BugFix
    • 29. Dezember 2014 um 10:49

    Ja Danke, habe mir jetzt eine Methode PropertySet erstellt.

    [autoit]

    Func _PropertySet($self, $Property, $newVal)
    _AutoItObject_RemoveMember($self, $Property)
    _AutoItObject_AddProperty($self, $Property, $ELSCOPE_PUBLIC, $newVal)
    EndFunc

    [/autoit]
  • AutoIt-Object -- dynamische Wertezuweisung an Properties

    • BugFix
    • 28. Dezember 2014 um 23:39

    Hi,
    hat schonmal jemand mit AutoIt-Object und dynamischen Properties gearbeitet?
    Ich erstelle ein Objekt mit unterschiedlicher Anzahl an Properties. Die Property-Namen werden beim Erstellen übergeben und auch im Objekt als Array hinterlegt.
    Wenn ich dann mit dem Objekt arbeite, möchte ich auch in einem Rutsch alle Werte der Properties ändern können. Also Abarbeiten in einer Schleife.
    Beim Auslesen kann man das mit Execute hinbiegen - aber wie kann ich das bei Wertzuweisungen erledigen?

    Bsp.-Skript

    Spoiler anzeigen
    [autoit]


    #include "AutoitObject.au3"
    #include <Array.au3>

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

    _AutoItObject_StartUp()

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

    ; Objekt mit Properties erstellen
    $o = _Obj('Alpha;Beta;Gamma;Delta')

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

    ; Property-Namen anzeigen
    $aProps = $o.ArrayProps
    _ArrayDisplay($aProps)

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

    ; Werte ausgeben (Wert = Index bei Erstellung)
    With $o
    ConsoleWrite(.Alpha & @CRLF)
    ConsoleWrite(.Beta & @CRLF)
    ConsoleWrite(.Gamma & @CRLF)
    ConsoleWrite(.Delta & @CRLF & @CRLF)
    EndWith

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

    ; Werte in Schleife ausgeben
    For $i = 1 To $aProps[0]
    ConsoleWrite(Execute('$o.' & $aProps[$i]) & @CRLF)
    Next

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

    ; ??? Werte in Schleife zuweisen ???
    Global $aNewVal[4] = [10,20,30,40]
    For $i = 1 To $aProps[0]
    ; wie kann ich dynamisch den Property-Namen verwenden?
    ; so gehts nicht:
    Execute('$o.' & $aProps[$i]) = $aNewVal[$i-1] ; ==>> error: Statement cannot be just an expression.
    Next

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

    _AutoItObject_Shutdown()

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

    Func _Obj($_sProps)
    Local $self = _AutoItObject_Create()
    Local $aProps = StringSplit($_sProps, ';')
    For $i = 1 To $aProps[0]
    _AutoItObject_AddProperty($self, $aProps[$i], $ELSCOPE_PUBLIC, $i)
    Next
    ; Array mit Property-Namen speichern in eigener Property
    _AutoItObject_AddProperty($self, 'ArrayProps', $ELSCOPE_PUBLIC, $aProps)
    Return $self
    EndFunc

    [/autoit]
  • PDF Dokumete per Netzwerk Senden

    • BugFix
    • 28. Dezember 2014 um 22:54
    Zitat von mcbaldrian

    $name = TCPNameToIP ("127.0.0.1")
    $Connection = TCPConnect($name, 4321)


    Wie soll der Client den Server erreichen, wenn du eine Verbindung mit dir selbst erstellst?
    Falls Server und Client auf derselben Machine sind - welchen Sinn hat dann das Netzwerk-Gedöns?

  • Doppelte Einträge aus *.ini löschen

    • BugFix
    • 28. Dezember 2014 um 22:12
    Zitat von oh-ha-2

    Mir wäre ja schon geholfen gewesen das eine Problem zu lösen.


    Also Raupis Vorschlag löst genau dein Problem.
    Der Eintrag aus Übernachtung wird gelöscht und in keine Übernachtung eingetragen.
    Anschließend setzt du den Radio-Button zur Korrektur.

  • Doppelte Einträge aus *.ini löschen

    • BugFix
    • 28. Dezember 2014 um 17:17

    Mal unabhängig von deinem Problem, deine Programmlogik ist wenig sinnvoll.
    Warum schreibst du verschiedene Sektionen für Übernachtung/keine Übernachtung ?
    Datum=1 ; Das ist Übernachtung
    Datum=0 ; Das ist dann keine Übernachtung
    So ist alles in einer Sektion und leicht zu handhaben.

    Noch sinnvoller wäre eigentlich, dafür SQLite zu verwenden. Hier laufen doch nach und nach einige Daten auf, da ist eine Datenbank die bessere Lösung.

  • Hex Farbwerte nach RGB umrechnen

    • BugFix
    • 27. Dezember 2014 um 13:54

    Bitte Thema auf Gelöst setzen.

  • File Manipulation mit Array und Regex: Nur numerische Zeilen in File löschen -HILFE-

    • BugFix
    • 26. Dezember 2014 um 22:06
    Zitat von R4z0r

    $text = @ScriptDir & "test_offline.log"


    Mach doch mal, was dir gesagt wird!! Gib nach dieser Zuweisung den Inhalt von $text in die Konsole aus. Dann wirst du sehen, dass das totaler Quark ist, weil etwas Wesentliches drin fehlt (die Hilfe sagt dir auch was).

  • PC Sicherung Komplett

    • BugFix
    • 23. Dezember 2014 um 20:41
    Zitat von Alina

    nur muss ich dazu ein komplettes Linux installieren?


    Das funktioniert auch mit einer Linux-Live CD (Live USB-Stick).
    Du musst dich nur vergewissern, welche Platte dann als hda und hdb gemounted ist. Nicht dass du versehentlich von der leeren einen Klon erstellst und deine Daten schrottest. :whistling:

  • Hardware Baukasten Tinkerforge

    • BugFix
    • 23. Dezember 2014 um 20:28

    ..und wenn es erforderlich sein sollte: Du kannst auch in AutoIt Callback-Funktionen ausführen. ;)

  • Hilfe mit Aufruf von dll Funktion(en)

    • BugFix
    • 22. Dezember 2014 um 19:55

    Joah, is denn hoid scho Woinachden... :rofl:

    Immer wieder gern.

  • Hilfe mit Aufruf von dll Funktion(en)

    • BugFix
    • 22. Dezember 2014 um 13:18

    Da sowohl NumberOfTRXunits als auch AvailableTRXunits von der Funktion befüllt werden, würde ich die dafür erforderlichen Strukturen erstellen und als Pointer übergeben. Mag sein, dass ein direktes Befüllen auch möglich ist, ich beginne zumindest immer mit der Pointer-Variante.

    [autoit]

    $NumberOfTRXunits = DllStructCreate("byte")
    $pNumberOfTRXunits = DllStructGetPtr($NumberOfTRXunits)

    [/autoit]


    "AvailableTRXunits" erwartet ein Integer-Array "TtrxUnits= Array[0..255] of Integer;". Das ist letztendlich nichts anderes als aneinandergereihter Speicherplatz.

    [autoit]

    $AvailableTRXunits= DllStructCreate("int[256]")
    $pAvailableTRXunits = DllStructGetPtr($AvailableTRXunits)

    [/autoit]


    Sollte die Übergabe des array in der Form nicht funktionieren, kann man auch probieren dieses als Bytearray zu übergeben:

    [autoit]

    $AvailableTRXunits= DllStructCreate("byte[" & 4*256 & "]") ; Integer hat 4 Byte
    $pAvailableTRXunits = DllStructGetPtr($AvailableTRXunits)

    [/autoit]


    Dein Aufruf würde also so aussehen:

    [autoit]

    $aReturn = DllCall("trxRemote.dll", "INT", "trxInitialize", "PTR", $pNumberOfTRXunits, "PTR", $pAvailableTRXunits)

    [/autoit]
  • The Perseus Programming Language

    • BugFix
    • 22. Dezember 2014 um 09:21
    Zitat von ShitDown

    Wäre jemand so nett und würde den Download evtl. hier zur Verfügung stellen?


    Na klar, kein Problem. Da Anhang hier nur bis 1MB erlaubt, habe ich mal auf FileStore.to hochgeladen.

  • Elementpositionen je nach Betriebssystem unterschiedlich

    • BugFix
    • 17. Dezember 2014 um 16:45

    Ich nehme mal an, das ist den Systemmaßen geschuldet. Punktgenaue Positionierung in einem Fenster wird auf jedem System etwas anders aussehen. Das ist übrigens ein großer Nachteil der pt-Positionierung. In anderen Systemen arbeitet man mit "schwimmender" Positionierung. Dort wird z.B. nur angegeben in welchem Bereich (horizontal/vertikal: Top, Center, Bottom) die Controls neben/unter-einander angeordnet werden sollen. Da sind die Ränder des Fensters dann völlig unerheblich, die Controls passen sich immer an.

  • Eigenen Script-Editor programmieren, dazu ein paar Fragen.....

    • BugFix
    • 17. Dezember 2014 um 16:32

    Du benötigst schon "SciTE4AutoIt", also nicht die small Version.
    In SciTE öffnest du mit "Strg+1" die Konfiguration. Dort findest du u.a. den Abbrev Manager. Damit kannst du ganze Scriptblöcke oder auch nur einzelne Befehle einfügen (und standardmäßig funktioniert das mit Leertaste nach dem Abbrev-Kürzel).
    Um Autovervollständigung für die Konstanten von Includes zu erhalten, musst du selbst ein wenig basteln. Schau dir in der SciTE Installation die verwendeten Tools an. Autocomplete ist das, was du brauchst. SciTE wird mit Lua - Skripten gesteuert. Ist aber recht simpel. Du findest auch hier ein Unterforum 'Lua', da sind viele Hinweise zur Individualisierung von SciTE zu finden.
    Probier selber mal, wie weit du kommst. Wenn du hängen bleibst, melde dich. Dann helfe ich dir gern weiter.

  • Eigenen Script-Editor programmieren, dazu ein paar Fragen.....

    • BugFix
    • 17. Dezember 2014 um 15:15
    Zitat


    Was mich an SciTe-Editor stört ist das sogenannte Autovervollständigen, man gibt einen Befehl ein aber wenn man die Leertaste drück wird der ausgewählte Befehl nicht vervollständigt sonder muß immer erst die Enter/Return/Eingabe-Taste drücken.

    Dann wie gesagt, wenn man per Include weitere Sachen einbindet z.B. Konstanten kann man diese nicht auf die gleiche weise eingeben wie man es bei den Befehlen möglich ist, man muss leider dann die komplette Konstanten-Namen kennen.


    Dann solltest du mal deine Installation überprüfen. All das geht auch mit SciTE.

  • Eigenen Script-Editor programmieren, dazu ein paar Fragen.....

    • BugFix
    • 17. Dezember 2014 um 10:42
    Zitat von Samson71

    Ziel ist es, das die Befehle nicht mehr eingetippt werden müssen sondern man kann sich die Befehle aus einer Liste auswählen.


    Aus einer Liste wählen ist definitiv langsamer, als mit Autovervollständigung durch Abbrevs zu arbeiten. ;)
    Lerne erst mal alle Möglichkeiten des SciTE-Editors auszuschöpfen. Wie im vorigen Post bereits gesagt gibt es auch noch ISN-Studio, weiterhin findest du hier im Forum noch einen Thread der sich mit SublimeText als Editor für AutoIt befasst.

  • Inputbox nur Dezimalzahlen

    • BugFix
    • 16. Dezember 2014 um 19:12
    Zitat von BlutigerAnfänger

    Oder muß ich da irre Abfragen konstruieren?


    Nicht sehr irre. :D

    Spoiler anzeigen
    [autoit]

    $hGui = GUICreate('Test')
    $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    $hInput = GUICtrlGetHandle($cInput)
    GUISetState()

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

    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $hWndEdit, $sRead, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    $hWndEdit = GUICtrlGetHandle($iIDFrom)
    If $hWndEdit = $hInput And $iCode = $EN_CHANGE Then
    $sRead = GUICtrlRead($iIDFrom)
    If Not StringRegExp($sRead, '^\d+,?(\d+)?$') Then
    GUICtrlSetData($iIDFrom, StringLeft($sRead, StringLen($sRead)-1))
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]


    Edit:
    Aber denk dran, dass man mit Komma in AutoIt nicht rechnen kann. Du kannst es in der Anzeige verwenden musst aber zum Rechnen in Punkt umwandeln. ;)

  • Sprungmarke setzen

    • BugFix
    • 14. Dezember 2014 um 12:27

    Auch wenn es dort nur zur Testausgabe geschieht:

    Zitat

    Warnung: Das Blockieren von laufenden Benutzerfunktionen, die Fensternachrichten verwenden (z.B. mit Befehlen wie "Msgbox()"), kann zu unerwartetem Verhalten führen. So schnell wie möglich sollte dann die Rückkehr zum System stattfinden !!!

    ^^

    Das Verhalten tritt auf, weil die registrierte Message noch nicht an das System weitergereicht wurde. Du wertest einen Zustand aus, der erst beim Verlassen der Funktion vom System umgesetzt wird.

    Edit:
    Hier mal ein Weg, wie man das sauber löst.

    Spoiler anzeigen
    [autoit]

    #include <GUIListBox.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>

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

    Global $hListBox, $fDouble = False

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

    _Main()

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

    Func _Main()
    Local $hGUI = GUICreate("(UDF) ListBox: Erzeugen", 400, 296)
    $hListBox = _GUICtrlListBox_Create($hGUI, "String bei Erzeugung", 2, 2, 396, 296, $LBS_SORT)
    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    ; Fügt Dateien hinzu
    _GUICtrlListBox_BeginUpdate($hListBox)
    _GUICtrlListBox_ResetContent($hListBox)
    _GUICtrlListBox_InitStorage($hListBox, 100, 4096)
    _GUICtrlListBox_AddString($hListBox, "Musterfrau D1")
    _GUICtrlListBox_AddString($hListBox, "Mustermann D2")
    _GUICtrlListBox_AddString($hListBox, "Musterkind D3")
    _GUICtrlListBox_AddString($hListBox, "Mustermum D4")
    _GUICtrlListBox_AddString($hListBox, "Musterdad D5")
    _GUICtrlListBox_AddString($hListBox, "Musterfrau DK1")
    _GUICtrlListBox_AddString($hListBox, "Mustermann DK2")
    _GUICtrlListBox_AddString($hListBox, "Musterkind DK3")
    _GUICtrlListBox_AddString($hListBox, "Mustermum DK4")
    _GUICtrlListBox_AddString($hListBox, "Musterdad DK5")
    _GUICtrlListBox_AddString($hListBox, "Musterfrau DKD 1")
    _GUICtrlListBox_AddString($hListBox, "Mustermann DKD 2")
    _GUICtrlListBox_AddString($hListBox, "Musterkind DKD 4")
    _GUICtrlListBox_AddString($hListBox, "Mustermum DKD4")
    _GUICtrlListBox_AddString($hListBox, "Musterdad DKD5")
    _GUICtrlListBox_AddString($hListBox, "Musterfrau PD1")
    _GUICtrlListBox_AddString($hListBox, "Mustermann PD2")
    _GUICtrlListBox_AddString($hListBox, "Musterkind PD3")
    _GUICtrlListBox_AddString($hListBox, "Mustermum PD4")
    _GUICtrlListBox_AddString($hListBox, "Musterdad PD5")
    _GUICtrlListBox_AddString($hListBox, "Musterfrau PDK1")
    _GUICtrlListBox_AddString($hListBox, "Mustermann PDK2")
    _GUICtrlListBox_AddString($hListBox, "Musterkind PDK3")
    _GUICtrlListBox_AddString($hListBox, "Mustermum PDK4")
    _GUICtrlListBox_AddString($hListBox, "Musterdad PDK5")
    _GUICtrlListBox_EndUpdate($hListBox)

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_PRIMARYUP
    If $fDouble Then
    $fDouble = False
    ConsoleWrite(_GUICtrlListBox_GetText($hListBox, _GUICtrlListBox_GetCurSel($hListBox)) & @CRLF)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_Main

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $iCode = BitShift($iwParam, 16)
    If $ilParam = $hListBox And $iCode = $LBN_DBLCLK Then $fDouble = True
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Simples Connect Tool von Batch in AutoIt übernehmen?

    • BugFix
    • 14. Dezember 2014 um 09:47
    Zitat von djdanby

    dann schlagen nur 3 Scanner an. Das ist allerdings immernoch zu viel.


    Die Anzahl ist völlig unerheblich, wichtiger ist welche Scanner anschlagen. Meldet "virustotalschutz-jamaica.com" oder "the-safest-scan-u-know.ru" oder irgend solch total unbekanntes Programm, dann hast du alles richtig gemacht. :D

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™