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

  • Mehrere GUIs miteinander "verbinden"

    • BugFix
    • 7. Mai 2019 um 07:38

    Dafür hatte ich vor 10? Jahren mal ein Skript gepostet. Filtere mal im Skripteforum meine Posts und such in dem Zeitraum. Titel weiß ich nicht mehr. Ich glaube es hieß etwas mit "Andocken".

    Edit:

    Habs gefunden GUIDocking UDF

  • 3 verschiedene Farben auf bestimmten Koordinaten erkennen und Meldung ausgeben

    • BugFix
    • 29. April 2019 um 14:35
    Zitat von Code4Fun

    GUIDelete($hGUI) ; und lösche die GUI

    Nein, nur GUISetState(@SW_HIDE), sonst ist dein GUISetState(@SW_SHOW) auch nicht sinnvoll.

  • Fortlaufende Nummerierung neuer Dateien

    • BugFix
    • 29. April 2019 um 11:15
    Zitat von Muashi

    Die Laufvariable $i in einer For...Next-Schleife ist ja nicht deklarationspflichtig bzw. gilt automatisch als deklariert, selbst bei Opt('MustDeclareVars', 1) .

    (ich vermute mal, das war ursprünglich ein Bequemlichkeitsfeature)

    Nein, keine Bequemlichkeit. Zählervariablen werden üblicherweise durch Verwendung deklariert, da sie unabdingbarer Bestandteil der Schleife sind. In anderen Sprachen existiert i.A. die Zählervariable aber auch nur innerhalb der Schleife, in AutoIt lebt sie weiter. Das erscheint manchmal ganz praktisch, da ich z.B. bei Verlassen der Schleife durch bestimmte Bedingung, den Wert des Zählers bei Gültigkeit dieser Bedingung sofort greifbar habe ohne ihn einer vorab deklarierten Variablen zuweisen zu müssen. Das kann aber durchaus auch zu Fehlern führen (bedingte Ausführung von Schleifen in einem Level).

  • Eine Funktion mehrfach starten

    • BugFix
    • 25. April 2019 um 12:52

    Steht doch in der Hilfe, wie man auf das Parameterarray zugreift:

    Python
    If $CMDLINE[0] Then
        For $i = 1 To $CMDLINE[0]
            MsgBox(0, 'CMDLINE - Parameter (' & $i & ')', $CMDLINE[$i])
        Next
    EndIf
  • Frage zu CUI EXE Fenster

    • BugFix
    • 25. April 2019 um 12:22

    Ich würde parallel einen "Erfolgs-Launcher" laufen lassen.

    Bevor Run(Irgendeine.exe) gestartet wird, übergibst du an den Launcher den Prozeßnamen, der existiert, wenn die Datei erfolgreich gestartet wurde. Im Hintergrund pollt der Launcher dann etwa alle 500ms und prüft die Prozess-List. Wurde ein Prozeß aus seiner Überwachungsliste gefunden, wird Erfolgs-Counter um 1 erhöht und der Eintrag aus der Überwachungsliste entfernt (optional zusätzlich Logeintrag).

    Nach Start des letzten Programms, wird ein MaxWait-Befehl übergeben (Einfach einen Fantasie-Dateinamen übergeben, z.B. "MaxWait.process") und bei Erscheinen dieses Dateinamens in der Überwachungsliste den Namen sofort entfernen und ein TimeOut laufen lassen. Ist nach Ablauf des TimeOut die Liste noch nicht leer, die Namen der nicht (erfolgreich) gestarteten Prozesse ausgeben.

  • Eine Funktion mehrfach starten

    • BugFix
    • 25. April 2019 um 11:52

    Du teilst die Anzahl der Listeneinträge durch die gewünschte Anzahl an Instanzen. Es ist eher unwahrscheinlich, dass dieses ein ganzzahliger Wert wird. Also musst du dich entscheiden, ob du die nächstgrößere oder -kleinere Ganzzahl verwenden möchtest (Ceiling / Floor). Die Anzahl der möglichen Prozesse brauchst du nicht in einer Schleife abarbeiten - das ergibt sich von selbst. Nehmen wir an du hast das Verarbeitungsskript kompiliert als "work.exe". Parameter-Aufruf wäre dann z.B. so:

    ShellExecute("work.exe", '"param string 1" "param string 2" "param string n"')

    In deinem Aufrufskript gehst du so vor:

    Code
    Local $iInstances = ....
    Local $aList = FileReadToArray($ComputerList)
    Local $iLines = @extended
    Local $iLinesPerInstance = Ceiling($iLines / $iInstances)
    Local $sExe = "PFAD\ZUR\KOMPILIERTEN\DATEI"
    Local $sParam = ''
    Local $iParamCount = 0
    
    For $i = 0 To UBound($aList) -1
        If $iParamCount = $iLinesPerInstance Or $i = UBound($aList) -1 Then
            ShellExecute($sExe, $sParam)
            $iParamCount = 0
            $sParam = ''
        Else
            $iParamCount += 1
            $sParam &= StringFormat('%s "%s"', $sParam, $aList[$i])
        EndIf
    Next
    Alles anzeigen

    Das Verarbeitungsskript sollte kein Problem sein. Siehe hier.

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2019.03.24)

    • BugFix
    • 25. April 2019 um 11:23

    _WinAPI_RedrawWindow()

    Die Erklärung zu den $iFlags könnte m. E. etwas konkreter sein (mehr an den Inhalt von MSDN angelehnt), dann sind die Verwendungsmöglichkeiten etwas eindeutiger.

    Vor allem fehlen mir in der AutoIt-Hilfe (sowohl deutsch als auch englisch) die Gruppierungen der Flags und deren Beschreibung. Hier mal meine direkte Übersetzung aus MSDN. Evtl. ist es ja sinnvoll etwas zu übernehmen:

    Python
     ----------------------------------------------------------------------------------------------------
    BOOL RedrawWindow(
      HWND       hWnd,
      const RECT *lprcUpdate,
      HRGN       hrgnUpdate,
      UINT       flags
    );
    
    ++++ flags ++++
    ----------------------------------------------------------------------------------------------------
    # Die folgenden Flags werden zum Annullieren des Fensters verwendet.
    ----------------------------------------------------------------------------------------------------
    RDW_ERASE (0x0004)
    Bewirkt, dass das Fenster eine WM_ERASEBKGND-Nachricht empfängt, wenn das Fenster neu gezeichnet wird. Das Flag RDW_INVALIDATE muss ebenfalls angegeben werden. Andernfalls hat RDW_ERASE keine Auswirkungen.
    
    RDW_FRAME (0x0400)
    Bewirkt, dass ein Teil des Nicht-Client-Bereichs des Fensters, der den Aktualisierungsbereich schneidet, eine WM_NCPAINT-Nachricht empfängt. Das Flag RDW_INVALIDATE muss ebenfalls angegeben werden. Andernfalls hat RDW_FRAME keine Auswirkungen. Die WM_NCPAINT-Nachricht wird normalerweise nicht während der Ausführung von RedrawWindow gesendet, es sei denn, RDW_UPDATENOW oder RDW_ERASENOW ist angegeben.
    
    RDW_INTERNALPAINT (0x0002)
    Bewirkt, dass eine WM_PAINT-Nachricht an das Fenster gesendet wird, unabhängig davon, ob ein Teil des Fensters ungültig ist.
    
    RDW_INVALIDATE (0x0001)
    Ungültig für lprcUpdate oder hrgnUpdate (nur eines darf nicht NULL sein). Wenn beide NULL sind, wird das gesamte Fenster ungültig gemacht.
    
    ----------------------------------------------------------------------------------------------------
    # Die folgenden Flags werden verwendet, um das Fenster zu überprüfen.
    ----------------------------------------------------------------------------------------------------
    RDW_NOERASE (0x0020)
    Unterdrückt alle ausstehenden WM_ERASEBKGND-Nachrichten.
    
    RDW_NOFRAME (0x0800)
    Unterdrückt alle ausstehenden WM_NCPAINT-Nachrichten. Dieses Flag muss mit RDW_VALIDATE verwendet werden und wird normalerweise mit RDW_NOCHILDREN verwendet. RDW_NOFRAME sollte mit Vorsicht verwendet werden, da dies dazu führen kann, dass Teile eines Fensters falsch gezeichnet werden.
    
    RDW_NOINTERNALPAINT (0x0010)
    Unterdrückt alle anstehenden internen WM_PAINT-Nachrichten. Dieses Flag wirkt sich nicht auf WM_PAINT-Nachrichten aus, die aus einem Nicht-NULL-Aktualisierungsbereich stammen.
    
    RDW_VALIDATE (0x0008)
    Überprüft lprcUpdate oder hrgnUpdate (nur eines darf nicht NULL sein). Wenn beide NULL sind, wird das gesamte Fenster überprüft. Dieses Flag wirkt sich nicht auf interne WM_PAINT-Nachrichten aus.
    
    ----------------------------------------------------------------------------------------------------
    # Die folgenden Flags steuern, wann ein Neuzeichnen erfolgt. RedrawWindow aktualisiert nur dann, wenn eines dieser Flags angegeben wird.
    ----------------------------------------------------------------------------------------------------
    RDW_ERASENOW (0x0200)
    Bewirkt, dass die betroffenen Fenster (wie durch die Flags RDW_ALLCHILDREN und RDW_NOCHILDREN angegeben) ggf. WM_NCPAINT- und WM_ERASEBKGND-Nachrichten erhalten, bevor die Funktion zurückkehrt. WM_PAINT-Nachrichten werden zur normalen Zeit empfangen.
    
    RDW_UPDATENOW (0x0100)
    Bewirkt, dass die betroffenen Fenster (wie durch die Flags RDW_ALLCHILDREN und RDW_NOCHILDREN angegeben) ggf. WM_NCPAINT-, WM_ERASEBKGND- und WM_PAINT-Nachrichten erhalten, bevor die Funktion zurückkehrt.
    
    ----------------------------------------------------------------------------------------------------
    # Standardmäßig hängen die von RedrawWindow betroffenen Fenster davon ab, ob das angegebene Fenster den WS_CLIPCHILDREN-Stil hat.
    # Untergeordnete Fenster, die nicht im WS_CLIPCHILDREN-Stil sind, sind davon nicht betroffen.
    # Nicht-WS_CLIPCHILDREN Fenster werden rekursiv validiert oder für ungültig erklärt, bis ein WS_CLIPCHILDREN-Fenster gefunden wird.
    # Die folgenden Flags steuern, welche Fenster von der RedrawWindow-Funktion betroffen sind.
    ----------------------------------------------------------------------------------------------------
    RDW_ALLCHILDREN (0x0080)
    Schließt ggf. untergeordnete Fenster in das Neuzeichnen ein.
    
    RDW_NOCHILDREN (0x0040)
    Schließt ggf. untergeordnete Fenster vom Neuzeichnen aus.
    ----------------------------------------------------------------------------------------------------
    Alles anzeigen
  • Windows-Taskbar (Shell_TrayWnd): Was ist Child, was Parent - wer gehört zu wem

    • BugFix
    • 25. April 2019 um 10:33

    Das Zugreifen auf Elemente in der Taskbar ist nicht so simpel, wie man denken mag. Ich dachte: Handle der Shell_TrayWnd abfragen - EnumChildWindows bringt die Subfenster - fertig.

    Das ist aber nur die halbe Wahrheit, denn wenn man nach der ChildEnumertion anschliessend das Parent abfragt, ist dies nur z.T. das Shell_TrayWnd. Teilweise sind die enthaltenen Fenster untereinander verbunden. Mit dem folgenden Skript bekommt man die tatsächliche Zuordnung:

    Python
    #include <WinAPI.au3>
    #include <WinAPISys.au3>
    
    Local $hTrayWnd = WinGetHandle('[CLASS:Shell_TrayWnd]')
    Local $aChildren = _WinAPI_EnumChildWindows($hTrayWnd, False)
    Local $iInstance = 1, $hParent, $sOutput = StringFormat('\n! %s\t[CLASS:Shell_TrayWnd] --> EnumChildWindows:\n\n', $hTrayWnd)
    If IsArray($aChildren) Then
        For $i = 1 To $aChildren[0][0]
            If $aChildren[$i-1][1] = $aChildren[$i][1] Then
                $iInstance += 1
            Else
                $iInstance = 1
            EndIf
            $hParent = _WinAPI_GetParent($aChildren[$i][0])
            $sOutput &= StringFormat('> %s\t[CLASS:%s; INSTANCE:%s]\n- \t\tPARENT:\t%s [CLASS:%s]\n\n', $aChildren[$i][0], _
                        $aChildren[$i][1], $iInstance, $hParent, _WinAPI_GetClassName($hParent))
        Next
        ConsoleWrite($sOutput)
    EndIf
    Alles anzeigen

    TryWnd_childs.PNG

  • Eine Funktion mehrfach starten

    • BugFix
    • 25. April 2019 um 09:40

    Um andere Instanzen mit Inhalt zu versorgen, musst du diese (kompilierte Datei, nicht Funktion) mit Parametern aufrufen.

    Ich würde so vorgehen:

    - Skript 1 (Aufrufskript):

    Liest Textdatei in Array, jede Zeile ein Eintrag. Iteriert durch das Array und fügt Parameterstrings zusammen: "Zeile 1" & "SPACE" & "Zeile 2" & ... - Sind 10 Parameter zusammengefügt wird das Verarbeitungsskript aufgerufen und der Parameterstring mit übergeben. Intern zurücksetzen Parameterstring und weiter durch Array iterieren usw. usf.

    - Skript 2 (Verarbeitungsskript):

    Arbeitet das Parameterarray ($CMDLINE) ab, mit dem von dir vorgesehenen Code.

  • Frage zu CUI EXE Fenster

    • BugFix
    • 25. April 2019 um 08:37

    Was bitte soll ein CUI Fenster sein?

    Eine konsolenbasierte Anwendung verzichtet i. A. auf Fenster (das ist der Sinn einer CUI). Du kannst natürlich Fenster (GUI) auch hierbei erstellen und anzeigen, aber das ist vom Handling wie sonst auch.

  • MSSql Abfrage Datum vergleich

    • BugFix
    • 8. April 2019 um 09:10
    Zitat von Springstil

    Aber ich weiß nicht genau wie ich VOR dem Where den Order by befehl ausführen soll.

    Gar nicht. Sortierung wird immer auf die Ergebnisse einer Abfrage angewendet. Wenn du also aus einer Teilmenge auswählen willst, musst du diese Teilmenge durch ein SubQuery erzeugen (wurde schon drauf hingewiesen).

    Oder, wenn das zu kompliziert wird, kannst du die Teilergebnisse auch in einer temporären Tabelle speichern und diese für die Folgeabfragen nutzen. Falls Der SQL-Dialekt Batch-Queries anbietet (nutze ich z.B. in Firebird SQL), werden diese temporären Tabellen auch nur im RAM direkt aus einer Abfrage erzeugt und bedürfen keiner weiteren Deklaration.

  • Frage zur Benennung von *.api und *.properties Dateien

    • BugFix
    • 30. März 2019 um 19:45
    Zitat von ISI360

    Von "alles in die user.calltips" bin ich nicht so der Freund. Ich hab lieber für jede UDF ne eigene Datei.

    Du kannst für alles eigene Dateien erstellen und einfach in der SciTEUser.properties einfügen: import my.special.abbrev

    Ich handhabe das so, dass ich die entsprechenden Dateien an einem beliebigen Ort gespeichert habe. Um aber kein Pfadwirrwarr beim import zu haben, sind die Dateien per Hardlink auch im Pfad C:\Users\USER\AppData\Local\AutoIt v3\SciTE angelegt. Dort sucht ScITE standardmäßig - das import benötigt somit keine weitere Pfadangabe.

  • Keylogger für ein GDI Input

    • BugFix
    • 29. März 2019 um 14:08
    Zitat von xSunLighTx3

    Bezüglich zum GDI Input ist mir leider bisher keine verwendbare Alternative eingefallen.

    Wenn ich richtig verstanden habe, wolltest du dass der User einen Hotkey erstellen kann. Dazu brauchst du nicht wirklich die Tasten abfragen. Hier mal ein Lösungsansatz auf ganz triviale Art:

    Auswahl Sondertaste per Button, Zeichentaste per Eingabe ins Inputfeld.

    Python
    Global $hGui = GUICreate("HotKey Creator")
    Global Enum $gi_SHIFT, $gi_CTRL, $gi_ALT, $gi_WIN, $iCount
    Global $ga_BaseKey[][4] = [[0,'+','SHIFT',False],[0,'^','CTRL',False],[0,'!','ALT',False],[0,'#','WIN',False]]
    Global $g_ColorUnselected = 0xE3E3E3, $g_ColorSelected = 0xFAFAFA
    Global $x = 10, $y = 10
    For $i = 0 To $iCount -1
        $ga_BaseKey[$i][0] = GUICtrlCreateButton($ga_BaseKey[$i][2], $x, $y, 40, 22)
        GUICtrlSetBkColor(-1, $g_ColorUnselected)
        $x = $i < $iCount ? $x +50 : $x +10
    Next
    Global $cAddKey = GUICtrlCreateInput("", $x, $y, 80, 22)
    Global $nMsg, $indexCtrl, $sRead
    
    GUISetState()
    
    While True
        $nMsg = GUIGetMsg()
        $indexCtrl = -1
        For $i = 0 To UBound($ga_BaseKey) -1
            If $ga_BaseKey[$i][0] = $nMsg Then
                $indexCtrl = $i
                ExitLoop
            EndIf
        Next
        Select
            Case $nMsg = -3
                Exit
            Case $indexCtrl > -1
                $sRead = GUICtrlRead($cAddKey)
                $ga_BaseKey[$indexCtrl][3] = Not $ga_BaseKey[$indexCtrl][3]
                If $ga_BaseKey[$indexCtrl][3] Then
                    GUICtrlSetBkColor($ga_BaseKey[$indexCtrl][0], $g_ColorSelected)
                    If Not StringInStr($sRead, $ga_BaseKey[$indexCtrl][1]) Then GUICtrlSetData($cAddKey, $ga_BaseKey[$indexCtrl][1] & $sRead)
                Else
                    GUICtrlSetBkColor($ga_BaseKey[$indexCtrl][0], $g_ColorUnselected)
                    If StringInStr($sRead, $ga_BaseKey[$indexCtrl][1]) Then GUICtrlSetData($cAddKey, StringReplace($sRead, $ga_BaseKey[$indexCtrl][1], ''))
                EndIf
        EndSelect
    WEnd
    Alles anzeigen
  • Keylogger für ein GDI Input

    • BugFix
    • 27. März 2019 um 16:10
    Zitat von xSunLighTx3

    Das Problem ist jedoch, dass die Microsoft Funktion "KBDLLHOOKSTRUCT"

    ausschließlich "low-level" input events erkennt.

    vkCode für SHIFT: left=0xA0, right=0xA1, für ALT=0xA4

    Die Struktur speichert "flags" - und diese repräsentieren das Release der entsprechenden Tasten: 0x80= UP for 'normal' keys and left pairs, 0x81= UP for right pairs

    Deine Konstruktion ist natürlich wenig effizient mit den If-Statements. Das kannst du alles mit dem Hook abwickeln. Aber hier stoßen wir an die Grenzen unseres Supports: Keylogging ist nunmal nichts, was wir unterstützen wollen, die Möglichkeit des mIßbrauchs ist zu groß.

  • ComboBox dynamisch erweitern und abfragen

    • BugFix
    • 25. März 2019 um 11:35

    Hier mal nur als Bsp., wie es funktioniert. Das Drumherum kannst du dann anpassen:

    Python
    Global $hGui = GUICreate('Test')
    Global $cCombo = GUICtrlCreateCombo('', 10, 10, 200)
    Global $sCombo = 'Val_1|Val_2|Val_3|Val_4'
    GUICtrlSetData($cCombo, $sCombo)
    Global $cAdd = GUICtrlCreateButton('Neuen Eintrag speichern', 220, 10, 150, 22)
    
    GUISetState()
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $cAdd
                $sCombo &= "|" & GUICtrlRead($cCombo)
                GUICtrlSetData($cCombo, "|" & $sCombo)
        EndSwitch
    WEnd
    Alles anzeigen
  • Problem mit DllCall (aaeonEAPI.dll)

    • BugFix
    • 21. März 2019 um 17:30
    Zitat von Homer J. S.

    Laut Dokumentation ist das eine “__INOUT“ Funktion und daher habe ich “by reference“ angegeben, aber die Bufferlänge bleibt bei meiner Vorgabe.

    Häufig verwenden Dll folgenden Mechanismus: Aufruf der Dll mit allen Parametern und als Bufferlänge null (Wert "0" oder "Null"), dann wird die Bufferlänge auf den erforderlichen Wert gesetzt. Den Wert verwende ich dann um meinen Buffer auf die richtige Länge zu setzen und rufe dann die Dll korrekt auf. Ggf. muss zur Länge 1 addiert werden, falls der Buffer einen null-terminierten String halten soll (sowas steht in der Doku).

  • dbf einlesen

    • BugFix
    • 20. März 2019 um 12:58

    Ich habe mal die relevanten Teile aus einem Projekt von mir herauskopiert.

    Bitte beachte, dort sind teilweise Bezüge auf Globale Variablen und GUI-Elemente, die nur in meinem Projekt existieren und für die Funktionalität selbst keine Bedeutung haben. Wirst du schnell sehen und kannst das entsprechend auskommentieren.

    Wenn du nicht klar kommst, melde dich wieder.

    Python
    Global Const $tagField = "char name[11];" & _          ;  0-10   |  11 bytes         | field name
            "char type;" & _                            ;  11     |  1 byte           | field type in ASCII
            "uint memadress;" & _                        ;  12-15  |  32 bit number    | field data address
            "byte len;" & _                                ;  16     |  1 byte           | field length
            "byte deccount;" & _                        ;  17     |  1 byte           | field decimal count
            "byte reserved[14];"                         ;  18-31  |  14 bytes         | reserved bytes
    Global Const $tagFileHeader = "byte ver;" & _       ;  0      |  1 byte           | dBASE III version number
            "byte date[3];" & _                            ;  1-3    |  3 bytes          | date of last update
            "uint reccount;" & _                        ;  4-7    |  32 bit number    | number of records in data file
            "ushort headerlength;" & _                    ;  8-9    |  16 bit number    | length of header structure
            "ushort reclength;" & _                        ;  10-11  |  16 bit number    | length of the record
            "byte reserved[20];"                         ;  12-31  |  20 bytes         | reserved bytes
    ;~                             $tagField & _           ;  32-n   |  32 bytes each    | field descriptor array
    ;~                             "byte terminate;"       ;  n+1    |  1 byte           | 0DH as the field terminator
    Global $Header = DllStructCreate($tagFileHeader)
    
    Func _LoadDBF()
        Local $DBFFile = _WinAPI_CreateFile(GUICtrlRead($inPathDBF) , 2, 2, 2)
        Local $ReadChars
        If _WinAPI_ReadFile($DBFFile, DllStructGetPtr($Header), DllStructGetSize($Header), $ReadChars) Then
            If DllStructGetData($Header, "ver") <> 3 Then ; Version muss
                MsgBox(16, 'Error', "No supportet dbase format (only dbase 3 without .DBT-files)")
                _WinAPI_CloseHandle($DBFFile)
                Exit
            EndIf
            ; $tagField erstellen
            Local $FieldDescriptor = DllStructCreate($tagField)
            ; Infos aus Header auslesen
            Local $HeaderLength = DllStructGetData($Header, "headerlength")
            Local $FieldsCount = Floor(($HeaderLength - DllStructGetSize($Header) - 1) / DllStructGetSize($FieldDescriptor))
            Local $RecordLength = DllStructGetData($Header, "reclength")
            Local $RecordsCount = DllStructGetData($Header, "reccount")
            ; Zahl der Felder: (Headergröße- Dateiheadergröße- terminator-byte) / Feldbeschreibungs-größe
            If $FieldsCount = 0 Then
                MsgBox(16, '', "No fields")
            Else
                Global $DatabaseArray[$RecordsCount + 1][$FieldsCount]
                Global $databaseFieldInfos[$FieldsCount][5]
                For $i = 1 To $FieldsCount
                    _WinAPI_ReadFile($DBFFile, DllStructGetPtr($FieldDescriptor), DllStructGetSize($FieldDescriptor), $ReadChars)
                    $DatabaseArray[0][$i - 1] = DllStructGetData($FieldDescriptor, "name")
                    For $s = 0 To 4
                        $databaseFieldInfos[$i - 1][$s] = DllStructGetData($FieldDescriptor, $s + 1)
                    Next
                Next
                Local $CHECKREAD = DllStructCreate("byte terminate")
                _WinAPI_ReadFile($DBFFile, DllStructGetPtr($CHECKREAD), 1, $ReadChars)
                If DllStructGetData($CHECKREAD, 1) == 0x0D Then
                    Local $RecordStruct = _CreateRecordStruct($databaseFieldInfos)
                    GUICtrlSetState($Progress1, $GUI_SHOW)
                    GUICtrlSetData($lbMsg, 'Daten werden konvertiert')
                    $iStep = 100/$RecordsCount
                    For $i = 1 To $RecordsCount
                        $iProgress += $iStep
                        GUICtrlSetData($Progress1, $iProgress)
                        _WinAPI_ReadFile($DBFFile, DllStructGetPtr($RecordStruct), DllStructGetSize($RecordStruct), $ReadChars)
                        If $ReadChars = 0 Then
                            ; keine Felder mehr (Fehler)
                            ReDim $DatabaseArray[$i][$FieldsCount]
                            ExitLoop
                        EndIf
                        For $j = 1 To $FieldsCount
                            $DatabaseArray[$i][$j - 1] = DllStructGetData($RecordStruct, "field" & $j)
                            #Region Datentypen konvertieren
                            Switch $databaseFieldInfos[$j - 1][1]
                                Case "C" ; characters: nothing
                                    If StringInStr($DatabaseArray[$i][$j - 1], "00:00:00", 1) Then
                                        $DatabaseArray[$i][$j - 1] = StringStripWS(StringRegExpReplace($DatabaseArray[$i][$j - 1], _
                                            "(\d\d)(\.)(\d\d)(\.)(\d{4})(\s00:00:00)", "$1$3$5"), 3)
                                    Else
                                        $DatabaseArray[$i][$j - 1] = OemToChar($DatabaseArray[$i][$j - 1])
                                        If StringLen($DatabaseArray[$i][$j - 1]) > 30 Then _
                                            $DatabaseArray[$i][$j - 1] = StringLeft($DatabaseArray[$i][$j - 1], 30)
                                    EndIf
                                Case "N" ; numeric
                                    If StringInStr($DatabaseArray[$i][$j - 1], '.') Then
                                        $DatabaseArray[$i][$j - 1] = StringTrimRight(StringStripWS(StringReplace($DatabaseArray[$i][$j - 1], '.', ','), 1), 2)
                                    Else
                                        $DatabaseArray[$i][$j - 1] = Number($DatabaseArray[$i][$j - 1])
                                    EndIf
                                Case "L"
                                    Switch $DatabaseArray[$i][$j - 1]
                                        Case "?"
                                            $DatabaseArray[$i][$j - 1] = "N/A"
                                        Case 'Y', 'y', 'T', 't'
                                            $DatabaseArray[$i][$j - 1] = True
                                        Case 'N', 'n', 'F', 'f'
                                            $DatabaseArray[$i][$j - 1] = False
                                    EndSwitch
                                Case "D"
                                    $DatabaseArray[$i][$j - 1] = StringRegExpReplace($DatabaseArray[$i][$j - 1], "\A(\d{4})(\d\d)(\d\d)\Z", "$1/$2/$3")
                                Case "M" ; not supportet
                            EndSwitch
                            #EndRegion Datentypen konvertieren
                        Next
                        Sleep(10)
                    Next
                Else
                    MsgBox(0, 'Error', "Wrong fielddescriptortable")
                EndIf
            EndIf
            _WinAPI_CloseHandle($DBFFile)
        EndIf
        ; Spalten infos hizufügen zu Feld-Info array
    ;~     ReDim $databaseFieldInfos[UBound($databaseFieldInfos)+1][5]
    ;~     $databaseFieldInfos[UBound($databaseFieldInfos)-1][0] = "[[ NAME ]]"
    ;~     $databaseFieldInfos[UBound($databaseFieldInfos)-1][1] = "[[ TYP ]]"
    ;~     $databaseFieldInfos[UBound($databaseFieldInfos)-1][2] = "[[ ADRESSE ??? ]]"
    ;~     $databaseFieldInfos[UBound($databaseFieldInfos)-1][3] = "[[ Byte-Länge ]]"
    ;~     $databaseFieldInfos[UBound($databaseFieldInfos)-1][4] = "[[ Dezimalstellen ]]"
        GUICtrlSetData($Progress1, 100)
        Sleep(1000)
        GUICtrlSetData($inReFrom, _FormatDateGE($DatabaseArray[1][3]))
        GUICtrlSetData($inReTo, _FormatDateGE($DatabaseArray[UBound($DatabaseArray)-1][3]))
        GUICtrlSetData($lbMsg, 'Konvertierung abgeschlossen - Bereit zum Export')
        Sleep(500)
        GUICtrlSetData($Progress1, 0)
    EndFunc
    
    
    Func _FormatDateGE($sDate)
        Return StringRegExpReplace($sDate, '(\d{2})(\d{2})(\d{4})', '\1.\2.\3')
    EndFunc
    
    
    Func _CreateRecordStruct(ByRef $databaseFieldInfos)
        Local $sText = "char deleted;"
        For $i = 1 To UBound($databaseFieldInfos)
            $sText &= "char field" & $i & "[" & $databaseFieldInfos[$i - 1][3] & "];"
        Next
        Return DllStructCreate($sText)
    EndFunc   ;==>_CreateRecordStruct
    
    ;===============================================================================
    ; Name:             OemToChar
    ; Description:      Wandelt einen ASCII- in einen ANSI-String
    ; Parameter(s):     $szSrc = String der umgewandelt werden soll
    ; Requirement(s):   keine
    ; Return Value(s):  bei Erfolg: umgewandelter String
    ;                   bei Fehler: "" und @error = 1
    ; Author(s):        bernd670
    ;===============================================================================
    Func OemToChar($szSrc)
        ;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
        Local $placeholder
        For $i = 0 To StringLen($szSrc)
            $placeholder &= "  "
        Next
        Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str",$placeholder)
        If IsArray($lRetVal) And $lRetVal[0] = 1 Then
            Return SetError(0,0,$lRetVal[2])
        EndIf
    
        Return SetError(1,0,"")
    EndFunc   ;==>OemToChar
    Alles anzeigen
  • [gelöst] Netzwerk-Profis gefragt

    • BugFix
    • 18. März 2019 um 11:37

    Protokolliere mal alle WLAN-Events (ist standardmäßig aus), vielleicht bringt das mehr Infos.

    fritz_evt.PNG

  • Allgemeine Frage zu FreeBasic, FreePascal, PureBasic usw.

    • BugFix
    • 15. März 2019 um 19:26

    Ich kann dir eine recht junge Sprache anbieten: nim

    Ich beschäftige mich gerade damit und bin schwer angetan. Die Sprache vereint in sich all die Dinge, die man in diversen Sprachen toll findet. Syntaktisch mit viel Sugar ausgestattet. :D

  • String von nicht Zahlen säubern und formartieren

    • BugFix
    • 13. März 2019 um 10:50
    Zitat von ruby

    Oder geht das auch?

    Klar, ich hatte nur anhand deines Eintrags im Post das Pattern erstellt und nicht die Datei geladen:

    Python
    Local $s = _
    "  0 0 0 An explosion of lava ... by D. Egnor" & @CRLF & _
    "60 60 60" & @CRLF & _
    "64 60 60" & @CRLF & _
    "72 60 60" & @CRLF & _
    "76 56 56" & @CRLF & _
    "100 48 48" & @CRLF & _
    "108 48 48" & @CRLF & _
    "112 44 44" & @CRLF & _
    "212 12 12" & @CRLF & _
    "224 8 8" & @CRLF & _
    "232 8 8" & @CRLF & _
    "236 4 4" & @CRLF & _
    "244 4 4" & @CRLF & _
    "252 12 0" & @CRLF & _
    "252 20 0" & @CRLF & _
    "252 28 0" & @CRLF & _
    "160 0 0" & @CRLF & _
    "156 4 4" & @CRLF & _
    "152 4 4" & @CRLF & _
    "148 8 8" & @CRLF & _
    "140 12 12" & @CRLF & _
    "104 32 32" & @CRLF & _
    "100 36 36" & @CRLF & _
    "100 36 36" & @CRLF & _
    "96 40 40" & @CRLF & _
    "88 44 44" & @CRLF & _
    "60 60 60" & @CRLF & _
    "60 60 60"
    
    Local $sResult = StringRegExpReplace($s, '(?m)\s*(\d+)\s+(\d+)\s+(\d+)(\D*)', '\1 \2 \3' & @CRLF)
    ConsoleWrite($sResult & @CRLF)
    Alles anzeigen

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™