Page 1 of 1

Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 23 May 2022, 09:30
by Nussbeisser
Hallo,
gibt es eine Möglichkeit, dass wenn man auf eine Listview Spaltenüberschrift klickt, dass die gesamte Spalte markiert wird.
Sowie bei Excel auch, wenn man die Strg-Taste fest hält und mehrere Spalten anklickt, werden die Spalten markiert.

Mit Zeilen funktioniert es, wenn ich Strg oder Umschalt-Taste festhalte, kann ich mit der Maus mehrere Zeilen markieren aber mit Spalten funktioniert es nicht.


Wenn ich mein Listview ein g-Label gebe, kann ich die angeklickte Spalte mit:

Code: Select all

if (A_GuiEvent = "ColClick")
MsgBox, % A_EventInfo
herausfinden. Vielleicht, hilft das weiter.

schöne Grüße und vielen Dank!

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 23 May 2022, 23:01
by BoBo
Vielleicht lässt es sich damit schon annähern: viewtopic.php?p=292955#p292955 by @just me :)
Geht es um das visuelle "markieren" oder doch eigentlich um die Erfassung der Inhalte einer Spalte from top to bottom?

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren  Topic is solved

Posted: 24 May 2022, 11:20
by BoBo
@Nussbeisser

"Full credit goes to..." Forum-Mitglied @teadrinker, der es für dich gelöst hat: viewtopic.php?p=464049#p464049 :clap:
Der Inhalt der selektierten Spalte lässt sich dabei über ein Array abfragen.

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 24 May 2022, 14:48
by Nussbeisser
@BoBo Danke, für deine Mühe! Mir geht es um visuelle Markierung. An die Inhalt der Spalten komme ich ohne Probleme.

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 24 May 2022, 14:53
by BoBo
Nussbeisser wrote:
24 May 2022, 14:48
@BoBo Danke, für deine Mühe! Mir geht es um visuelle Markierung. An die Inhalt der Spalten komme ich ohne Probleme.
Na dann - einfach mal ausprobieren, denn genau das macht es jetzt ;)

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 24 May 2022, 15:58
by Nussbeisser
Ich habe jetzt alle Vorschläge von Teadrinker im Beitrag ausprobiert, bei mir funktioniert es nicht.
Wenn ich F1 drücke, erhalte ich den Inhalt der Spalten, aber eine Hervorhebung der Spalten erkenne ich nicht.
siehe mein gif:
TeadrinkerListView.gif
TeadrinkerListView.gif (256 KiB) Viewed 1324 times

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 24 May 2022, 16:50
by garry
durch klick auf header wird der Inhalt dieser column angezeigt , z.B Col 3 > alle rows von column-3
( weiss nicht ob dies erwünscht ist ( ? ) )

Code: Select all

LVM_SETEXTENDEDLISTVIEWSTYLE := 0x1036
LVM_GETSELECTEDCOLUMN        := 0x10AE
LVS_EX_DOUBLEBUFFER          := 0x010000
;--------------------------------------
Gui,1:default
Gui, Add, ListView, w350 hwndhLV NoSort gMLV Grid R15 AltSubmit, Col 1|Col 2|Col 3|Col 4
handler := Func("OnNotify").Bind(hLV)
GuiControl, +g, % hLV, % handler
Loop 15
   LV_Add("", "Field 1-" . A_Index, "Field 2-" . A_Index, "Field 3-" . A_Index, "Field 4-" . A_Index)
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, 80)
Gui, Show
SendMessage, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER,, ahk_id %hLV%
Return
;--------------------------------------------------------
MLV:
Gui,1:ListView,%a_guicontrol%
If A_GuiEvent = ColClick
{
e:=""
   SendMessage, LVM_GETSELECTEDCOLUMN,,,, ahk_id %hLV%
   if !col := ErrorLevel + 1
      Return
   textArr := []
   Loop % LV_GetCount() {
      LV_GetText(text, A_Index, col)
      textArr.Push(text)
      e .= text . "`r`n"
   }
   msgbox,%e%
   e:=""
}   
Return
;----------------------------------------------------------   
OnNotify(hLV) {
   static LVM_SETSELECTEDCOLUMN := 0x108C
   if (A_GuiEvent = "Normal")
      SendMessage, LVM_SETSELECTEDCOLUMN, -1,,, ahk_id %hLV%
   if (A_GuiEvent = "ColClick") {
      while selectedRow := LV_GetNext()
         LV_Modify(selectedRow, "-Select")
      SendMessage, LVM_SETSELECTEDCOLUMN, A_EventInfo - 1,,, ahk_id %hLV%
gosub,mlv	  
   }
}
GuiClose() {
   ExitApp
}
;=========================================================

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 24 May 2022, 23:01
by BoBo
Das Script von 17:49 funktioniert bei mir problemlos: Druck auf Spaltenkopf selektiert die Spalte optisch. Druck auf Hotkey liefert den Spaltenwert.
Druck auf eine Reihe deselected die Spalte optisch: viewtopic.php?p=464049#p464049

