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. 4ern

Beiträge von 4ern

  • Etwas eintragen und als txt datei speichern

    • 4ern
    • 7. November 2014 um 10:07

    Hast du dir die Hilfe überhaupt angeschaut und die dazugehörigen Beispiele? Denn genau dafür was du vorhast existiert ein Beispiel. Du musst nur einpaar Code Zeilen in der Funktion anpassen.... Das kriegt wirklich jeder Google Entwickler hin...

    Für jeden Anfänger empfehle ich dieses hervoragende AutoIt Buch durchzulesen!!! Vor ca. einem Jahr habe ich auch mit AutoIt angefangen und dieses Buch hat mir ziemlich oft weitergeholfen.

  • Etwas eintragen und als txt datei speichern

    • 4ern
    • 7. November 2014 um 09:04

    Bei deinem Vorhaben denke ich wäre eine ini eher geeignet.
    Wie ich sehe vermischt du gerade 2 GUI Varianten. Einmal den Message Loop Modus und einmal den On Event Modus.

    Ich habe jetzt meine Beispiel Funktion mit Absicht sehr sehr einfach gehalten, damit es auch ein Anfänger nachvollziehen kann.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Timers.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $Form1_1 = GUICreate("Verwaltung", 800, 600, 212, 125)

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

    $Time = GUICtrlCreateLabel("", 650, 4, 80, 20)
    GUICtrlSetColor(-1, 0x008000)
    GUICtrlSetFont(-1, 10, 800, 0, "Arial Narrow")

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

    ;----------------------------------------------------------------------------------------------/
    ; Tab
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTab(3, 3, 797, 595)

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

    ;----------------------------------------------------------------------------------------------/
    ; TabItem 1
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTabItem("Angaben")
    GUICtrlSetState(-1, $GUI_SHOW)

    $Label1 = GUICtrlCreateLabel("Charname:", 40, 40, 84, 17)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $Char = GUICtrlCreateInput("", 150, 40, 153, 21)

    $Label2 = GUICtrlCreateLabel("Accountname:", 399, 40, 101, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $ACC = GUICtrlCreateInput("", 500, 40, 129, 21)

    $Label3 = GUICtrlCreateLabel("Server:", 40, 72, 110, 17)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $Server = GUICtrlCreateCombo("", 150, 72, 105, 25)
    GUICtrlSetData(-1, "1|2|3|4|")

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

    $erstellen = GUICtrlCreateButton("Eintragen", 40, 500, 97, 33, 0)

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

    ;----------------------------------------------------------------------------------------------/
    ; Tab 2
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTabItem("Account")

    GUISetState(@SW_SHOW)

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

    ;----------------------------------------------------------------------------------------------/
    ; set on event
    ;----------------------------------------------------------------------------------------------/
    GUISetOnEvent(-3, "_exit")
    GUISetOnEvent($erstellen, "_eintragen")

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

    ;----------------------------------------------------------------------------------------------/
    ; Timer
    ;----------------------------------------------------------------------------------------------/
    $Timer1 = _Timer_SetTimer($Form1_1, 1000, "_UpdateStatusBarClock")

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

    While 1
    sleep(10)
    WEnd

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

    Func _UpdateStatusBarClock($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    GUICtrlSetData($Time, StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC))
    EndFunc

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

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

    func _eintragen()

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

    Local Static $f_ini = @scriptdir & '\test.ini'

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

    $s_ACC = GUICtrlRead($ACC)
    $s_Char = GUICtrlRead($Char)
    $s_Server = GUICtrlRead($Server)

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

    IniWrite($f_ini, 'Deine Section', 'Account', $s_ACC)
    IniWrite($f_ini, 'Deine Section', 'Charname', $s_Char)
    IniWrite($f_ini, 'Deine Section', 'Accountname', $s_Server)

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

    endfunc

    [/autoit]
  • Sehr langer Text in Editbox soll nicht umbrechen - wie schaffe ich das?

    • 4ern
    • 7. November 2014 um 08:51

    was spricht gegen ein Input?

    [autoit]

    GUICtrlCreateInput('text', left, top, width, height, style = -1, exStyle = -1)

    [/autoit]

    Der Input hat standardmäßig kein Word wrap.

  • Etwas eintragen und als txt datei speichern

    • 4ern
    • 6. November 2014 um 13:42

    1 Fehler:
    Zeile 14. Diesen Befehl verwendest du zweimal für deine GUI.

    [autoit]

    GUISetState(@SW_SHOW)

    [/autoit]

    Um ein bestimmten Tab zuerst anzeigen zu lassen brauchst du den Befehl:

    [autoit]

    GUICtrlSetState(-1, $GUI_SHOW)

    [/autoit]

    Um die Werte der einzelnen GUI Elemte auszulesen, brauchst du den Befehl:

    [autoit]

    GUICtrlRead(controlID, advanced = 0)

    [/autoit]

    Evtl. machst du zuerst ein Tutorial und liest dir die wirklich gute AutoIt Hilfe durch.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <Timers.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $Form1_1 = GUICreate("Verwaltung", 800, 600, 212, 125)

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

    $Time = GUICtrlCreateLabel("", 650, 4, 80, 20)
    GUICtrlSetColor(-1, 0x008000)
    GUICtrlSetFont(-1, 10, 800, 0, "Arial Narrow")

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

    ;----------------------------------------------------------------------------------------------/
    ; Tab
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTab(3, 3, 797, 595)

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

    ;----------------------------------------------------------------------------------------------/
    ; TabItem 1
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTabItem("Angaben")
    GUICtrlSetState(-1, $GUI_SHOW)

    $Label1 = GUICtrlCreateLabel("Charname:", 40, 40, 84, 17)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $Char = GUICtrlCreateInput("", 150, 40, 153, 21)

    $Label2 = GUICtrlCreateLabel("Accountname:", 399, 40, 101, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $ACC = GUICtrlCreateInput("", 500, 40, 129, 21)

    $Label3 = GUICtrlCreateLabel("Server:", 40, 72, 110, 17)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    $Server = GUICtrlCreateCombo("", 150, 72, 105, 25)
    GUICtrlSetData(-1, "1|2|3|4|")

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

    $erstellen = GUICtrlCreateButton("Eintragen", 40, 500, 97, 33, 0)

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

    ;----------------------------------------------------------------------------------------------/
    ; Tab 2
    ;----------------------------------------------------------------------------------------------/
    GUICtrlCreateTabItem("Account")

    GUISetState(@SW_SHOW)

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

    ;----------------------------------------------------------------------------------------------/
    ; set on event
    ;----------------------------------------------------------------------------------------------/
    GUISetOnEvent(-3, "_exit")

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

    ;----------------------------------------------------------------------------------------------/
    ; Timer
    ;----------------------------------------------------------------------------------------------/
    $Timer1 = _Timer_SetTimer($Form1_1, 1000, "_UpdateStatusBarClock")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _UpdateStatusBarClock($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    GUICtrlSetData($Time, StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC))
    EndFunc

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]
  • Häufigkeit der Wörter in einem Array

    • 4ern
    • 6. November 2014 um 10:47

    Ich denke für dein Vorhaben gibt es sehr viele Möglichkeiten und Lösungen. Da muss man Prinzip nur Wissen wie man googlet :whistling:

    Hierfür habe ich jedoch meine eigene Funktion geschrieben, basierend auf Strings und RegEx.
    Das was du noch selber machen musst, ist den höhsten Wert der Array ermitteln.

    Spoiler anzeigen
    [autoit]


    include <Array.au3>

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

    Local $aData[] = ['Name1','Name1','Name2','Name3','Name4','Name2','Name4','Name5','Name2','Name2']
    _arrayCompare_1D_to_2d($aData)
    _ArrayDisplay($aData)

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

    ;----------------------------------------------------------------------------------------------/
    ; Beschreibung: = Ermittelt aus einem 1D Array die Anzahl aller gleichen Vorkommen und übergibt
    ; ein 2D Array
    ; Parameter: = 1D - Array
    ; @return: = 2D - Array
    ; Include = <Array.au3>
    ;
    ; Update = 06.11.2014
    ; von = 4ern.de
    ;----------------------------------------------------------------------------------------------/
    func _arrayCompare_1D_to_2d(byref $aData)

    Local $aData_new[UBound($aData)][2] ;Neues 2D Array erstellen
    Local $s_Data = _ArrayToString($aData, '|') ;Ursprungs Array in ein String setzen

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

    ;----------------------------------------------------------------------------------------------/
    ; Schleife
    ; Durchlauf aller Elmente in einem Array
    ;----------------------------------------------------------------------------------------------/
    for $i = 0 to Ubound($aData) -1
    $a_regEX = StringRegExp($s_Data, $aData[$i],3) ;Setze alle Vorkommen in ein Array
    if @error then ContinueLoop
    $s_Data = StringReplace($s_Data, $aData[$i], '') ;Lösche Element aus dem String

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

    $aData_new[$i][0] = $a_regEX[0] ;setze den Ursprünglichen Wert in 2D
    $aData_new[$i][1] = ubound($a_regEX) ;Zähle Anzahl der Dopplungen und setze in 2D
    next

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

    ;Lösche alle Leeren Elemente
    for $i = Ubound($aData_new) -1 to 0 step -1
    if $aData_new[$i][0] = '' then _ArrayDelete($aData_new, $i)
    next

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

    $aData = $aData_new
    return $aData
    endfunc ;<==/

    [/autoit]
  • Kommunikation Skripte untereinander

    • 4ern
    • 5. November 2014 um 10:00

    Ahh jetzt leuchtet mir das ganze ein :D. Nun muss ich mir eine komfortable Funktion überlegen...

  • Kommunikation Skripte untereinander

    • 4ern
    • 4. November 2014 um 13:38
    Zitat von Andy

    Du denkst immer noch zu sehr an Arrays. Die Struct ist nichts weiter als ein mit irgendwelchen Daten gefüllter Bereich im RAM. Und wenn du neue Daten anhängen willst, schreib diese Daten doch einfach hinten dran.


    Genau das versteh ich nicht wie man das machen soll? Wie kann ich weitere Elemente an das DllStructCreate() dranhängen obwohl es bereits erstellt ist?

    Code
    $tStruct = DllStructCreate($sStruct)
    $tStruct = DllStructCreate($tStruct + $sStruct) ???
    Zitat von Andy

    Wenn es nach mir ginge, gäbe es sowieso nur EINEN anderen Datentyp ausser String, und das wäre DWORD. Damit erschlägst du alle 32-Bit-Datentypen. Der "Empfänger" muss sowieso wissen, welchen Datentyp er aus der Struct ausliest.


    Das stimmt und wäre zu dem viel einfacher, aber blockiere ich dadurch nicht enorm viel Speicher?

  • Kommunikation Skripte untereinander

    • 4ern
    • 4. November 2014 um 12:35

    Ok habe nun in meiner Funktion die Erkennung von Datentypen implementiert. Aktuell scheitere ich daran Uint zuerkennen, aber ansonsten läuft es ganz gut.

    Zudem habe ich die Funktion dahingehend erweitert, dass man die einzelnen Struktur Elemente mit den Array Überschriften ansprechen kann $tStruct.Account pro jeder Array Zeile erhält das Element die jeweilige Zeilennummer hintendran. Also $tStruct.Account1

    Ich überlege zur Zeit, wie ich weitere Elemente hinzufügen/ löschen und editieren kann.

    Spoiler anzeigen
    [autoit]


    ;----------------------------------------------------------------------------------------------/
    ; Funtkions Variable
    ;----------------------------------------------------------------------------------------------/
    $aStruct = _ArrayToDLLStruct

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

    ;----------------------------------------------------------------------------------------------/
    ; Test-Array
    ;----------------------------------------------------------------------------------------------/
    Local $avArray[][] = [ ['Account', 'Ticket ID', 'VorName', 'Nachname', 'Betrag' , 'Bezahlt'], _
    [123885, 4056, 'Max', 'Meier', 23.55, True], _
    [332457, 1011, 'Meier', 'Max', 12.33, False], _
    [332457, 1011, 'Peter', 'Bann', 12.33, True], _
    [123885, 4056, 'Max', 'Meier', 23.55, True], _
    [332457, 1011, 'Meier', 'Max', 12.33, False], _
    [332457, 1011, 'Peter', 'Bann', 12.33, True], _
    [123885, 4056, 'Max', 'Meier', 23.55, True], _
    [332457, 1011, 'Meier', 'Max', 12.33, False], _
    [332457, 1011, 'Peter', 'Bann', 12.33, True], _
    [332457, 1011, 'Martina', 'Kamm', 12.33, False] _
    ]

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

    ;----------------------------------------------------------------------------------------------/
    ; DLL Struktur erstellen
    ;----------------------------------------------------------------------------------------------/
    if $aStruct($avArray) = 0 then
    MsgBox(262144, '@@@ Debug line #15', 'Selection:' & @CRLF & '$tStruct' & @CRLF & @CRLF &_
    'Return:' & @CRLF & $tStruct & @TAB & '#Error: ' & @error & @CRLF)
    exit
    endif

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

    ConsoleWrite('<--- Struct wurde erstellt.' & @CRLF & @CRLF)

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

    ;----------------------------------------------------------------------------------------------/
    ; einzelne Struktur Elmente abrufen
    ;----------------------------------------------------------------------------------------------/
    ConsoleWrite( _
    $aStruct().Account &' | ' & _
    $aStruct().TicketID &' | ' & _
    $aStruct().VorName &' | ' & _
    $aStruct().Nachname &' | ' & _
    $aStruct().Betrag &' | ' & _
    $aStruct().Bezahlt &' | ' & _
    @lf )

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

    ConsoleWrite( _
    $aStruct().Account1 &' | ' & _
    $aStruct().TicketID1 &' | ' & _
    $aStruct().VorName1 &' | ' & _
    $aStruct().Nachname1 &' | ' & _
    $aStruct().Betrag1 &' | ' & _
    $aStruct().Bezahlt1 &' | ' & _
    @lf )

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

    ; #FUNCTION# =======================================================================================
    ; Name ..........: _ArrayToDLLStruct
    ; Description ...:
    ; Parameters ....: $avArray
    ; .....optional..: $action
    ; Dafault: 'create'
    ; Erstellt oder übergibt eine DLL Struktur
    ; Return values .: DLL Struktur
    ; Author ........: 4ern.de / AutoiT.de: rYnow
    ; ==================================================================================================
    Func _ArrayToDLLStruct($avArray = '', $action = 'create')

    Local Static $tStruct
    Local $sStruct

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

    Switch $action
    Case 'create'
    ;----------------------------------------------------------------------------------------------/
    ; Prüfen ob bereits eine Struktur besteht.
    ;----------------------------------------------------------------------------------------------/
    if IsDllStruct($tStruct) <> 0 then
    ContinueCase
    endif

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

    ;----------------------------------------------------------------------------------------------/
    ; Erstellung der Datenstruktur
    ; $i = Zeilen
    ; $s = spalten
    ;----------------------------------------------------------------------------------------------/
    for $i = 0 to UBound($avArray) -1
    for $s = 0 to UBound($avArray,2) -1
    $s_ElementName = StringStripWS($avArray[0][$s], 8)
    if $i >= 1 then
    $s_ElementName &= $i
    endif
    ;----------------------------------------------------------------------------------------------/
    ; Ermittlung des Datentyps
    ; Erkannt wird:
    ; - Boolen
    ; - Pointer
    ; - hWnd
    ; - Handle
    ; - INT 32
    ; - Double
    ; - Float
    ; - DLL struct
    ; Else:
    ; - Char
    ;----------------------------------------------------------------------------------------------/
    Switch VarGetType($avArray[$i][$s])
    Case 'Bool'
    $sStruct &= 'INT '&$s_ElementName&'[1];'
    Case 'Ptr'
    $sStruct &= 'Ptr '&$s_ElementName&'[' & StringLen(Hex($avArray[$i][$s])) & '];'
    Case 'Int32'
    $sStruct &= 'int '&$s_ElementName&';'
    Case 'Double'
    $sStruct &= 'float '&$s_ElementName&';'
    case 'DLLStruct'
    $sStruct &= 'struct '&$s_ElementName&'[' & DllStructGetSize($avArray[$i][$s]) & '];'
    Case Else
    $sStruct &= 'char '&$s_ElementName&'[' & StringLen($avArray[$i][$s]) + 1 & '];'
    EndSwitch
    next
    next

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

    ;ConsoleWrite($sStruct & @crlf)
    $tStruct = DllStructCreate($sStruct)
    if $tStruct = 0 then return SetError(@error,'',$tStruct)

    ;----------------------------------------------------------------------------------------------/
    ; Struktur befüllen
    ; $ii = 1 // Nummer des Elements
    ; $i = Zeilen // Array
    ; $s = spalten // Array
    ;----------------------------------------------------------------------------------------------/
    $ii = 1
    for $i = 0 to UBound($avArray) -1
    for $s = 0 to UBound($avArray,2) -1
    DllStructSetData($tStruct, $ii, $avArray[$i][$s])
    $ii += 1
    next
    next

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

    return $tStruct

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

    case 'get'
    return $tStruct
    EndSwitch
    EndFunc

    [/autoit]

    Consolen Ausgabe:

    Spoiler anzeigen
    Code
    <--- Struct wurde erstellt.
    
    
    Account | Ticket ID | VorName | Nachname | Betrag | Bezahlt | 
    123885 | 4056 | Max | Meier | 23.5499992370605 | 1 |
  • Kommunikation Skripte untereinander

    • 4ern
    • 4. November 2014 um 10:01

    Ok das leuchtet mir ein. Jedoch komm ich nicht auf den Trichter, wie man sowas wie "DllStructAddElement()" realisiert ohne die aktuelle Struct zu zerstören und eine neue mit den Daten anzulegen. Das wäre nämlich exakt das selbe wie ein ReDim im Array...

  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 22:33

    Ok ich werde versuchen die anderen Datentypen mit zu erkennen. Eine Frage hätte ich da noch. Kann man eine bereits erstellte struct um weitere Elemente erweitern? Eine Art ArrayAdd oder redim bei einem array?

    weil dan wären Structs wirklich schöne Alternativen zu arrays, die man zudem aassoziatives Gestalten kann

  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 17:40

    Vielen Dank Ihr zwei...
    Dank euren Vorschlägen, habe ich nun folgende Funktion gebaut.

    Die char Anzahl bestimme ich mit StringLen ich weiß nicht ob das ganz korrekt ist aber was ich so ausprobiert habe, funktioniert es hervorragend....

    Mit dieser Funktion kann ich ein Array an eine Struct übergeben. Natürlich ist das absoluter Blödsinn, da ich direkt eine Struct erstellen kann. Aber zum lernen hat sich das gelohnt. Vielen Vielen Dank !!!

    Spoiler anzeigen
    [autoit]


    Local $avArray[][] = [ ['Accont', 'Ticket ID', 'VorName', 'Nachname'], ['123', '456', 'Max', 'Meier'], ['789', '1011', 'Meier', 'Max'] ]

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

    $tStruct = _StringStruct($avArray,'set')
    ConsoleWrite(DllStructGetData($tStruct, 6))

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

    Func _StringStruct($avArray, $action = 'set')

    Local Static $tStruct
    Local $ii = 1
    local $sRet

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

    Switch $action
    Case 'create'
    for $i = 0 to UBound($avArray) -1
    for $n = 0 to UBound($avArray,2) -1
    $sRet &= 'char[' & StringLen($avArray[$i][$n]) & '];'
    $ii += 1
    next
    next
    StringTrimRight($sRet, 1)
    $tStruct = DllStructCreate($sRet)
    ContinueCase

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

    Case 'set'
    if IsDllStruct($tStruct) = 0 then
    _StringStruct($avArray,'create')
    return $tStruct
    endif

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

    $ii = 1
    for $i = 0 to UBound($avArray) -1
    for $n = 0 to UBound($avArray,2) -1
    DllStructSetData($tStruct, $ii, $avArray[$i][$n] & Chr(0))
    $ii += 1
    next
    next
    return $tStruct

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

    case 'get'
    return $tStruct

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

    EndSwitch
    EndFunc

    [/autoit]
  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 14:46

    Ok ich möchte dieses Array als Struct...

    [autoit]


    Local $avArray[][] = [ ['Accont', 'Ticket ID', 'VorName', 'Nachname'], ['123', '456', 'Max', 'Meier'], ['789', '1011', 'Meier', 'Max'] ]

    [/autoit]
  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 13:57

    Soweit habe ich das begriffen. Aber so wie ich das ganze Verstanden habe, kann man mit dem Index ein 1D Array erstellen.

    Weil aktuell kann ich zwar beliebig viele Spalten erstellen aber nur eine Zeile? Oder muss ich tatsächlich für jede Zeile ein neues struct erstellen?

    Ich möchte, dass meine zwei exen (Sender, Empfänger) auf ein 1D Array mit 20 Zeilen und einer 1 Spalte zurückgreifen können.

    Code
    | Zeile 0 | Spalte 0  |
    |---------|-----------|
    | [1]     | 'Wert 1'  |
    | [2]     | 'Wert 2'  |
    | [3]     | 'Wert 3'  |
    | [4]     | 'Wert 4'  |
    | [5]     | 'Wert 5'  |
    | ..
  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 12:55

    ok vielen Dank für die Erklärung.

    jetzt noch eine Frage. Warum bekomme ich nur den ersten Buchstaben eines Strings zurück, wenn ich über die Indizies arbeite?

  • Kommunikation Skripte untereinander

    • 4ern
    • 3. November 2014 um 09:43

    Guten Morgen zusammen,

    vielen Dank für eure Erklärungen. Andys 1D Array kann ich noch voll und ganz nachvollziehen. Jedoch das 3D Array von Make-Grafik ist doch sehr kompliziert für mich :). z. B. versteh ich überhaupt nicht wie ich durch dieses Beispeil ein 2D Struct Array erstelle.

    @Andy hast du evtl. ein Beispiel wie ich ein SOA erstelle?

    aaaa. Nach 30sten durchlesen, die Berechnung verstanden :party:

    indem Fall würde mein 1D array (nach Make-Grafiks) Beispiel wie folgt ausschauen:

    [autoit]


    ; Array[10]
    $tStruct = DllStructCreate('byte d1; dword array[50]')
    $tStruct.d1 = 10 ; 10 Elemente

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

    For $i = 0 To $tStruct.d1 -1
    $tStruct.array(($i +1)) = Random(1, 100, 1) ; Jedes Element zufällig befüllen
    Next

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

    ; $Array[2]
    ConsoleWrite(Pseudo2DArray($tStruct, 2) & @CRLF)

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

    Func Pseudo2DArray(ByRef $t, $x)
    Return $tStruct.array(($x +1))
    EndFunc

    [/autoit]

    /EDIT --

    Ich habe nun versucht eine Funktion daraus zu erstellen um mir das Leben leichter zu machen :). Jedoch habe ich nun das Problem, dass mir die Ausgabe nur den ersten Buchstaben liefert???

    [autoit]


    $tStruct = DllStructCreate('byte d1; byte d2; char array[128]')
    $tStruct.d1 = 10 ; 1. Dimension -> 10 Elemente
    $tStruct.d2 = 5 ; 2. Dimension -> 5 Elemente

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

    _set_2D_struct($tStruct, 2, 2, 'Hallo AutoIt', 'set')
    ConsoleWrite(_set_2D_struct($tStruct,2,2))

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

    func _set_2D_struct(ByRef $t, $x, $y, $value = '', $action = 'get')
    Switch $action
    Case 'get'
    Return $tStruct.array(($x * $t.d2 + $y +1))
    Case 'set'
    $tStruct.array(($x * $t.d2 + $y +1)) = $value
    EndSwitch
    endfunc

    [/autoit]

    Ausgabe: H

  • Kommunikation Skripte untereinander

    • 4ern
    • 31. Oktober 2014 um 21:09

    ???? Wie kann ich eine Array in ein struct setzen?

  • Kommunikation Skripte untereinander

    • 4ern
    • 31. Oktober 2014 um 17:38

    Also mit einer 1D Array habe ich das schonmal wie folgt geschafft... Wahrscheinlich nicht die sauberste Methode aber sie funktioniert :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $file_dll = @scriptdir & '\SharedMemory.DLL'
    $ptr = DllCall(DllOpen($file_dll), "dword", "GetPointer")
    $struct = DllStructCreate('WCHAR[5000]', $ptr[0])

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

    $array1 = _GetTestArray(100)
    DllStructSetData($struct, 1, _ArrayToString($array1,'|'))

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

    _ArrayDisplay(StringSplit(DllStructGetData($struct, 1), '|', 2))

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

    ;==================================================================================================
    ; Funktion _GetTestArray($iUbDim1 [, $iUbDim2=0, $sValue='Wert ']])
    ; Beschreibung Gibt ein 1D- oder 2D-Array mit Testdaten zurück
    ; Parameter $iUbDim1 Anzahl Elemente 1. Dimension
    ; optional $iUbDim2 Anzahl Elemente 2. Dimension; wird kein Wert oder Wert < 2 übergeben,
    ; dann wird ein 1D-Array erzeugt; Standard: 0 = 1D-Array
    ; optional $sValue Standard: "Wert $i" bzw. "Wert $i/ $k"; $i bzw $k werden immer angefügt
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetTestArray($iUbDim1, $iUbDim2=0, $sValue='Wert ')
    Local $i, $k, $2ndDim = False
    Local $aOut[$iUbDim1]
    If $iUbDim2 > 1 Then
    $2ndDim = True
    ReDim $aOut[$iUbDim1][$iUbDim2]
    EndIf
    For $i = 0 To $iUbDim1 -1
    If $2ndDim Then
    For $k = 0 To $iUbDim2 -1
    $aOut[$i][$k] = $sValue & $i & '/ ' & $k
    Next
    Else
    $aOut[$i] = $sValue & $i
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_GetTestArray

    [/autoit]
  • Kommunikation Skripte untereinander

    • 4ern
    • 31. Oktober 2014 um 15:49

    Ich finde Andys Methode super und wollte das gerne auf mein Script anwenden.

    Jedoch muss ich nicht nur Werte sondern ganze Arrays übertragen.... Hierzu habe ich versucht die Funktionen von BugFix zu verwenden. Aber ich habe keine Ahnung wie ich in diesen Funktionen die .dll von Andy einbinden kann...

    Spoiler anzeigen
    [autoit]


    $array1 = _GetTestArray(5,2)
    $2D_Struct_str = _ArrayToByteArray2D($array1, 'char[128]')
    $a2 = _ByteArray2DToArray($2D_Struct_str)
    _ArrayDisplay($a2, 'String-Strukt als Array')

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

    ;==================================================================================================
    ; Funktion _GetTestArray($iUbDim1 [, $iUbDim2=0, $sValue='Wert ']])
    ; Beschreibung Gibt ein 1D- oder 2D-Array mit Testdaten zurück
    ; Parameter $iUbDim1 Anzahl Elemente 1. Dimension
    ; optional $iUbDim2 Anzahl Elemente 2. Dimension; wird kein Wert oder Wert < 2 übergeben,
    ; dann wird ein 1D-Array erzeugt; Standard: 0 = 1D-Array
    ; optional $sValue Standard: "Wert $i" bzw. "Wert $i/ $k"; $i bzw $k werden immer angefügt
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetTestArray($iUbDim1, $iUbDim2=0, $sValue='Wert ')
    Local $i, $k, $2ndDim = False
    Local $aOut[$iUbDim1]
    If $iUbDim2 > 1 Then
    $2ndDim = True
    ReDim $aOut[$iUbDim1][$iUbDim2]
    EndIf
    For $i = 0 To $iUbDim1 -1
    If $2ndDim Then
    For $k = 0 To $iUbDim2 -1
    $aOut[$i][$k] = $sValue & $i & '/ ' & $k
    Next
    Else
    $aOut[$i] = $sValue & $i
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_GetTestArray

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _CreateByteArray2D
    ; Description ...: Erstellt die Struktur Bytearray im Zugriffs-Stil eines Array-2D
    ; Syntax.........: _CreateByteArray2D($sType, $iRows, $iCols)
    ; Parameters ....: $sType String zu speichernder Datentyp
    ; $iRows Anzahl Zeilen
    ; $iCols Anzahl Spalten
    ; Return values .: Bytearray-Struktur
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; Remarks .......: Zusätzlich zu den Daten werden Größe und Name des verwendeten Datentyps und die Größe der Dimensionen
    ; in der Struktur hinterlegt
    ; ===============================================================================================================================
    Func _CreateByteArray2D($sType, $iRows, $iCols)
    Local $iSize = DllStructGetSize(DllStructCreate($sType, 1))
    Local $aByte = DllStructCreate('byte[' & $iSize *$iRows *$iCols & '];int size;wchar type[128];int ubound[2]')
    DllStructSetData($aByte, 'size', $iSize)
    DllStructSetData($aByte, 'type', $sType)
    DllStructSetData($aByte, 'ubound', $iRows, 1)
    DllStructSetData($aByte, 'ubound', $iCols, 2)
    Return $aByte
    EndFunc ;==>_CreateByteArray2D

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ByteArray2DToArray
    ; Description ...: Überträgt die Daten aus dem Bytearray in ein klassisches 2D-Array
    ; Syntax.........: _ByteArray2DToArray($aByte)
    ; Parameters ....: $aByte die Struktur Bytearray
    ; Return values .: Ein klassisches 2D-Array mit allen Werten aus der Struktur
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; ===============================================================================================================================
    Func _ByteArray2DToArray(ByRef $aByte)
    Local $Ub1 = DllStructGetData($aByte, 'ubound', 1)
    Local $Ub2 = DllStructGetData($aByte, 'ubound', 2)
    Local $a[$Ub1][$Ub2]
    Local $sType = DllStructGetData($aByte, 'type')
    Local $iSize = DllStructGetData($aByte, 'size')
    Local $iShiftPtr, $tmpStruct, $p_aByte = DllStructGetPtr($aByte)
    For $i = 0 To $Ub1 -1
    For $j = 0 To $Ub2 -1
    $iShiftPtr = ($i * $Ub2 * $iSize) + ($j * $iSize)
    $tmpStruct = DllStructCreate($sType, $p_aByte +$iShiftPtr)
    $a[$i][$j] = DllStructGetData($tmpStruct, 1)
    Next
    Next
    Return $a
    EndFunc ;==>_ByteArray2DToArray

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ArrayToByteArray2D
    ; Description ...: Überträgt die Daten aus dem Bytearray in ein klassisches 2D-Array
    ; Syntax.........: _ArrayToByteArray2D($array, $sType, $iStart)
    ; Parameters ....: $array klassisches 2D-Array
    ; $sType Datentyp im Array (Standard "int")
    ; $iStart Start-Index (Standard 0)
    ; Return values .: Bytearray-Struktur mit allen Werten aus dem Array
    ; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ; ===============================================================================================================================
    Func _ArrayToByteArray2D(ByRef $array, $sType="int", $iStart=0)
    If $iStart < 0 Then $iStart = 0
    Local $Ub1 = UBound($array) - $iStart
    Local $Ub2 = UBound($array, 2)
    Local $aByte = _CreateByteArray2D($sType, $Ub1, $Ub2)
    Local $iSize = DllStructGetData($aByte, 'size')
    Local $iShiftPtr, $tmpStruct, $p_aByte = DllStructGetPtr($aByte)
    For $i = $iStart To $Ub1 -1
    For $j = 0 To $Ub2 -1
    $iShiftPtr = (($i - $iStart) * $Ub2 * $iSize) + ($j * $iSize)
    $tmpStruct = DllStructCreate($sType, $p_aByte +$iShiftPtr)
    DllStructSetData($tmpStruct, 1, $array[$i][$j])
    Next
    Next
    Return $aByte
    EndFunc ;==>_ByteArray2DToArray

    [/autoit]

    Kann es evtl. sein, dass die .dll vom Andy dies nicht unterstützt?

  • Radio Button automatisch an den Text anpassen

    • 4ern
    • 30. Oktober 2014 um 17:29

    Hast du ein bsp. Code? Kann mir gerade überhaupt nicht vorstellen was du genau vorhast?

  • je Compiler Subscript Error oder nicht

    • 4ern
    • 28. Oktober 2014 um 22:06

    Habe auch anfangs mit ISN gearbeitet. Jedoch benötigte ich einen Editor welcher mehrer Sprachen unterstützt. Daher habe ich zu Sublime gewechselt. BugFix arbeitet auch fleißig an neuen Funktionen für Sublime... ich denke schon bald ist es eine wirklich gute Alternative zu SciTE

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™