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

  • ArrayFindAll 2DArray

    • BugFix
    • 12. Dezember 2023 um 13:03
    Zitat von wuff100

    Mein Array hat 30 Spalten.

    Dann musst du entsprechend in den Funktionen erweitern.


    Am Skriptanfang:

    AutoIt
    Global $giColumn = 5 ; oder was du brauchst

    Und die Funktion ändern:

    AutoIt
    Func _NewArray()
        Local $a[][$giColumn] = [[Null]]
        Return $a
    EndFunc
  • ArrayFindAll 2DArray

    • BugFix
    • 12. Dezember 2023 um 12:08

    Hier mal eine variable Lösung (also egal ob 3 oder beliebig viele Arrays entstehen):

    AutoIt
    Local $aArray[5][5] = [[0, "Test1", 27, 1, 0], _
    		[1, "Test1", 27, 4, 2], _
    		[2, "Test2", 28, 1, 3], _
    		[3, "Test3", 29, 1, 0], _
    		[4, "Test4", 29, 4, 1]]
    
    Local $aOfArrays = _Separate($aArray)
    For $a In $aOfArrays
        _ArrayDisplay($a)
    Next
    
    
    Func _Separate(ByRef $_a)
        Local $aRes[] = [Null], $aTmp
        Local $iLastCompare = Null
        For $i = 0 To UBound($_a) -1
            If $iLastCompare <> $_a[$i][2] Then
                If $iLastCompare <> Null Then _AddToRes($aRes, $aTmp)
                $iLastCompare = $_a[$i][2]
                _NewEntryByDiff($_a, $i, $aTmp)
            Else
                _NewEntryBySame($_a, $i, $aTmp)
            EndIf
        Next
        _AddToRes($aRes, $aTmp)
        Return $aRes
    EndFunc
    
    
    Func _NewEntryByDiff(ByRef $_a, $_i, ByRef $_aTmp)
        $_aTmp = _NewArray()
        For $j = 0 To UBound($_a, 2) -1
            $_aTmp[0][$j] = $_a[$_i][$j]
        Next
    EndFunc
    
    
    Func _NewEntryBySame(ByRef $_a, $_i, ByRef $_aTmp)
        If $_aTmp[UBound($_aTmp) -1][0] <> Null Then ReDim $_aTmp[UBound($_aTmp) +1][5]
        For $j = 0 To UBound($_a, 2) -1
            $_aTmp[UBound($_aTmp) -1][$j] = $_a[$_i][$j]
        Next
    EndFunc
    
    
    Func _AddToRes(ByRef $_aRes, $_aTmp)
        If $_aRes[UBound($_aRes) -1] <> Null Then ReDim $_aRes[UBound($_aRes) +1]
        $_aRes[UBound($_aRes) -1] = $_aTmp
    EndFunc
    
    
    Func _NewArray()
        Local $a[][5] = [[Null]]
        Return $a
    EndFunc
    Alles anzeigen
  • ArrayFindAll 2DArray

    • BugFix
    • 12. Dezember 2023 um 11:27
    Zitat von wuff100

    Alle Spalten mit 2x 27, 1x28, 2x 29

    Bitte schreibe es eindeutig.

    Ich vermute:

    Code
    [[0, "Test1", 27, 1, 0], _
    [1, "Test1", 27, 4, 2]]
    
    [[2, "Test2", 28, 1, 3]]
    
    [[3, "Test3", 29, 1, 0], _
    [4, "Test4", 29, 4, 1]]

    P.S. Ist die Spalte 3 aufsteigend sortiert oder hier nur zufällig in Reihenfolge?

  • Office 2016: Öffnen-Dialog konfigurieren auf Ordner des aktuell offenen Dokuments

    • BugFix
    • 11. Dezember 2023 um 13:38

    So, ich habe mir das jetzt mit VBA gelöst.

    Makro für Word

    VBA
    Sub dlgOpenDoc()
       Dim dat
       Set dat = Application.FileDialog(msoFileDialogFilePicker)
       With dat
           .Title = "Word Dokument Öffnen"
           .InitialFileName = ActiveDocument.Path
           .Filters.Clear
           .Filters.Add "Word ", "*.doc*"
           .Show
       End With
    End Sub
    Alles anzeigen
    • Eine Worddatei Öffnen
    • VBA-Editor Öffnen (Entwicklertools - ggf. vorher das Menü in den Optionen aktivieren)
    • Wenn unter Projekte "Normal" vorhanden ist: Module-Modul1 Doppelklick und Code einfügen
      • Wenn nicht:
      • Im Modul1 des Projektes mit der aktiven Datei den Code einfügen
      • mit Alt+F11 (oder Klick auf Word-Symbol im Menüband oben links) in das Word Dokument wechseln
      • Makros anzeigen (Alt+F8)
      • Makro (dlgOpenDoc) in Liste markieren und auf "Organisieren" klicken
      • auf linker Seite Modul1 markieren und nach rechts in "Normal.dotm" kopieren
    • Hotkey zuweisen über "Datei" > "Optionen" > "Menüband anpassen"
    • "Tastenkombinationen: Anpassen"
    • "Kategorien" > nach unten scrollen "Makros" markieren
    • rechts das Makro auswählen
    • "Neue Tastenkombination:" eingeben (Ich habe Strg+Shift+O gewählt)
    • Darauf achten, dass "Speichern in: Normal.dotm" ausgewählt ist und "Zuordnen" klicken


    Makro für Exel

    VBA
    Sub dlgOpenXls()
    '
    ' dlgOpenXls Makro
    ' Öffnen Dialog im aktuellen Dateiordner
    '
    ' Tastenkombination: Strg+Umschalt+O
    '
       Dim dat
       Set dat = Application.FileDialog(msoFileDialogFilePicker)
       With dat
           .Title = "Excel Dokument Öffnen"
           .InitialFileName = ActiveWorkbook.Path
           .Filters.Clear
           .Filters.Add "Word ", "*.xls*"
           .Show
       End With
    End Sub
    Alles anzeigen
    • Eine Exceldatei Öffnen
    • VBA-Editor Öffnen
    • "Makro Aufzeichnen" klicken
    • Makroname vergeben (z.B. dlgOpenXls)
    • Hotkey vergeben (bei Eintrag von "O" wechselt Ctrl automatisch zu Ctrl+Shift
    • Wichtig! "Makro Speichern in: Persönliche Arbeitsmappe" wählen
    • Jetzt irgendeine Aktion vornehmen (z.B. Zelle kopieren oder formatieren) und Aufzeichnung beenden
    • Makros anzeigen (Alt+F8)
    • "Personal.XLSB!dlgOpenXls" markieren und "Bearbeiten"
    • Den Code (zwischen Sub und End Sub) ersetzen
  • Office 2016: Öffnen-Dialog konfigurieren auf Ordner des aktuell offenen Dokuments

    • BugFix
    • 11. Dezember 2023 um 10:25
    Zitat von Moombas

    Also bei mir (Office 365 und priv. Office 2019 meine ich auch) hat er immer den zuletzt zum Speichern genutzten Ordner aktiv.

    Das hätte ich gern. Vielleicht bin ich ja nur zu blöd, die Einstellung dafür zu finden. :rofl:
    Aber egal, was ich dort für Ordner eintrage - das Verhalten, wie oben beschrieben, bleibt.

  • Office 2016: Öffnen-Dialog konfigurieren auf Ordner des aktuell offenen Dokuments

    • BugFix
    • 11. Dezember 2023 um 09:43

    Bisher hatte ich immer Office 2000. Auch das konnte schon (im Gegensatz zu jedem popligen Editor) Dokumente nicht automatisch im Ordner des aktuellen Dokuments öffnen (analog speichern). Immer nur stur:
    - Dialog startet mit in den Einstellungen hinterlegtem Standardspeicherort
    - Navigieren zum gewünschten Ordner
    - Öffnen/Speichern

    Bei Office 2016 darf ich netterweise noch einen Step mehr machen. <X
    An Stelle des Windows-Dialogs bekomme ich erst mal eine Liste der zuletzt geöffneten Dokumente (weil man ja immer die zuletzt geöffneten Docs gleich noch mal öffnen will :Face:). Jetzt muss ich dann auf den Reiter "Ordner" klicken um meinen Pfad zu wählen (hier ist die Anzeige des zuletzt genutzten Ordners sinnvoll).

    Meine Frage:
    Kann man in den Einstellungen hinterlegen, dass alle Dialoge ausnahmslos den Ordner des aktiven Dokuments verwenden?

    Wenn nicht, werde ich mir ein VBA-Script erstellen und den Datei-Dialog in Office ersetzen müssen.

    Was mich auch nervt, ist der Zwang, die Maus zu benutzen. Da muss man sich erst umständlich, meist mit Fremdprogrammen, HotKeys basteln, die Office früher mal integriert, aber im Zuge der konstanten Umstellung auf Benutzerunfreundlichkeit entfernt hat.

  • Aus Dateiname Ordner erstellen

    • BugFix
    • 1. Dezember 2023 um 18:05
    Zitat von Abraham

    "Element wurde nicht gefunden"

    Bau eine Überprüfung ein, ob der erstellte Ordner existiert (ggf. in Schleife bis er existiert) und verschiebe die Datei erst dann.

  • Gepunkteten Fokusrahmen (seit Win 10) entfernen

    • BugFix
    • 28. November 2023 um 18:46

    Bei Listview und deutlicher bei Tab-Ctrl sieht man als Markierung des Item mit Fokus einen unschönen gepunkteten Rahmen.
    Diesen zu Entfernen ist (wenn man es endlich gefunden hat) doch recht simpel. Die folgende Funktion für die GUI aufrufen und alle Elemente der GUI bekommen das HIDEFOCUS-Setting. Man kann auch die Nachricht an ein beliebiges Ctrl auf der GUI senden. Dann wird die Nachricht hinauf geleitet bis zum Parent und von dort wieder hinunter zu allen Childs. - Was natürlich auch bedeutet, dass dieses Setting ein "all or nothing" Setting ist, keine Selektion auf einzelne Ctrl.

    AutoIt
    ; required: #include <WinAPISysWin.au3>, #include <WinAPIConv.au3>
    Func _RemoveFocus($_hWnd)
        Local Const $UIS_SET = 1
        Local Const $UISF_HIDEFOCUS = 0x1
        _WinAPI_PostMessage($_hWnd, $WM_CHANGEUISTATE, _WinAPI_MakeLong($UIS_SET, $UISF_HIDEFOCUS), 0)
    EndFunc


    Hier ein Bsp.

    AutoIt: CancelFocus.au3
    #include <GuiConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WinAPISysWin.au3>
    #include <WinAPIConv.au3>
    #include <WindowsConstants.au3>
    
    Global $g_hGui = GUICreate('Test')
    
    Global $g_idLV = GUICtrlCreateListView('col 1|col 2|col 3|col 4', 10, 30, 380, 160, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    For $i = 1 To 10
        GUICtrlCreateListViewItem(StringFormat('%d|%d|%d|%d', Random(100,999,1), Random(100,999,1), Random(100,999,1), Random(100,999,1)), $g_idLV)
    Next
    
    Global $g_aTabItm[] = ['Alpha','Beta','Gamma','Delta']
    GUICtrlCreateTab(10, 210, 380, 160)
    For $i = 0 To UBound($g_aTabItm) -1
        GUICtrlCreateTabItem($g_aTabItm[$i])
        GUICtrlCreateTabItem('')
    Next
    
    ; wird an alle Childs durchgereicht
    _RemoveFocus($g_hGui)
    
    GUISetState()
    
    
    Do
    Until GUIGetMsg() = -3
    
    
    Func _RemoveFocus($_hWnd)
        Local Const $UIS_SET = 1
        Local Const $UISF_HIDEFOCUS = 0x1
        _WinAPI_PostMessage($_hWnd, $WM_CHANGEUISTATE, _WinAPI_MakeLong($UIS_SET, $UISF_HIDEFOCUS), 0)
    EndFunc
    Alles anzeigen


    Um das fokussierte Element aber besser zu sehen, vergrößere ich im folgenden Bsp. die Fontgröße von 14.5 auf 15 wenn es den Fokus erhält.

    AutoIt: NoFocus.au3
    #include <FontConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiHeader.au3>
    #include <GuiTab.au3>
    #include <StructureConstants.au3>
    
    ; Focus Rectangle (gepunktete Linie) wird entfernt
    ; Element mit Focus erhält stattdessen Fontgröße 15.0 statt 14.5
    
    
    Global $g_hGui = GUICreate('Test')
    ; ------------------------------------------------------ Listview
    ; [[bgColor,textColor]] colors as BGR
    Global $g_aColumn[][2] = [[0xCC483F,0xFAFAFA],[0xF0F0F0,0x440000],[0x409340,0x00F2FF],[0x3030FF,0xFAFAFA]]
    Global $g_idLV = GUICtrlCreateListView('col 1|col 2|col 3|col 4', 10, 10, 380, 180, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    For $i = 1 To 10
        GUICtrlCreateListViewItem(StringFormat('%d|%d|%d|%d', Random(100,999,1), Random(100,999,1), Random(100,999,1), Random(100,999,1)), $g_idLV)
    Next
    Global $g_hLV = GUICtrlGetHandle($g_idLV)
    
    ; ------------------------------------------------------ Tab-Ctrl
    ; [[Text,bgColor,textColor]] colors as BGR
    Global $g_aTabItm[][3] = [['Alpha',0xCC483F,0xFAFAFA],['Beta',0xF0F0F0,0x440000],['Gamma',0x409340,0x00F2FF],['Delta',0x3030FF,0xFAFAFA]]
    Global $g_hTab = GUICtrlGetHandle(GUICtrlCreateTab(10, 210, 380, 180, $TCS_OWNERDRAWFIXED))
    
    ; Create Tab items, coloring the tab page
    For $i = 0 To UBound($g_aTabItm) -1
        GUICtrlCreateTabItem($g_aTabItm[$i][0])
        _GUICtrlTab_PageColor(_BGRvvRGB($g_aTabItm[$i][1]))
        GUICtrlCreateTabItem('')
    Next
    ; ------------------------------------------------------
    
    
    GUIRegisterMsg($WM_DRAWITEM, "_WM_DRAWITEM")
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
    GUISetState()
    
    _RemoveFocus($g_hGui)
    
    Do
    Until GUIGetMsg() = -3
    
    
    Func _WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
        Local Const $ODT_TAB        = 101
        Local Const $ODA_DRAWENTIRE = 0x1
        Local $DIS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
                     "hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)  ; DRAWITEMSTRUCT
        If $DIS.hItm <> $g_hTab Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.cType, $ODT_TAB) <> $ODT_TAB Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.itmAction, $ODA_DRAWENTIRE) <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
    
        Local $tRect = DllStructCreate($tagRECT, DllStructGetPtr($DIS, 'itmRect'))
        Local $bFocus = (_GUICtrlTab_GetCurFocus($DIS.hItm) = $DIS.itmID)
        Local $itmText = _GUICtrlTab_GetItemText($DIS.hItm, $DIS.itmID)
        Local $iFontSize = $bFocus ? 15 : 14.5
        Local $hFont = _WinAPI_CreateFont($iFontSize, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Lucida Sans Unicode Standard')
        Local $hOldFont = _WinAPI_SelectObject($DIS.hDC, $hFont)
    
        ; draw and fill rect
        Local $hBrush = _WinAPI_CreateSolidBrush($g_aTabItm[$DIS.itmID][1])
        Local $hOldBrush = _WinAPI_SelectObject($DIS.hDC, $hBrush)
        _WinAPI_Rectangle($DIS.hDC, $tRect)
    
         ; draw text
        _WinAPI_SetTextColor($DIS.hDC, $g_aTabItm[$DIS.itmID][2])
        _WinAPI_SetBkColor($DIS.hDC, $g_aTabItm[$DIS.itmID][1])
        ; move text rect with focus
        If $bFocus Then
            _WinAPI_OffsetRect($tRect, 0, 3)
        Else
            _WinAPI_OffsetRect($tRect, 0, 1)
        EndIf
        _WinAPI_DrawText($DIS.hDC, $itmText, $tRect, BitOR($DT_BOTTOM,$DT_CENTER))
    
        ; clear ressources
        _WinAPI_SelectObject($DIS.hDC, $hOldFont)
        _WinAPI_DeleteObject($hFont)
        _WinAPI_SelectObject($DIS.hDC, $hOldBrush)
        _WinAPI_DeleteObject($hBrush)
    
        Return 0
    EndFunc
    
    
    Func _WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
        If $hWndFrom <> $g_hLV Then Return $GUI_RUNDEFMSG
    
        Switch $hWndFrom
            Case $g_hLV
                Switch $iCode
                    Case $NM_CUSTOMDRAW
                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                        Local $iDrawStage, $iItem, $iSubitem, $hDC = $tCustDraw.hdc, $tRect, $hFont
                        $iDrawStage = $tCustDraw.dwDrawStage
                        Switch $iDrawStage
                            Case $CDDS_ITEMPREPAINT
                                Return $CDRF_NOTIFYSUBITEMDRAW
                            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
                                $iItem = $tCustDraw.dwItemSpec
                                $iSubitem = $tCustDraw.iSubItem
                                $tCustDraw.clrText = $g_aColumn[$iSubitem][1]       ; (sub)item text color
                                $tCustDraw.clrTextBk = $g_aColumn[$iSubitem][0]     ; (sub)item bg color
                                Local $iFontSize = BitAND($tCustDraw.uItemState, $CDIS_FOCUS) = $CDIS_FOCUS ? 15 : 14.5     ; enlarge focusssed item
                                $hFont = _WinAPI_CreateFont($iFontSize,0,0,0,$FW_NORMAL,False,False,False,$DEFAULT_CHARSET,$OUT_DEFAULT_PRECIS, _
                                         $CLIP_DEFAULT_PRECIS,$DEFAULT_QUALITY,0,'Lucida Sans Unicode Standard')
                                _WinAPI_SelectObject($hDC, $hFont)
                                _WinAPI_DeleteObject($hFont)
    
                                Return $CDRF_NEWFONT
                            EndSwitch
                EndSwitch
        EndSwitch
    EndFunc
    
    
    Func _RemoveFocus($_hWnd)
        Local Const $UIS_SET = 1
        Local Const $UISF_HIDEFOCUS = 0x1
        _WinAPI_PostMessage($_hWnd, $WM_CHANGEUISTATE, _WinAPI_MakeLong($UIS_SET, $UISF_HIDEFOCUS), 0)
    EndFunc
    
    
    Func _GUICtrlTab_PageColor($_bgCol)
        ; Tab position
        Local $aTabPos = ControlGetPos($g_hGui, '', $g_hTab)
        ; size of user area
        Local $aTabRect = _GUICtrlTab_GetItemRect($g_hTab, -1)
        ; Create label
        GUICtrlCreateLabel('', $aTabPos[0] + 2, $aTabPos[1] + $aTabRect[3] + 4, $aTabPos[2] - 6, $aTabPos[3] - $aTabRect[3] - 7)
        ; set color
        GUICtrlSetBkColor(-1, $_bgCol)
        ; Disable label
        GUICtrlSetState(-1, $GUI_DISABLE)
    EndFunc
    
    
    Func _BGRvvRGB($_iCol)  ; BGR to RGB and vice versa
        Local $a = StringLeft(Hex($_iCol,6), 2)
        Local $b = StringMid(Hex($_iCol,6), 3, 2)
        Local $c = StringRight(Hex($_iCol,6), 2)
        Return '0x' & $c & $b & $a
    EndFunc
    Alles anzeigen
  • Tab-Ctrl, gepunkteten Focus Rahmen entfernen?

    • BugFix
    • 24. November 2023 um 14:19
    Zitat von Velted

    ist eine Übersetzung aus meinem AHK-Pool.

    Funktioniert leider bei mir (Win 11) nicht.

    Ich hatte schon ein ähnliches Herangehen probiert (Quelle: https://www.hofmann-robert.info/computer/2017/…srectangle.html), aber auch ohne Erfolg.

    AutoIt
    Func WM_CHANGEUISTATE($hWnd, $iMsg = Default, $wParam = Default, $lParam = Default)
        If $hWnd <> $g_hTab Then Return $GUI_RUNDEFMSG
        Local Const $UIS_SET = 1
        Local Const $UISF_HIDEFOCUS = 0x1
        _WinAPI_PostMessage($hWnd, $WM_CHANGEUISTATE, _WinAPI_MakeLong($UIS_SET, $UISF_HIDEFOCUS), 0)
    EndFunc

    EDIT: GELÖST!

    AutoIt
    #include <FontConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiTab.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    ; [[Text,bgColor,textColor]] colors as BGR
    Global $g_aTabItm[][3] = [['Alpha',0xCC483F,0xFAFAFA],['Beta',0xF0F0F0,0x440000],['Gamma',0x409340,0x00F2FF],['Delta',0x3030FF,0xFAFAFA]]
    
    Global $g_hGui = GUICreate('Test')
    Global $g_hTab = GUICtrlGetHandle(GUICtrlCreateTab(10, 10, 380, 200, $TCS_OWNERDRAWFIXED))
    
    
    ; Create Tab items, coloring the tab page
    For $i = 0 To UBound($g_aTabItm) -1
        GUICtrlCreateTabItem($g_aTabItm[$i][0])
        _GUICtrlTab_PageColor(_BGRvvRGB($g_aTabItm[$i][1]))
        GUICtrlCreateTabItem('')
    Next
    
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    GUISetState()
    
    
    Do
    Until GUIGetMsg() = -3
    
    
    Func _GUICtrlTab_PageColor($_bgCol)
        ; Tab position
        Local $aTabPos = ControlGetPos($g_hGui, '', $g_hTab)
        ; size of user area
        Local $aTabRect = _GUICtrlTab_GetItemRect($g_hTab, -1)
        ; Create label
        GUICtrlCreateLabel('', $aTabPos[0] + 2, $aTabPos[1] + $aTabRect[3] + 4, $aTabPos[2] - 6, $aTabPos[3] - $aTabRect[3] - 7)
        ; set color
        GUICtrlSetBkColor(-1, $_bgCol)
        ; Disable label
        GUICtrlSetState(-1, $GUI_DISABLE)
    EndFunc
    
    
    Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
        Local Const $ODT_TAB        = 101
        Local Const $ODA_DRAWENTIRE = 0x1
        Local $DIS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
                     "hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)  ; DRAWITEMSTRUCT
        If $DIS.hItm <> $g_hTab Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.cType, $ODT_TAB) <> $ODT_TAB Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.itmAction, $ODA_DRAWENTIRE) <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
    
        Local $tRect = DllStructCreate($tagRECT, DllStructGetPtr($DIS, 'itmRect'))
        Local $bFocus = (_GUICtrlTab_GetCurFocus($DIS.hItm) = $DIS.itmID)
        Local $itmText = _GUICtrlTab_GetItemText($DIS.hItm, $DIS.itmID)
        Local $iFontSize = $bFocus ? 15 : 14.5
        Local $hFont = _WinAPI_CreateFont($iFontSize, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Lucida Sans Unicode Standard')
        Local $hOldFont = _WinAPI_SelectObject($DIS.hDC, $hFont)
    
        ; draw and fill rect
        Local $hBrush = _WinAPI_CreateSolidBrush($g_aTabItm[$DIS.itmID][1])
        Local $hOldBrush = _WinAPI_SelectObject($DIS.hDC, $hBrush)
        _WinAPI_Rectangle($DIS.hDC, $tRect)
    
         ; draw text
        _WinAPI_SetTextColor($DIS.hDC, $g_aTabItm[$DIS.itmID][2])
        _WinAPI_SetBkColor($DIS.hDC, $g_aTabItm[$DIS.itmID][1])
        ; move text rect with focus
        If $bFocus Then
            _WinAPI_OffsetRect($tRect, 0, 3)
        Else
            _WinAPI_OffsetRect($tRect, 0, 1)
        EndIf
        _WinAPI_DrawText($DIS.hDC, $itmText, $tRect, BitOR($DT_BOTTOM,$DT_CENTER))
    
        ; clear ressources
        _WinAPI_SelectObject($DIS.hDC, $hOldFont)
        _WinAPI_DeleteObject($hFont)
        _WinAPI_SelectObject($DIS.hDC, $hOldBrush)
        _WinAPI_DeleteObject($hBrush)
    
        ; remove focus rect
        Local Const $UIS_SET = 1
        Local Const $UISF_HIDEFOCUS = 0x1
        _WinAPI_PostMessage($hWnd, $WM_CHANGEUISTATE, _WinAPI_MakeLong($UIS_SET, $UISF_HIDEFOCUS), 0)
    
        Return 0
    EndFunc
    
    Func _BGRvvRGB($_iCol)  ; BGR to RGB and vice versa
        Local $a = StringLeft(Hex($_iCol,6), 2)
        Local $b = StringMid(Hex($_iCol,6), 3, 2)
        Local $c = StringRight(Hex($_iCol,6), 2)
        Return '0x' & $c & $b & $a
    EndFunc
    Alles anzeigen
  • Tab-Ctrl, gepunkteten Focus Rahmen entfernen?

    • BugFix
    • 23. November 2023 um 15:58

    Windows 10/11 haben ja nun diese Flat - gestrickten Fenster. Da Ctrl nix anderes als Fenster sind, sehen auch die genauso verbaselt aus. <X

    Ränder sind kaum noch auszumachen, umso hässlicher macht sich dann der gepunktete Rahmen des Tab-Item mit Focus aus.

    Damit man die Item überhaupt sieht, nutze ich jetzt selbst gezeichnete Item. Das kann man dann auch schön bunt (wenn man mag für jedes Item anders) gestalten. Aber ich finde ums Verrecken nicht heraus, wie ich das Zeichnen des Focusrahmens verhindern kann.

    Hier mal ein Code-Bsp. - hat jemand 'ne Idee, wie ich dem Focusrahmen beikommen kann?

    AutoIt
    #include <FontConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiTab.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>
    
    
    
    Global $g_hGui = GUICreate('Test')
    Global $g_hTab = GUICtrlGetHandle(GUICtrlCreateTab(10, 10, 380, 200, BitOR($TCS_MULTILINE,$TCS_OWNERDRAWFIXED)))
    GUICtrlCreateTabItem('Alpha')
    GUICtrlCreateTabItem('Beta')
    GUICtrlCreateTabItem('Gamma')
    GUICtrlCreateTabItem('Delta')
    GUICtrlCreateTabItem('Epsilon')
    GUICtrlCreateTabItem('Zeta')
    GUICtrlCreateTabItem('Eta')
    GUICtrlCreateTabItem('Theta')
    GUICtrlCreateTabItem('Iota')
    GUICtrlCreateTabItem('Kappa')
    GUICtrlCreateTabItem('Lambda')
    GUICtrlCreateTabItem('My')
    GUICtrlCreateTabItem('Ny')
    GUICtrlCreateTabItem('Xi')
    GUICtrlCreateTabItem('Omikron')
    GUICtrlCreateTabItem('Pi')
    GUICtrlCreateTabItem('Rho')
    GUICtrlCreateTabItem('Sigma')
    GUICtrlCreateTabItem('Tau')
    GUICtrlCreateTabItem('Ypsilon')
    GUICtrlCreateTabItem('Phi')
    GUICtrlCreateTabItem('Chi')
    GUICtrlCreateTabItem('Psi')
    GUICtrlCreateTabItem('Omega')
    
    ; Tab item color:
    ;~ Global $g_BGcolor = 0xCC483F    ; hellblau
    ;~ Global $g_BGcolor = 0x409340    ; grün
    ;~ Global $g_BGcolor = 0x3030FF    ; rot
    ;~ Global $g_BGcolor = 0xE3E3E3    ; dunkelgrau
    Global $g_BGcolor = 0xF0F0F0    ; lichtgrau
    ;~ Global $g_BGcolor = 0x000000    ; schwarz
    
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    GUISetState()
    
    Do
    Until GUIGetMsg() = -3
    
    
    Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
        Local Const $ODT_TAB        = 101
        Local Const $ODA_DRAWENTIRE = 0x1
        Local $DIS = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
                     "hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)  ; DRAWITEMSTRUCT
        If $DIS.hItm <> $g_hTab Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.cType, $ODT_TAB) <> $ODT_TAB Then Return $GUI_RUNDEFMSG
        If BitAND($DIS.itmAction, $ODA_DRAWENTIRE) <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
    
        Local $tRect = DllStructCreate($tagRECT, DllStructGetPtr($DIS, 'itmRect'))
        Local $bFocus = (_GUICtrlTab_GetCurFocus($DIS.hItm) = $DIS.itmID)
        Local $itmText = _GUICtrlTab_GetItemText($DIS.hItm, $DIS.itmID)
        Local $hFont = _WinAPI_CreateFont(14.5, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Lucida Sans Unicode Standard')
        Local $hOldFont = _WinAPI_SelectObject($DIS.hDC, $hFont)
    
        ; draw and fill rect
        Local $hBrush = _WinAPI_CreateSolidBrush($g_BGcolor)
        Local $hOldBrush = _WinAPI_SelectObject($DIS.hDC, $hBrush)
        _WinAPI_Rectangle($DIS.hDC, $tRect)
    
         ; draw text
        _WinAPI_SetTextColor($DIS.hDC, _GuiCtrl_GetColorContrast($g_BGcolor))
        _WinAPI_SetBkColor($DIS.hDC, $g_BGcolor)
    
        ; move text rect by focus
        If $bFocus Then
            _WinAPI_InflateRect($tRect, 0, -2)  ; reduce rectangle
            _WinAPI_OffsetRect($tRect, 0, 2)    ; move rectangle down by 2px
        EndIf
        _WinAPI_DrawText($DIS.hDC, $itmText, $tRect, BitOR($DT_BOTTOM,$DT_CENTER))
    
        ; clear ressources
        _WinAPI_SelectObject($DIS.hDC, $hOldFont)
        _WinAPI_DeleteObject($hFont)
        _WinAPI_SelectObject($DIS.hDC, $hOldBrush)
        _WinAPI_DeleteObject($hBrush)
    
        Return 0
    EndFunc
    
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _GuiCtrl_GetColorContrast
    ; Description ...: The appropriate contrast color for the text is determined depending
    ; ...............: on the brightness of the BG color.
    ; Parameter(s)...: $_BkCol        The background color
    ; ....[optional].: $_ColOnDark    The text color if BG is dark (Default: -1, almost white)
    ; ....[optional].: $_ColOnBright  The text color if BG is bright (Default: -1, very deep blue)
    ; Return values .: Text color
    ; Author ........: BugFix
    ; ==================================================================================================
    Func _GuiCtrl_GetColorContrast($_BkCol, $_ColOnDark=-1, $_ColOnBright=-1)
        $_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
    ;~     $_ColOnBright = $_ColOnBright = -1 ? 0x000088 : $_ColOnBright    ; RGB
        $_ColOnBright = $_ColOnBright = -1 ? 0x440000 : $_ColOnBright   ; BGR
        ; get contrast
        Local $R = BitAND(BitShift($_BkCol, 16), 0xFF)
        Local $G = BitAND(BitShift($_BkCol, 8), 0xFF)
        Local $B = BitAND($_BkCol, 0xFF)
        Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)
        Return ($Brightness < 140 ? $_ColOnDark : $_ColOnBright)
    EndFunc
    Alles anzeigen
  • Windows 10 Updates

    • BugFix
    • 22. November 2023 um 14:17
    Zitat von WhiteHorse

    nun sollte endlich ruhe sein

    Vergiß es. Mit dem nächsten Sicherheits-Update, dass du ja wohl doch mal zum Selbstschutz drauf ziehst, wird auch diese "Lücke" wieder geschlossen.

  • eigene Abbreviations gehen nur mit Ctrl + b

    • BugFix
    • 22. November 2023 um 14:13
    Zitat von hipfzwirgel

    meine eigenen Abbrevs gehen nur mit dem Schalter CTRL + b.

    Wie hast du diese denn eingebunden?

    Wenn du die Abbrevs im AbbrevManager erstellst (AU3 Script in SciTE öffnen, <Strg+1><AbbrevManager> klicken), dann sind dise Abbrevs auch wirksam.

    EDIT:

    "Ctrl+B" dürfte eigentlich gar nicht reagieren - hast du evtl. gar nicht SciTE4AutoIt sondern nur die Lite-Version?

  • _SQLite_Exec - Limit für Befehlslänge?

    • BugFix
    • 22. November 2023 um 09:44
    Zitat von AspirinJunkie

    Die meiner Erfahrung nach schnellste Methode eines Datenimportes in sqlite ist die >>.import-Funktion<< des CLI-Tools von sqlite.

    Klingt gut, Danke. Werde ich testen.

  • _SQLite_Exec - Limit für Befehlslänge?

    • BugFix
    • 20. November 2023 um 18:50

    Ich stelle zum Befüllen der Tabellen einer SQLite-DB die Queries in einer Funktion zusammen. Dabei hänge ich alle Insert-Befehle hintereinander und führe danach aus:

    AutoIt
    Function _Insert($_kind, $_sCSV)   
        Local $aLines = FileReadToArray($_sCSV)
        Local $aSplit, $sQuery = 'BEGIN;'
        For $i = 1 To UBound($aLines) -1
            If $_kind = 'Tab1' Then
                $aSplit = StringSplit($aLines[$i], ',', 2)
                $sQuery &= _
                StringFormat("INSERT INTO tab1 VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s');", $i, _
                             $aSplit[0], $aSplit[1], $aSplit[2], $aSplit[3], $aSplit[4], $aSplit[5])
            Else
                $aSplit = _SplitStreetLine($aLines[$i])
                $sQuery &= _
                StringFormat("INSERT INTO tab2 VALUES (%d, '%s', '%s', '%s', '%s');", $i, _
                             $aSplit[0], $aSplit[1], $aSplit[2], $aSplit[3])
            EndIf
        Next
        Local $SQLiteResult = _SQLite_Exec($hSQL, $sQuery & 'COMMIT;')
        If $SQLiteResult <> $SQLITE_OK Then
            ConsoleWrite('!> ERROR! ' & @TAB & 'Inserting data in table [' & $_kind & '] has failed.' & @CRLF & _
            '!> The sql-query is stored to "@ScriptDir\err_insert.txt".' & @CRLF & _
            '!> Check this file.' & @CRLF)
            Local $fh = FileOpen(@ScriptDir & '\err_insert.txt', 2+256)
            FileWrite($fh, 'SQLite-Error = ' & $SQLiteResult & @CRLF & $sQuery)
            FileClose($fh)
            Exit
        EndIf
    EndFunc
    Alles anzeigen

    Tabelle 1 hat nur ein paar Hundert Datensätze, das Insert funktioniert ohne Probleme.

    Für Tabelle 2 stelle ich 1,8 Mio Datensätze zusammen. AutoIt hat kein Problem mit der Stringlänge.

    Aber das _SQLite_Exec schlägt fehl, Fehlercode = 1 - Error calling SQLite API 'sqlite3_exec'. Natürlich sehr aussagekräftig. :whistling:

    Meine Vermutung ist, dass der Befehlsstring einfach zu lang ist (~103 Mio. Zeichen).

    Bevor ich jetzt anfange zu stückeln: Ist euch ein Limit für den Befehlsstring bekannt? Ich möchte mich da nicht rantasten.

  • SciTE - Farbig hervorheben: Aktuelles Tab Item

    • BugFix
    • 20. November 2023 um 15:03
    Zitat von BigRox

    Das selbe geschieht, wenn ich das aktuelle Tab schließe. Dann wird ja wieder ein anderes Tab zum aktuellen Tab, aber es wird nicht entsprechend markiert. Ich muss erst wieder mit dem Cursor auf diese Tab fahren und dann den Cursor wieder weg bewegen, damit es auch markiert wird.

    Das ist in der Version 0.5 nicht mehr der Fall. Jetzt wird im Intervall von 750 ms auf das aktive Tab überprüft und bei Bedarf markiert.

  • SciTE - Farbig hervorheben: Aktuelles Tab Item

    • BugFix
    • 20. November 2023 um 11:06

    Neue Version

    [v0.5] Gefixed: Flickern der Markierung. Danke Velted fürs Suchen & Finden  :thumbup:

    [v0.5] Gefixed: Markierung hat nicht gewechselt bei Nutzung der Tastatur zur Auswahl der Tabs.

  • Markierung Aktuelles Tab-Item in SciTE: Flickern unter Win11

    • BugFix
    • 20. November 2023 um 10:23
    Zitat von Velted

    Wenn die Variable $iHoverLast eine Funktion haben soll, sollte es dann im ElseIf nicht eher $iHoverLast = 0 sein?

    Klassisches Eigentor. Beim Erstellen des ElseIf-Zweiges mal eben die Zeile gedoppelt und vergessen den Wert zu ändern. :Face:

    Danke für's aufmerksame Lesen. Das war der Kern des Übels. :thumbup:

  • Markierung Aktuelles Tab-Item in SciTE: Flickern unter Win11

    • BugFix
    • 19. November 2023 um 22:26
    Zitat von BigRox

    nur alle paar Sekunden flackert das markierte Tab,

    Ja, das meine ich. Es ist nicht direkt nervig, aber spürbar. Ich habe jetzt nochmal auf dem Win 7 Rechner geschaut. Dort passiert das auch, aber mit deutlich geringerer Häufigkeit. Dadurch war es mir nicht bewusst geworden.

  • Balkengrafik

    • BugFix
    • 17. November 2023 um 20:00

    Ich meine mich zu erinnern, dass peethebee vor Urzeiten sowas realisiert hat. Kann mich im Moment nur nicht an den UDF Namen erinnern. Aber vielleicht erinnert sich jemand anders.

  • AutoIt-SQLite to HTML

    • BugFix
    • 14. November 2023 um 18:31
    Zitat von Peter S. Taler

    Hast Du die Datenbank schon mal "gepackt",

    Ja, VACUUM ist eine gute Idee. Oder du setzt gleich pragma auto_vacuum auf 1.

    Ich hatte mal häufig Zugriffsfehler, habe mir dann angewöhnt Backup immer in Kombination mit Vacuum auszuführen. So bleibt auch die DB schön schlank.

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™