Btw, ich sehe im screencast von Nussbeisser sehr wohl das die Spalte optisch selektiert wird (in Farbe des GUI-Rahmens, NICHT in Blau wie bei Auswahl einer Reihe!!), wenn auch (auf meinem tablet) nur schwach erkenntlich.

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 25 May 2022, 08:47
by Nussbeisser
Danke @BoBo und @teadrinker
Es liegt offensichtlich an mein System Farbeinstellungen.
wenn ich mein GUI
Gui, Color, White,Black
oder Listview die Optionen gebe, erkenne ich am mein System auch die Markierung
BackgroundBlack CWhite

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 26 May 2022, 04:53
by BoBo
:o @teadrinker hat die farbliche Anpassung der Spaltenauswahl (with a little help from @just me) umgesetzt :thumbup:
viewtopic.php?p=464309#p464309
… und eine Mehrfachspaltenauswahl gibts dort auch schon!

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 27 May 2022, 06:32
by Nussbeisser
Vielen Dank! an euch beiden.
Bin Wunschlos happy :)

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 31 May 2022, 06:40
by just me
Moin,

weil mich das Thema interessiert hat, habe ich eine Minimalvariante von teadrinker's Klasse erstellt. Man muss die Spalten 'händisch' setzen, z.B. aus dem ListView-Label heraus:

Code: Select all

#NoEnv
SetBatchLines, -1
Gui, Margin, 20, 20
Gui, Add, ListView, w400 r12 hwndHLV1 +Grid +NoSort +LV0x010000 gLV1_Event, Column 1|Column 2|Column 3|Column 4
Loop, 16
   LV_Add("", A_Index . "1", A_Index . "2", A_Index . "3", A_Index . "4")
LV_ModifyCol(LV_GetCount("Col"), "AutoHdr")
Gui, Show, , ListView with colored columns
Return

LV1_Event:
   If (A_GuiEvent = "ColClick")
      LV_SelectColumns.Select(HLV1, A_EventInfo, GetKeyState("Ctrl", "P"))
Return

GuiClose:
ExitApp


