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. Velted

Beiträge von Velted

  • AOD SQLlite?

    • Velted
    • 4. Dezember 2023 um 17:03

    Moin,

    wenn ein Softwareanbieter zusichert, dass seine Anwendung mit SQLite-Datenbanken umgehen kann, sollte er auch dokumentieren oder zumindest auf Nachfrage konkret beschreiben können, wie man die Verbindung zur Datenbank herstellt.

    Wenn die Anwendung eine integrierte Schnittstelle zur SQLite3.dll hat, sollte es reichen, der Anwendung den Pfad zur Datenbank (und evtl. auch den Pfad der DLL) zu übergeben. Andere Möglichkeiten wären die Einrichtung einer ODBC-Datenquelle mit Hilfe der App ' ODBC-Datenquellen Administrator' (Win 10) oder die Vorgabe eines 'Connection Strings' für eine Verbindung per OLEDB/ADODB.

    Es macht allerdings meiner Meinung nach keinen Sinn blind herumzustochern, wenn Dir der Anbieter nicht verraten will oder kann, was Du brauchst.

  • Tab-Ctrl, gepunkteten Focus Rahmen entfernen?

    • Velted
    • 24. November 2023 um 14:33

    Schade, bei mir (Win 10 pro) funktioniert es. Ich glaube aber mich zu erinnern, dass es mit $WM_CHANGEUISTATE nicht wirklich funktioniert.

  • Tab-Ctrl, gepunkteten Focus Rahmen entfernen?

    • Velted
    • 24. November 2023 um 11:24

    Moin,

    Func HideFocusBorder() ist eine Übersetzung aus meinem AHK-Pool. Meine anderen Versuche hatten keinen Erfolg.

    AutoIt
    #include <FontConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiTab.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>
    #include <WinAPISysWin.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")
    GuiRegisterMsg($WM_UPDATEUISTATE, "HideFocusBorder")
    HideFocusBorder($g_hTab)
    GUISetState()
    
    Do
    Until GUIGetMsg() = -3
    
    ; ==============================================================================================
    ; Hides the focus border for the given GUI control or GUI and all of its children.
    ; Call the function passing the HWND of the control / GUI in $hWnd as only parameter.
    ; WM_UPDATEUISTATE  -> https://learn.microsoft.com/en-us/windows/win32/menurc/wm-updateuistate
    ; WM_UPDATEUISTATE = 0x0128
    ; The Old New Thing -> https://devblogs.microsoft.com/oldnewthing/20130516-00/?p=4343
    ; ==============================================================================================
    Func HideFocusBorder($hWnd, $iMsg = Default, $wParam = Default, $lParam = Default)
        Static $Affected[] ; affected controls / GUIs
        Static $HideFocus = 0x00010001 ; UIS_SET << 16 | UISF_HIDEFOCUS
        Switch $iMsg
            Case $WM_UPDATEUISTATE ; called by message handler
                Select
                    Case $wParam = $HideFocus
                        $Affected[$hWnd] = True
                    Case $Affected[$hWnd]
                        _WinAPI_PostMessage($hWnd, 0x0128, $HideFocus, 0)
                EndSelect
            Case Else
                If IsHwnd($hWnd) Then _WinAPI_PostMessage($hWnd, 0x0128, $HideFocus, 0)
        EndSwitch
    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 $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
  • _SQLite_Exec - Limit für Befehlslänge?

    • Velted
    • 21. November 2023 um 10:20

    Moin,

    wenn Du mit Fehlercode = 1 meinst, dass @error = 1 ist, kann der Fehler aus

    AutoIt
        If @error Then Return SetError(1, @error, $SQLITE_MISUSE) ; DllCall error

    in _SQLite_Exec() stammen. Dann müsste $SQLiteResult den Wert 21 enthalten und in @extended sollte der ursprünglich vom DllCall gesetzte Fehler zu finden sein. Hast Du das mal geprüft?

    Bei von SQLite gelieferten Fehlern sollte @error auf -1 gesetzt sein und eine Fehlermeldung per ConsoleWrite() erstellt werden, wenn das Skript nicht compiliert ist,

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

    • Velted
    • 20. November 2023 um 09:41

    Moin,

    das mag mit dem Problem nicht viel zu tun haben, aber ich verstehe Folgendes nicht:

    Code
    Func _MouseHoversTab()
        Local Static $iHoverLast = 1    ; bei Programmstart muss Verlassen des Item simuliert werden
        ...
        If $isHover = 1 And $iHoverLast = 0 Then
            $iHoverLast = 1
        ElseIf $isHover = 0 And $iHoverLast = 1 Then
            $iHoverLast = 1
            Return _DrawTabItem()
        EndIf
    EndFunc

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

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 16. November 2023 um 22:50
    Zitat von AspirinJunkie

    Stimmt auffallend.
    Dort ist die gleiche Vermischung aus Wert und Kodierung.

    Jetzt würde mich nur noch interessieren, welchen Wert die Funktion Deiner Meinung nach liefern sollte.

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 16. November 2023 um 18:11

    Eins habe ich noch vergessen:

    AutoIt
    MsgBox(0, "", Hex(-14))

    liefert zur Zeit FFFFFFF2. Das müsste dann auch angepasst werden.

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 16. November 2023 um 18:05

    Moin,

    gut, einigen wir uns auf 'Bug'. Solange die Entwickler anderer Meinung bleiben, ist es sowieso egal.

    Die Konsequenz wäre auch für mich, "Hexadezimalzahlen" mit 8 Stellen und einem Wert >= 8 in der führenden Stelle immer als Int64 zu behandeln. Ich wäre auch ziemlich sicher, dass diese Korrektur kaum Schaden in bestehenden Skripten anrichten würde.

    Hosianna!

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 15. November 2023 um 22:39

    AspirinJunkie & Andy,

    ich glaube eher, dass Ihr den Sinn der Hexnotation falsch interpretiert. Es gibt keine 'Hexadezimalzahlen'. Es gibt nur die 'Hexnotation'. Wenn jemand einer Varialen einen bestimmten Dezimalwert zuweisen will, was um Himmels Willen bringt ihn dann dazu, die Hexnotation anstelle der Dezimalzahl zu verwenden?

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 15. November 2023 um 18:09
    Zitat von AspirinJunkie

    Nun sieht aber blöderweise die Binärfolge 0x80000000 genau gleich aus wie der Zahlenwert 0x8000000016.
    Beide definieren aber etwas gänzlich anderes.

    Ich weiß nicht, wie Du darauf kommst.

    Zitat von Hexadezimalsystem

    In der Datenverarbeitung wird das Hexadezimalsystem sehr oft verwendet, da es sich hierbei letztlich um eine komfortablere Verwaltung des Binärsystems handelt. Die Datenwörter bestehen in der Informatik meist aus Oktetten, die statt als achtstellige Binärzahlen auch als nur zweistellige Hexadezimalzahlen dargestellt werden können. Im Gegensatz zum Dezimalsystem eignet sich das Hexadezimalsystem mit seiner Basis als vierte Zweierpotenz (16 = 24) zur einfacheren Notation der Binärzahlen, da stets eine feste Anzahl Zeichen zur Wiedergabe des Datenwortes benötigt wird. Ein Nibble kann exakt mit einer hexadezimalen Ziffer und ein Byte mit zwei hexadezimalen Ziffern dargestellt werden.

    Die Hexwerte entsprechen den Bitfolgen im Speicher, nur die Reihenfolge der Bytes wird bei x86-Systemen intern gedreht.

    Unsere normalen Computer kennen nicht anderes als Bitfolgen, die nach konkreten Anweisungen be- bzw. verarbeitet werden müssen. Es gab allerdings mal ein paar Großrechner, die Dezimalzahlen in Hardwre abbilden konnten..

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 15. November 2023 um 14:36
    Zitat von AspirinJunkie

    Will denn hier niemand den Unterschied zwischen Zahlenwert und Kodierung verstehen?

    Doch, genau das ist ja das Problem.

    Für eine Folge von 32 Bits (0 .. 31) im Speicher gibt es nicht nur einen möglichen Wert, wenn die Bitstelle 31 gesetzt ist. Abhängig davon, ob der Bereich im Programm als 'signed' oder 'unsigned' definiert ist, ergeben sich zwei unterschiedliche Werte.

    Bei der Zuordnung von Werten zu den Datentypen Int32 und Int64 hat einer der AutoIt-Entwickler anscheinend die 'geniale' Idee gehabt, bei Hexwerten ohne aufwändige Konvertierungen und Wertebereichsprüfungen direkt auf die Länge der Hexzeichenfolge zurückzugreifen. Daraus folgt dann: Alles mit maximal 8 Stellen hinter dem 0x passt in 4 Bytes (Int32), alles andere wird in 8 Bytes (Int64) gespeichert. Das bringt auf modernen Rechnern bestimmt einige Nanosekunden Performanzgewinn.

    Ich kann mir das Verhalten nicht anders erklären, aber vielleicht weiß ja einer von Euch mehr?

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 15. November 2023 um 11:49

    Nachdem ich die Doku noch einmal genauer erforscht habe, würde ich es nicht unbedingt als Bug bezeichnen, weil es schon halbwegs dokumentiert ist:

    Zitat von Language Reference - Datatypes

    Numbers

    Supported types are signed integers and floating-point: Int32, Int64 and Double. Bitsize of an integer depends on its magnitude and is automatically adjusted.

    Es gibt also keine 'unsigned integers'.

    Es gab mal Zeiten, in denen Arbeitsspeicher ein kostbares Gut war. Damals haben sich alle darum bemüht, die Daten möglichst platzsparend zu speichern. Diese Angewohnheit scheint AutoIt selbst in Zeiten der 64-Bit Systeme mit Gigabytes von RAM in Bezug auf die Zahlen beibehalten zu haben. 'Unter der Decke' war man ja schon immer recht änderungsscheu. Nach wie vor können die Funktionen zur Bitmanipulation Bit...() mit 64-Bit Werten nichts anfangen.

    Es steht außer Zweifel, dass sich der Wert 0xFFFFFFF2 in 4 Bytes speichern lässt. Wenn diese 4 Bytes dann als 'signed integer' behandelt werden, ergibt das korrekterweise den Dezimalwert -14.

    Das Absurde daran ist für mich, dass für die o.a. 'magnitude' nicht nur der Wert sondern auch die Länge der Hexbytefolge berücksichtigt wird, sodass vorangestellte Nullen den Wertetyp (Int32 / Int64) beeinflussen.

  • Sehr große Zahlen addieren führt zum falschen Ergebnis

    • Velted
    • 15. November 2023 um 09:33

    Moin AspirinJunkie,

    danke für den Versuch. Ich bin nach wie vor der Meinung, dass das Verhalten so kaum erwartet wird. Es scheint aber in AutoIt konsistent zu sein:

    AutoIt
    ; Der Hexwert 0XFFFFFFF2 entspricht als Int dem Dezimalwert -14
    ; und als UInt dem Dezimalwert 4294967282
    MsgBox(0, "Positiv", Hex(4294967282))    ; => 00000000FFFFFFF2
    MsgBox(0, "Negativ", Hex(-14))           ; => FFFFFFF2

    Einem positiven Wert im Bereich von 0x80000000 bis 0xFFFFFFFF muss man offensichtlich zumindest eine 0 voranstellen. Die Doku sollte das allerdings 'deutlicher' beschreiben.

  • AutoIt-SQLite to HTML

    • Velted
    • 14. November 2023 um 22:48

    Moin,

    es gibt sicher unendlich viele Möglichkeiten, warum das nicht klappt. Der Fehler 26 sollte aber bereits bei _SQLite_Open() kommen, wenn die Datei korrupt ist. Ich vermute eher, dass der hier gezeigte Code nicht dem Code entspricht, der die Fehlermeldung erzeugt.

  • AutoIt-SQLite to HTML

    • Velted
    • 14. November 2023 um 13:48

    Ich nochmal:

    AutoIt
        $Db = _SQLite_Open("Mediathek.dbf", $SQLITE_OPEN_READWRITE + $SQLITE_OPEN_CREATE)         ; versuche die Mediathek-Datenbank zu öffnen

    Diese Anweisung wird nur äußerst selten einen Fehler zurückgeben, weil $SQLITE_OPEN_CREATE eine neue leere Datei erstellt, falls er für den Dateinamen keine findet.

  • AutoIt-SQLite to HTML

    • Velted
    • 14. November 2023 um 13:38
    Zitat von Result and Error Codes

    (26) SQLITE_NOTADB When attempting to open a file, the SQLITE_NOTADB error indicates that the file being opened does not appear to be an SQLite database file.

  • ListView Markierung mit den Pfeiltasten bewegen

    • Velted
    • 9. November 2023 um 14:08

    UEZ,

    ok. Ich denke, dass das mit AutoIt auch möglich ist. Es ist ja niemand gezwungen, die UDFs zu benutzen. Sie liefern viele Informationen darüber, wie man die Windows-API-Funktionen nutzt. Mit WinUser.h und CommCtrl.h kommt man aber auch schon recht weit.

    Viel Spaß weiterhin!

  • ListView Markierung mit den Pfeiltasten bewegen

    • Velted
    • 9. November 2023 um 12:22

    Moin UEZ,

    ich habe mir das nochmal durch den Kopf gehen lassen. Es geht in diesem Fall (soweit ich erkennen kann) nur darum, den Hintergrund der 3. Spalte mit einer selbstgewählten Farbe zu füllen, und das auch dann, wenn die Zeile selektiert ist. Wenn die 3. Spalte wie hier auch die letzte ist, reicht es deshalb wenn man sich ausschließlich mit ihr beschäftigt und alles andere dem ListView überlässt. Das Skript könnte dann so aussehen:

    AutoIt
    ;coded by LarsJ / Velted
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    
    Opt("MustDeclareVars", 1)
    
    Global $hGui, $hLV
    
    Example()
    
    
    Func Example()
    
        $hGui = GUICreate("Mark Cell in Listview", 500, 540)
    
        Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
        For $i = 0 To 99
            GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|" & Hex(Int(Random() * 0xFFFFFF), 6) & "|", $idLV0)
        Next
    
        $hLV = GUICtrlGetHandle($idLV0)
    
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    
    EndFunc   ;==>Example
    
    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        Local $iCode = DllStructGetData($tNMHDR, "code")
        If $hWndFrom = $hLV And $iCode = $NM_CUSTOMDRAW Then
            Return _LVSetColors($hWndFrom, DllStructCreate($tagNMLVCUSTOMDRAW, $lParam))
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_NOTIFY
    
    Func _LVSetColors($hWnd, $tNMLVCUSTOMDRAW)
        Switch DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")    ; Holds a value that specifies the drawing stage
            Case $CDDS_PREPAINT                                        ; Before the paint cycle begins
                Return $CDRF_NOTIFYITEMDRAW                         ; Notify the parent window of any ITEM-related drawing operations
            Case $CDDS_ITEMPREPAINT                                 ; Before painting an item
                Return $CDRF_NOTIFYSUBITEMDRAW                      ; Notify the parent window of any SUBITEM-related drawing operations
            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)             ; Before painting a subitem
                Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                If DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") = 2 Then ; Set the color for the 3rd column
                    If _GUICtrlListView_GetItemSelected($hWnd, $dwItemSpec) Then ; If the item is selected, clear the CDIS_SELECTED state bit.
                        Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
                        DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT($CDIS_SELECTED)))
                    EndIf
                    DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", Dec(_GUICtrlListView_GetItemText($hWnd, $dwItemSpec, 1)))
                    Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors
                Else
                    Return $CDRF_DODEFAULT    ; Let the ListView paint all other columns (1 & 2)
                EndIf
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>_LVSetColors
    Alles anzeigen

    Mir gefällt das besser.

  • ListView Markierung mit den Pfeiltasten bewegen

    • Velted
    • 8. November 2023 um 18:02
    Zitat von UEZ

    Gibt es eine Möglichkeit, dass die Farben in der 3 Spalte immer angezeigt werden, nicht nur bei der Selektion?

    So könnte es funktionieren:

    AutoIt
    ;coded by LarsJ / Velted
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    
    Opt("MustDeclareVars", 1)
    
    Global $hGui, $hLV, $iLVx, $iLVy
    
    Example()
    
    
    Func Example()
    
        $hGui = GUICreate("Mark Cell in Listview", 500, 540)
    
        Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
        For $i = 0 To 99
            GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|" & Hex(Int(Random() * 0xFFFFFF), 6) & "|", $idLV0)
        Next
        $hLV = GUICtrlGetHandle($idLV0)
        $iLVx = 25
        $iLVy = 10
    
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    
    EndFunc   ;==>Example
    
    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR, $hWndFrom, $iCode, $bIsSelected, $ClrText, $ClrTextBk
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
            Case $hLV
                Switch $iCode
                    ; Handle arrow key presses for selection movement
                    Case $NM_CUSTOMDRAW
                        Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                        Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                        Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                        Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                        Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
    
                        Switch $dwDrawStage                     ; Holds a value that specifies the drawing stage
                            Case $CDDS_PREPAINT                 ; Before the paint cycle begins
                                Return $CDRF_NOTIFYITEMDRAW     ; Notify the parent window of any ITEM-related drawing operations
                            Case $CDDS_ITEMPREPAINT             ; Before painting an item
                                Return $CDRF_NOTIFYSUBITEMDRAW  ; Notify the parent window of any SUBITEM-related drawing operations
                            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                                $bIsSelected = _GUICtrlListView_GetItemSelected($hLV, $dwItemSpec)
                                If $bIsSelected Then DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT($CDIS_SELECTED)))
                                Switch $iSubItem
                                    Case 0 To 1 ; Marked column
                                        $ClrText = $bIsSelected ? 0xFFFFFF : 0X0000000
                                        $ClrTextBk = $bIsSelected ? 0xCC6600 : 0xFFFFFF
                                    Case 2
                                        $ClrText = 0x000000
                                        $ClrTextBk = "0x" & _GUICtrlListView_GetItemText($hLV, $dwItemSpec, 1)
                                    Case Else ; Other columns
                                        Return $CDRF_DODEFAULT
                                EndSwitch
                                DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", $ClrText)     ; Forecolor black
                                DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", $ClrTextBk)     ; Backcolor white
                                Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors
                        EndSwitch
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_NOTIFY
    Alles anzeigen
    Zitat von UEZ

    Was macht eigentlich die Zeile?

    Das hast Du anscheinend selbst herausgefunden. (Sie löscht die States $CDIS_SELECTED und $CDIS_FOCUS).

  • ListView Markierung mit den Pfeiltasten bewegen

    • Velted
    • 8. November 2023 um 12:20

    Moin UEZ,

    vielleicht so?

    AutoIt
    ;coded by LarsJ
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    
    Opt("MustDeclareVars", 1)
    
    Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [-1, -1]    ; $aHit contains row & col of marked cell
    
    Example()
    
    
    Func Example()
    
        $hGui = GUICreate("Mark Cell in Listview", 500, 540)
    
        Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
        For $i = 0 To 99
            GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0)
        Next
        $hLV = GUICtrlGetHandle($idLV0)
        $iLVx = 25
        $iLVy = 10
    
        GUISetState()
    
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    
    EndFunc   ;==>Example
    
    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        Local $tNMHDR, $hWndFrom, $iCode
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
    
        Switch $hWndFrom
    
            Case $hLV
                Local $iSelectedItem = _GUICtrlListView_GetSelectionMark($hLV)
                ; ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hLV) & @CRLF)
    
                Switch $iCode
                    ; Handle arrow key presses for selection movement
                    Case $NM_CUSTOMDRAW
                        
                        Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                        Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                        Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                        Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                        Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state
    
                        Switch $dwDrawStage                     ; Holds a value that specifies the drawing stage
    
                            Case $CDDS_PREPAINT                 ; Before the paint cycle begins
                                Return $CDRF_NOTIFYITEMDRAW     ; Notify the parent window of any ITEM-related drawing operations
    
                            Case $CDDS_ITEMPREPAINT             ; Before painting an item
                                ConsoleWrite("Row: " & $dwItemSpec & " - State: " & $uItemState & @CRLF)
                                If _GUICtrlListView_GetItemSelected($hLV, $dwItemSpec) Then
                                    Return $CDRF_NOTIFYSUBITEMDRAW  ; Notify the parent window of any SUBITEM-related drawing operations
                                Else
                                    Return $CDRF_DODEFAULT
                                EndIf
    
                            Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                                DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT(0x11)))
                                Switch $iSubItem
                                    Case 0 To 1 ; Marked column
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
                                        DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
                                    Case Else ; Other columns
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000) ; Forecolor black
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) ; Backcolor white
                                EndSwitch
                                Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors
    
                        EndSwitch
    
                EndSwitch
    
        EndSwitch
    
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_NOTIFY
    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™