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

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Nussbeisser
Posts: 109
Joined: 17 Jul 2019, 08:49

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

Post by Nussbeisser » 23 May 2022, 09:30

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!

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 23 May 2022, 23:01

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?

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 24 May 2022, 11:20

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

Nussbeisser
Posts: 109
Joined: 17 Jul 2019, 08:49

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

Post by Nussbeisser » 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.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 24 May 2022, 14:53

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 ;)

Nussbeisser
Posts: 109
Joined: 17 Jul 2019, 08:49

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

Post by Nussbeisser » 24 May 2022, 15:58

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 1269 times

garry
Posts: 3750
Joined: 22 Dec 2013, 12:50

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

Post by garry » 24 May 2022, 16:50

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
}
;=========================================================

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 24 May 2022, 23:01

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.

Nussbeisser
Posts: 109
Joined: 17 Jul 2019, 08:49

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

Post by Nussbeisser » 25 May 2022, 08:47

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

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 26 May 2022, 04:53

: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!

Nussbeisser
Posts: 109
Joined: 17 Jul 2019, 08:49

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

Post by Nussbeisser » 27 May 2022, 06:32

Vielen Dank! an euch beiden.
Bin Wunschlos happy :)

just me
Posts: 9439
Joined: 02 Oct 2013, 08:51
Location: Germany

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

Post by just me » 31 May 2022, 06:40

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!).
Last edited by BoBo on 31 May 2022, 09:29, edited 1 time in total.
Reason: Anmerkung: 'Switch'-Befehl Mindestvoraussetzung - AutoHotkey [v1.1.31+]. HTH

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

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

Post by BoBo » 31 May 2022, 09:39

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:

Post Reply

Return to “Ich brauche Hilfe”