; ======================================================================================================================
; LV_SelectColumns - Select columns in a list-view to be drawn using the selection colors
; ======================================================================================================================
Class LV_SelectColumns {
   Static Ctrls := []
   Static MsgFunc := ObjBindMethod(LV_SelectColumns, "Draw")
   ; ===================================================================================================================
   __New(P*) {
      Return False ; don't allow instances
   }
   ; ===================================================================================================================
   ; Store selected columns
   ; HLV       - handle of the list-view
   ; Col       - 1-based column index
   ; CtrlDown  - is the Ctrl key down?
   ; ===================================================================================================================
   Select(HLV, Col, CtrlPressed) {
      If !This.Ctrls.HasKey(HLV) || !CtrlPressed
         This.Ctrls[HLV] := {(Col): 1}
      Else {
         If This.Ctrls[HLV].HasKey(Col) {
            This.Ctrls[HLV].Delete(Col)
            If !This.Ctrls[HLV].Count()
               This.Ctrls.Delete(HLV)
         }
         Else
            This.Ctrls[HLV, Col] := 1
      }
      This.Check()
      WinSet, Redraw, , ahk_id %HLV%
   }
   ; ===================================================================================================================
   ; Clear the entry for the passed list-view control
   ; ===================================================================================================================
   Clear(HLV) {
      If This.Ctrls.HasKey(HLV) {
         This.Ctrls.Delete(HLV)
         This.Check()
         WinSet, Redraw, , ahk_id %HLV%
      }
   }
   ; ===================================================================================================================
   ; Draw the selected columns - for unternal use
   ; ===================================================================================================================
   Draw(W, L, M, HWND := "") {
      Static CDRF_NEWFONT := 0x02
      Static CB := DllCall("GetSysColor", "Int", 13, "UInt") ; COLOR_HIGHLIGHT
      Static CT := DllCall("GetSysColor", "Int", 14, "UInt") ; COLOR_HIGHLIGHTTEXT
      Static DB := 0 ; default background color
      Static DT := 0 ; default text color
      Static NMHDRSize := A_PtrSize * 3 ; size off NMHDR structure
      Static NCDSize := NMHDRSize + (4 * 4) + (A_PtrSize * 5) ; size of NMCUSTOMDRAW structure
      Critical
      H := NumGet(L + 0, 0, "UPtr")
      C := NumGet(L + (A_PtrSize * 2), 0, "Int")
      ; NM_CUSTOMDRAW --------------------------------------------------------------------------------------------------
      If (This.Ctrls.HasKey(H) && (C = -12)) { ; NM_CUSTOMDRAW = -12
         Stage := NumGet(L + NMHDRSize, 0, "UInt")
         Switch Stage {
            ; CDDS_SUBITEMPREPAINT -------------------------------------------------------------------------------------
            Case 0x00030001:
               SubItem := NumGet(L + NCDSize, 8, "Int") + 1
               If This.Ctrls[H].HasKey(SubItem) {
                  NumPut(CT, L + NCDSize,  0, "UInt") ; clrText
                  NumPut(CB, L + NCDSize,  4, "UInt") ; clrTextBk
                  NumPut(CB, L + NCDSize, 16, "UInt") ; clrFace
               }
               Else {
                  NumPut(DT, L + NCDSize,  0, "UInt") ; clrText
                  NumPut(DB, L + NCDSize,  4, "UInt") ; clrTextBk
                  NumPut(DB, L + NCDSize, 16, "UInt") ; clrFace
               }
               Return 0x20 ; CDRF_NOTIFYITEMDRAW
            ; CDDS_ITEMPREPAINT ----------------------------------------------------------------------------------------
            Case 0x00010001:
               Return 0x20 ; CDRF_NOTIFYITEMDRAW
            ; CDDS_PREPAINT --------------------------------------------------------------------------------------------
            Case 0x00000001:
               DB := DllCall("SendMessage", "Ptr", H, "UInt", 0x1025, "Ptr", 0, "Ptr", 0, "UInt") ; LVM_GETTEXTBKCOLOR
               DT := DllCall("SendMessage", "Ptr", H, "UInt", 0x1023, "Ptr", 0, "Ptr", 0, "UInt") ; LVM_GETTEXTCOLOR
               Return 0x20 ; CDRF_NOTIFYITEMDRAW
            ; Default --------------------------------------------------------------------------------------------------
            Default:
               Return 0x00 ; CDRF_DODEFAULT
         }
      }
   }
   ; ===================================================================================================================
   ; Check whether the massage handler needs to be active
   ; ===================================================================================================================
   Check() {
      Static Drawing := False
      If (Drawing) {
         If !This.Ctrls.Count() {
            OnMessage(0x004E, This.MsgFunc, 0)
            Drawing := False
         }
      }
      Else {
         If This.Ctrls.Count() {
            OnMessage(0x004E, This.MsgFunc, -1)
            Drawing := True
         }
      }
   }
}
Wem die Systemauswahlfarben nicht gefallen, der kann in der Methode Draw() die statischen Variablen CB (Hintergrund) und CT (Text) auf die eigenen Wunschfarben setzen (Achtung: BGR!).

Re: Listview: klick auf die Spaltenüberschrift, soll die gesamte Spalte auswählen / markieren

Posted: 31 May 2022, 09:39
by BoBo
Danke für's Teilen. Schreit bei mir dann prompt nach einem AHK Update, weil wg. Switch [v1.1.31+] und so :silent:
Also Leuts, ... ist mal wieder soweit MsgBox % A_AHKVersion

PS: https://www.youtube.com/watch?v=vdRRozvf-9A :mrgreen: