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

  • WinAPICom.au3 Fehler $sProgID: possibly used before declaration

    • BugFix
    • 26. April 2018 um 15:32

    Ahh, da hatte ich deinen Post mißverstanden. Ich dachte du hast Probleme mit der Funktion _WinAPI_CLSIDFromProgID.

    Es wäre eindeutiger, wenn du geschrieben hättest:

    ...obwohl ich die Funktion _WinAPI_CLSIDFromProgID in meinem Skript nicht anwende, erhalte ich dazu eine Fehlermeldung.

    Die Ursache für die Fehlermeldung ist unklar. Wenn die UDF nicht inkludiert ist, kommt als Fehler: Funktion unbekannt. Hier wird aber ein Funktionsparameter bemängelt, der perse bei Funktionserstellung deklariert ist. Sehr unklar.

  • WinAPICom.au3 Fehler $sProgID: possibly used before declaration

    • BugFix
    • 26. April 2018 um 12:10
    Zitat von gmmg

    Muss die $sProgID vorher deklariert werden?

    ??

    Das ist ein erforderlicher Parameter, der zwingend übergeben werden muss. Sagt doch schon der Funktionsname: CLSIDFromProgID - Die ProgID muss also bekannt sein und übergeben werden.

    Zitat von gmmg

    In der vorheriogen Version lief alles ohne ersichtliche Fehler durch.

    Glaub ich nicht. Wenn ProgID nicht übergeben wird (oder die entsprechende Variable ohne Inhalt ist) funktioniert die Funktion nicht.

  • SQLite - Möglichkeit Abfrage beschleunigen?

    • BugFix
    • 24. April 2018 um 10:11
    Zitat von Bitnugger

    PS: Den Fehler in der Funktion __TableClearAll hast du sicher schon bemerkt...

    War ein Aufmerksamkeitstest... ;)

    Den Gedanken alles in eine Funktion zu packen hatte ich am Anfang auch. Habe mich dann aber dagegen entschieden. Ist persönlicher Geschmack. Wenn möglich vermeide ich Funktionen mit einer Vielzahl Parameter und wrappe lieber in mehrere kurze Aufrufe.

    Da habe ich noch einen Vorschlag, um die Parameterübergabe zu minimieren. Da Tabellen- und Feldname (zumindest in dieser Anwendungsform) bei jedem Aufruf identisch sind, ist es sinnvoll diese Beim erstmaligen Aufruf der Funktion zu übergeben. Danach kann man stattdessen -1 verwenden.

    AutoIt
    Func __SQLite_SelectWord($_hSQL, $_sTable = -1, $_sField = -1, $_sValue = '', $_iSelect = 0, $_bSensitive = False, $_sDelim = @CRLF)
        Local Static $sTable = Null, $sField = Null
        $sTable = $_sTable <> -1 ? $_sTable : $sTable
        $sField = $_sField <> -1 ? $_sField : $sField
        If $sTable = Null Or $sField = Null Then Return SetError($SQLITE_ERROR,0,'') 
        Local $hTimer = TimerInit(), _
            $_sSelect = $_iSelect = -1 ? '%s%%' : $_iSelect = 1 ? '%%%s' : '%%%s%%', _
            $sResult, $aResult, $iRows, $iColumns, $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '"&$_sSelect&"';", $sField, $sTable, $sField, $_sValue)
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & True)
        Local $iRval = _SQLite_GetTable($_hSQL, $sSQL, $aResult, $iRows, $iColumns), $iError = @error, $iExtended = @extended
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & False)
        If $DEBUG Then
            If $iRval = $SQLITE_OK Then $sResult = _ArrayToString($aResult, $_sDelim, 2)
            __PrintRes($sResult, $_iSelect, $_bSensitive, $iRows, $iError, $iExtended, TimerDiff($hTimer))
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, $sResult) : SetError($iError, $iExtended, $iRval)
        Else
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, _ArrayToString($aResult, $_sDelim, 2)) : SetError($iError, $iExtended, $iRval)
        EndIf
    EndFunc   ;==>__SQLite_SelectWord
    Alles anzeigen
  • SQLite - Möglichkeit Abfrage beschleunigen?

    • BugFix
    • 23. April 2018 um 15:46
    Zitat von AspirinJunkie

    in dem du die Datenbank inmemory machst oder ähnliches.

    Ja, das hats gebracht!

    Ich erstelle beim Skriptstart eine leere :memory: DB und binde die Wort-DB mit ATTACH an. Dann schaufele ich die Daten in die memory-DB (ca. 1,5 s). Das Abfragen aus der memory-DB dauert dann etwa 1 s oder weniger. :thumbup:

    AutoIt
    #include <SQLite.au3>
    
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
    
    ; memory DB
    Global $hSQL = _SQLite_Open()
    _SQLite_Exec($hSQL, "CREATE TABLE dictionary (word TEXT);")
    
    ; file DB anbinden
    Global $sAlias = "fileDB"
    _SQLite_Exec($hSQL, StringFormat("ATTACH DATABASE '%s' AS %s", @ScriptDir & "\germandict.db", $sAlias))
    
    ; INSERT from file TO memory DB
    Local $iTimer = TimerInit()
    _SQLite_Exec($hSQL, "INSERT INTO dictionary SELECT * FROM fileDB.dictionary;")
    ;~ ConsoleWrite("Time INSERT INTO: " & TimerDiff($iTimer) & @CRLF)  ; ~ 1,5 s
    
    
    Local $iTimer = TimerInit()
    ;~ $res = __SelectStartsWith(-1, 'dictionary', 'word', 'taxi')
    ;~ $res = __SelectEndsWith(-1, 'dictionary', 'word', 'taxi')
    $res = __SelectContaining(-1, 'dictionary', 'word', 'taxi')
    ConsoleWrite('Count: ' & @extended & @LF)
    ConsoleWrite('Time: ' & TimerDiff($iTimer) & @CRLF)  ; < 1 s
    ConsoleWrite("$res:" & @LF & $res & @LF)
    
    
    Func __SelectStartsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%s%%';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectEndsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectContaining($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s%%';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectFromWord($_hSQL, $_sSQL, $_sDelim=@CRLF)
        Local $aQuery, $hQuery, $sResult = '', $nRes = 0
        _SQlite_Query($_hSQL, $_sSQL, $hQuery)
        While _SQLite_FetchData($hQuery, $aQuery, False, False) = $SQLITE_OK
            $sResult &= $aQuery[0] & $_sDelim
            $nRes += 1
        WEnd
        _SQLite_QueryFinalize($hQuery)
        $sResult = $nRes > 0 ? StringTrimRight($sResult, StringLen($_sDelim)) : $sResult
        Return SetError(0,$nRes,$sResult)
    EndFunc
    
    Func __TableClearAll($_hSQL, $_sTable)
        Local $sSQL = StringFormat("FROM %s DELETE;", $_sTable)
        _SQLite_Exec($_hSQL, $sSQL)
    EndFunc
    
    
    _SQLite_Close($hSQL)
    _SQLite_Shutdown()
    Alles anzeigen
  • SQLite - Möglichkeit Abfrage beschleunigen?

    • BugFix
    • 23. April 2018 um 11:41

    Hi,

    ich habe mir Free German Dictionary heruntergeladen und daraus eine SQLite Datenbank erstellt germandict.db (Tabelle: dictionary, Feld: word).

    Die Datenbank möchte ich zum Überprüfen von Texten bzw. bei Teileingaben für Wortvorschläge nutzen. Dazu habe ich 3 Funktionen erstellt die per SELECT Statement auf Übereinstimmung am Wortanfang oder Wortende prüfen oder auf im Wort enthalten. Die Datenbank enthält ~1,9 Millionen Einträge und auf meinem Rechner dauert eine Abfrage dann ca. 3,5 s.

    Lässt sich das evtl. noch beschleunigen?

    Hier der Code, DB ist zu groß für den Anhang, DL hier:

    AutoIt
     #include <SQLite.au3>
    
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
    Global $hSQL = _SQLite_Open(@ScriptDir & "\germandict.db")
    
    Global $iTimer = TimerInit()
    ;~ $res = __SelectStartsWith(-1, 'dictionary', 'word', 'taxi')
    ;~ $res = __SelectEndsWith(-1, 'dictionary', 'word', 'taxi')
    $res = __SelectContaining(-1, 'dictionary', 'word', 'taxi')
    ConsoleWrite('Count: ' & @extended & @LF)
    ConsoleWrite('Time: ' & TimerDiff($iTimer) & @CRLF)
    ConsoleWrite("$res:" & @LF & $res & @LF)
    
    
    Func __SelectStartsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%s%%';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectEndsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectContaining($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
        Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s%%';", $_sField, $_sTable, $_sField, $_sValue)
        Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
        Return SetError(0,@extended,$sResult)
    EndFunc
    
    Func __SelectFromWord($_hSQL, $_sSQL, $_sDelim=@CRLF)
        Local $aQuery, $hQuery, $sResult = '', $nRes = 0
        _SQlite_Query($_hSQL, $_sSQL, $hQuery)
        While _SQLite_FetchData($hQuery, $aQuery, False, False) = $SQLITE_OK
            $sResult &= $aQuery[0] & $_sDelim
            $nRes += 1
        WEnd
        _SQLite_QueryFinalize($hQuery)
        $sResult = $nRes > 0 ? StringTrimRight($sResult, StringLen($_sDelim)) : $sResult
        Return SetError(0,$nRes,$sResult)
    EndFunc
    
    
    _SQLite_Close($hSQL)
    _SQLite_Shutdown()
    Alles anzeigen
  • kopiere alles aber überschreibe nichts

    • BugFix
    • 23. April 2018 um 10:40
    Zitat von Musashi

    Local $sCommand = "g:\2018\" & " " & "f:\sicherung\2018\" & " /ETA /MAXAGE:" & $von & " /MINAGE:" & $bis

    Da möchte ich euch wieder einmal StringFormat ans Herz legen, da kann man den Befehl genauso, wie in der Kommandozeile schreiben und hat nicht das Problem Leerzeichen oder Stringbegrenzer zu übersehen.

    AutoIt
    Local $sCommand = StringFormat("g:\2018\ f:\sicherung\2018\ /ETA /MAXAGE:%s /MINAGE:%s", $von, $bis)

    Das erleichtert die Lesbarkeit ungemein. :thumbup:

  • SciTE - Toggle Folding #Region

    • BugFix
    • 21. April 2018 um 13:59
    Zitat von borsTiHD

    Gibt es eine Möglichkeit dem Script beizubringen, das egal in welchem Zustand es sich gerade befindet, eingeklappt und bei erneutem druck wieder ausgeklappt wird?

    Nein. Mit IDM_TOGGLE_FOLDALL werden alle Faltungen aus-/ oder eingeklappt. Soweit ich das nachvollziehen konnte, gilt dabei das Mehrheitsprinzip: Sind bei Aufruf des Befehls mehr Regionen geschlossen als offen, dann werden alle geöffnet - und umgekehrt.

  • Elektromobil

    • BugFix
    • 21. April 2018 um 10:35
    Zitat von Peter S. Taler

    aber was bitte bringt ein Werbelink für Seniorenmobilität in einem Programierforum ?

    Das ist dem Ersteller absolut egal. Es geht dabei ausschliesslich darum, soviel wie möglich Leute zu erreichen. Kann ja durchaus sein, dass hier jemand im Umfeld eine ähnliche Fragestellung hat und nun motiviert ist bei diesem Händler evtl. zu kaufen --> Ziel erreicht.

    Die Alibi-Postings (sinnfreie Leichenschändungen) lassen eigentlich keinen anderen Schluß zu.

  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • BugFix
    • 20. April 2018 um 09:12

    Bitnugger

    Im Allgemeinen füge ich auch intensiv Fehlerbehandlung ein. Jedoch habe ich mir inzwischen angewöhnt, dies nur dann zu tun, wo auch tatsächlich ein Fehler auftreten kann.

    Beim Parsen des Outputs halte ich Fehler aufgrund des zu 100% matchenden Patterns für ausgeschlossen. Mindestens EIN User muss angemeldet sein und somit liefert die RegEx-Abfrage auch immer ein korrektes Ergebnis.

    Das Auslesen des Outputs live oder nach Beenden des Prozesses ist ein syntaktischer Unterschied, der ein paar Zeilen Code spart. Geht eher in die Richtung "wie man's gerne mag". Aber natürlich auch völlig korrekt.

  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • BugFix
    • 20. April 2018 um 08:53

    bernd670

    Ja, Danke - das fiel mir gestern auch ein, als ich gerade ins Bett gegangen war. ^^ (Im Bett kann man echt gut denken).

    Ich ändere das gleich mal im Post.

  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • BugFix
    • 20. April 2018 um 00:05

    Danke.

    Habe das jetzt so im Einsatz:

    AutoIt
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _QueryUser
    ; Description ...: Gibt Informationen über alle angemeldeten Benutzer zurück.
    ; Syntax ........: _QueryUser()
    ; Return values .: 2D-Array [[BENUTZERNAME, SITZUNGSNAME, ID, STATUS, LEERLAUF, ANMELDEZEIT]]
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _QueryUser()
        If @OSArch = 'X64' Then DllCall('kernel32.dll', 'boolean', 'Wow64EnableWow64FsRedirection', 'boolean', False)
        Local $iPID = Run(@WindowsDir & "\system32\query.exe user", "", @SW_HIDE, 2) ; 2=$STDOUT_CHILD
        Local $sOutput = ""
        While 1
            $sOutput &= StdoutRead($iPID)
            If @error Then ExitLoop
        WEnd
        If @OSArch = 'X64' Then DllCall('kernel32.dll', 'boolean', 'Wow64EnableWow64FsRedirection', 'boolean', True)
        Local $aRegEx = StringRegExp($sOutput, "[\s>](\S+)\s+(\S+)?\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+\s\S+)", 3)
        Local $aOut[UBound($aRegEx)/6][6]
        For $i = 0 To UBound($aOut) -1
            For $j = 0 To 5
                $aOut[$i][$j] = $aRegEx[$i*6+$j]
            Next
        Next
        Return $aOut
    EndFunc
    Alles anzeigen
  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • BugFix
    • 19. April 2018 um 18:15

    Von Hand kann ich problemlos in der Konsole "query user" eingeben und die entsprechenden Ergebnisse ablesen.

    Bei mir z.B.

    BugFix@BUGFIX-VAIO C:\Users\BugFix

    > query user

    BENUTZERNAME SITZUNGSNAME ID STATUS LEERLAUF ANMELDEZEIT

    >bugfix console 1 Aktiv Kein 19.04.2018 17:35

    Das wollte ich nun gern in ein Skript integrieren, jedoch ohne Erfolg.

    Hier meine Versuche - testet mal bitte, ob es bei euch funktioniert:

    AutoIt
    ; ======================================================================================= VARIANTE 1
    Local $iPID = Run(@ComSpec & " /c query user", @SystemDir, @SW_HIDE, 2) ; 2 = $STDOUT_CHILD
    ; auch getestet:
    ;~ Local $iPID = Run(@ComSpec & " /c 'query user'", @SystemDir, @SW_HIDE, 2)
    Local $sOutput = ""
    While 1
        $sOutput &= StdoutRead($iPID)
        If @error Then ExitLoop
    WEnd
    ConsoleWrite("@@ Debug line [ $sOutput ]" & @LF & $sOutput & @LF)
    
    
    #cs FEHLERMELDUNG  ( bei " /c query user" und ebenso bei " /c 'query user'" )
        Der Befehl "query" ist entweder falsch geschrieben oder
        konnte nicht gefunden werden.
    #ce
    ; ==================================================================================================
    
    
    
    ; ======================================================================================= VARIANTE 2
    Local $iPID = Run(@SystemDir & "\cmd.exe", @SystemDir, @SW_HIDE, 1+2) ; 1=$STDIN_CHILD / 2=$STDOUT_CHILD
    StdinWrite($iPID, "query user")
    If @error Then ConsoleWrite("@error StdinWrite !" & @LF)
    StdinWrite($iPID)
    Local $sOutput = ""
    While 1
        $sOutput &= StdoutRead($iPID)
        If @error Then ExitLoop
    WEnd
    ConsoleWrite("@@ Debug line [ $sOutput ]" & @LF & $sOutput & @LF)
    
    
    #cs OUTPUT
        Microsoft Windows [Version 6.1.7601]
        Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.
    
        C:\Windows\SysWOW64>Mehr?
    #ce
    ; ==================================================================================================
    Alles anzeigen

    Irgendwelche Ideen? :/

  • Elektromobil

    • BugFix
    • 18. April 2018 um 15:55

    Alina - Ich gehe nicht davon aus, dass das eine ernst gemeinte Frage war. Der User wollte m. M. nach nur einen Werbelink platzieren.

  • Windows Aktivierung Status

    • BugFix
    • 18. April 2018 um 14:25

    Oder du rufst den Lizenzmanager auf, in allen Windowsversionen enthalten:

    AutoIt
    ShellExecute(@SystemDir & "\slmgr.vbs", "/dlv", @SystemDir)
    $hScripthost = WinWait("Windows Script Host")
    $sText = WinGetText($hScripthost)
    WinClose($hScripthost)
    
    ConsoleWrite($sText & @CRLF)
  • Windows Aktivierung Status

    • BugFix
    • 18. April 2018 um 13:56

    In der Schleife musst du die Properties von $oObj abfragen (Objektnotation: Objektvariable.Property), wie im Bsp. von alpines.

    Also

    ...

    ConsoleWrite( $oObj.ActivationRequired )

    ConsoleWrite( $oObj.Caption )

    usw.

    ...

  • Windows Aktivierung Status

    • BugFix
    • 18. April 2018 um 12:34
    Zitat von AutoMit

    Gibt es eine Möglichkeit, den kompletten Inhalt der Variable $oQuery anzuzeigen?

    Das ist eine Objektvariable. Die Abfrage erfolgt in der Schleife (selbst wenn nur ein Objekt in der Objektvariablen enthalten ist:

    For $oObj In $oQuery ...

    Alle enthaltenen Objekt-Eigenschaften siehst du hier bei MSDN.

  • SQLite - Bsp. für gleichzeitigen Zugriff auf mehrere Datenbanken

    • BugFix
    • 18. April 2018 um 11:29
    Zitat von alpines

    Das was du als ’ gepostet hast ist ein "RIGHT SINGLE QUOTATION MARK" also einfache Gänsefüßchen,

    und das ' ist ein Apostroph

    Also weiter [OT] 8o

    Die Bezeichnung "Apostroph" ist leider nicht eindeutig und unterscheidet sich zum Bsp. schon zwischen verschiedenen Ländern.

    Im englischen wird ' (auf dt. Tastatur "Umsch+#" bzw. "Alt+(Numpad)039") als Apostroph bezeichnet, während im deutschsprachigen Raum ’ "Alt+(Numpad)0146" im Allgemeinen als Apostroph bezeichnet wird und "Alt+(Numpad)039" als einfaches Anführungszeichen (einfaches Gänsefüßchen).

    Es wird aber noch komplizierter. Wenn du im Bereich Schriftsatz unterwegs bist, wird auch häufig ‘ "Alt+(Numpad)0145" als Apostroph bezeichnet. Ich hatte da mal eine interessante Diskussionsrunde in einem Lektorenforum zu diesem Thema. Wie es aussieht, wurde verpasst eine DIN-gerechte Definition für Apostroph zu erstellen. :rofl:

    [/OT]

  • SQLite - Bsp. für gleichzeitigen Zugriff auf mehrere Datenbanken

    • BugFix
    • 18. April 2018 um 10:09
    Zitat von Bitnugger

    Edit: Zeile 5 würde ich so ändern...

    _SQLite_Startup() ; sqlite3.dll muss im @ScriptDir, @SystemDir, @WindowsDir, oder @WorkingDir sein.

    Das kann ja jeder für sich behandeln, wie er mag.

    Ich packe die Dll halt immer in das Skriptverzeichnis, da weiß ich dann sicher, dass ich sie finde, wo ich suche. Wegen der paar kB Speicherplatz überprüfe ich nicht extra ob die Datei schon irgendwo existiert.

    Zitat von alpines

    setzt komische Escapezeichen nach Strings die mit einem Apostroph geschrieben sind statt mit Gänsefüßchen

    Ja, das ist ziemlich bescheiden. Aber das ist ein einfaches Anführungszeichen - kein Apostroph. ;)

    ' einfaches Anführungszeichen

    ’ Apostroph

  • Punkt in Inputbox filtern

    • BugFix
    • 18. April 2018 um 08:49
    Zitat von wuff100

    #include "InputFilter.au3"

    Dann solltest du vielleicht mal diese au3 anhängen. Ist kein Bestandteil einer offiziellen AutoIt-Version.


    EDIT:

    Oder du sparst dir die UDF und löst es so:

    AutoIt
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    
    Global $hGui = GUICreate('Test')
    Global $idInput = GUICtrlCreateInput('', 10, 10, 180, 20)
    
    GUISetState()
    
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    
    Do
    Until GUIGetMsg() = -3
    
    
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit, $sRead, $sLastChar
        Local Static $aForbiddenChars[] = ['.']
    
        $hWndEdit = GUICtrlGetHandle($idInput)
        $hWndFrom = $ilParam
        $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
        $iCode = BitShift($iwParam, 16) ; Hi Word
        Switch $hWndFrom
            Case $hWndEdit
                Switch $iCode
                    Case $EN_CHANGE  ; Sent when the user has taken an action that may have altered text in an edit control
                        $sRead = GUICtrlRead($iIDFrom)
                        $sLastChar = StringMid($sRead, StringLen($sRead), 1)
                        For $i = 0 To UBound($aForbiddenChars) -1
                            If $sLastChar = $aForbiddenChars[$i] Then GUICtrlSetData($iIDFrom, StringTrimRight($sRead, 1))
                        Next
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_COMMAND
    Alles anzeigen
  • SQLite - Bsp. für gleichzeitigen Zugriff auf mehrere Datenbanken

    • BugFix
    • 17. April 2018 um 14:27

    In den meisten Fällen hat man es wohl nur mit einer offenen Datenbank zu tun.

    Wie man vorgeht, wenn es notwendig ist auf mehrere Datenbanken gleichzeitig zuzugreifen, möchte ich mal kurz zeigen. Ein kpl. AutoIt-Bsp. dafür hatte ich nirgendwo finden können.

    C
    ;-- TIME_STAMP   2018-04-17 14:19:28
    
    #include <SQLite.au3>
    
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1) ; Dll muss im Skriptordner vorhanden sein
    
    
    Global $hDB_main                                    ; Handle der (geöffneten) DB
    Global $sDB_main = @ScriptDir & '\main.db'          ; Pfad der Hauptdatenbank
    Global $sDB_attached = @ScriptDir & '\attached.db'  ; Pfad der zweiten Datenbank
    Global $sAlias = 'attached'                         ; Alias der zweiten DB
    
    ; Öffnen / Erstellen der Hauptdatenbank
    $hDB_main = _SQLite_Open($sDB_main)
    
    ; Öffnen / Erstellen einer zweiten Datenbank durch Anbinden an die Hauptdatenbank
    _SQLite_Exec($hDB_main, StringFormat("ATTACH DATABASE '%s' AS %s", $sDB_attached, $sAlias))
    
    ; ============================== Zugriffe auf die Hauptdatenbank normal über das DB-Handle (oder -1)
    ; Erstellen einer Tabelle in der Haupt-DB
    Global $sSQL = _
        "CREATE TABLE IF NOT EXISTS test1 (" & _
            "name    TEXT," & _
            "vorname TEXT," & _
            "strasse TEXT," & _
            "nr      TEXT," & _
            "plz     TEXT," & _
            "ort     TEXT);"
    _SQLite_Exec($hDB_main, $sSQL)
    
    ; Einfügen von Daten
    $sSQL = _
        "INSERT INTO test1 VALUES ('Meier','Hans','Mustergasse','15','01234','Musterhausen');" & _
        "INSERT INTO test1 VALUES ('Müller','Veronika','Kuhgasse','3','56789','Rindsdorf');" & _
        "INSERT INTO test1 VALUES ('Schuhmann','Dirk','Forstweg','8','32457','Walddorf');"
    _SQLite_Exec($hDB_main, $sSQL)
    
    ; ============================================ Zugriffe auf die zweite DB durch vorangesetzten Alias
    $sSQL = _
        StringFormat("CREATE TABLE IF NOT EXISTS %s.test2 (", $sAlias) & _
            "name    TEXT," & _
            "vorname TEXT);"
    _SQLite_Exec($hDB_main, $sSQL)
    
    ; Einfügen von Daten
    $sSQL = _
        StringFormat("INSERT INTO %s.test2 VALUES ('Krüger','Doris');", $sAlias) & _
        StringFormat("INSERT INTO %s.test2 VALUES ('Lehmann','Gerrit');", $sAlias) & _
        StringFormat("INSERT INTO %s.test2 VALUES ('Böttcher','Klaus');", $sAlias)
    _SQLite_Exec($hDB_main, $sSQL)
    
    ; =============================================================================== Abfragen von Daten
    Global $aQuery, $hQuery, $sResult = ''
    
    ; Hauptdatenbank
    _SQlite_Query ($hDB_main, "SELECT name FROM test1 WHERE name LIKE 'M%';", $hQuery)
    While _SQLite_FetchData ($hQuery, $aQuery, False, False) = $SQLITE_OK
        $sResult &= $aQuery[0] & @CRLF
    WEnd
    _SQLite_QueryFinalize($hQuery)
    ConsoleWrite('name LIKE M%:' & @CRLF & $sResult & @CRLF)
    
    ; zweite Datenbank
    $sResult = ''
    _SQlite_Query ($hDB_main, StringFormat("SELECT vorname FROM %s.test2 WHERE name = 'Lehmann';", $sAlias), $hQuery)
    While _SQLite_FetchData ($hQuery, $aQuery, False, False) = $SQLITE_OK
        $sResult &= $aQuery[0] & @CRLF
    WEnd
    _SQLite_QueryFinalize($hQuery)
    ConsoleWrite('vorname "Lehmann":' & @TAB & $sResult & @CRLF)
    
    ; ========================================================= Daten aus Haupt-DB in zweite DB einfügen
    $sSQL = StringFormat("INSERT INTO %s.test2 SELECT name, vorname FROM test1;", $sAlias)
    _SQLite_Exec($hDB_main, $sSQL)
    
    ; Inhalt der zweiten DB ausgeben
    Global $aResult, $iRows, $iColumns
    If _SQLite_GetTable2d($hDB_main, StringFormat("SELECT * FROM %s.test2;", $sAlias), $aResult, $iRows, $iColumns) = $SQLITE_OK Then
        _SQLite_Display2DResult($aResult)
    EndIf
    
    ; ========================================================================================== Beenden
    _SQLite_Close($hDB_main)
    _SQLite_Shutdown()
    
    #cs
    Eine mit ATTACH angebundene DB lässt sich mit DETACH wieder lösen:
        _SQLite_Exec($hDB, "DETACH DATABASE sAlias;")
    
    Es können gleichzeitig bis zum Wert von SQLITE_LIMIT_ATTACHED Datenbanken angebunden werden (Standardwert ist 7).
    #ce
    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™