Seite 1 von 1

LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 09:48
von techniker
Hallo!

Ich habe hier ein LIG mit vielen (variable Anzahl) Spalten.. ;-)
-> Wie kann ich am einfachsten ermitteln, welche Spalten gerade (wenn auch nur zum Teil) sichtbar sind?

Schöne Grüße

PS: Betriebssystem ausschließlich Windows - d.h. API erlaubt.. 8)

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 10:03
von RSBasic
Ich kenn nur die Möglichkeit, die sichtbaren Einträge zu ermitteln.
Aber du kannst mit Hilfe der Handle-Nummer der Spalten (#LVM_GETHEADER) die Position und Größe ermitteln (GetWindowRect_()) und damit prüfen, ob diese innerhalb des sichtbaren Fensters sind.

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 10:25
von techniker
Quick & Dirty:
- Aber was sagen mir nun die Werte?
- Warum ist die "0" von left irgendwo im vorderen Drittel der Scrollbreite? :cry:

Code: Alles auswählen

EnableExplicit

Define EventID
Define a
Define b
Define r.RECT
Define header

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(0, 10, 10,480,250, "Column 1", 100,#PB_ListIcon_GridLines)
  For a = 1 To 25
    AddGadgetColumn(0,a, "Column " + Str(a+1), Random(100)+50)
  Next
  For b = 0 To 6
    AddGadgetItem(0, -1, "Item 1"+Chr(10)+"Item 2"+Chr(10)+"Item 3"+Chr(10)+"Item 4")
  Next
  
  header  = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
  
  Repeat
    GetWindowRect_(header, @r)
    Debug "r\left: "+Str(r\left)+"  |  r\right: "+Str(r\right)

    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 10:44
von techniker
Oh mann..
Die Werte beziehen sich auf den Bildschirm.. /:->

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 10:55
von RSBasic
Ja, natürlich sind das absolute Werte. Diese musst du noch mit den RECT-Werten deines Fensters bzw. deines ListIconGadgets abziehen. Dann hast du relative Werte.

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 11:02
von Kiffi
@techniker: Kannst Du kurz erklären, warum Du diese Funktionalität benötigst? Evtl. findet sich ein anderer Lösungsansatz.

Grüße ... Peter

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 11:21
von techniker
Klar - aber das ist etwas aufwändiger.. 8)

Ich habe hier eine komplexe Erweiterung (komplett auf CB basierend) des LIG mit div. Editierfunktionen.
Darunter passe ich u.a. auch die Farben der einzelnen Spalten dynamisch an.
Im Prinzip funktioniert alles - allerdings habe ich gerade einen unschönen Bug entdeckt.. /:->

Ich fange u.a. auch die Cursortasten ab, um damit die Position in der LIG zu verändern.

In der Callback fange ich folgendes Event (nicht funktionaler Ausschnitt) ab:

Code: Alles auswählen

      Case #WM_NOTIFY
        *WmNotify=lParam
....
        Select *WmNotify\code
....                  
                Case #CDDS_ITEMPREPAINT
....
                    GetColFromCoord(ListIconGadget, *pnmcd, @CellInfo)
Die Prozedur "GetColFromCoord" sieht dann symbolisch wie folgt aus:

Code: Alles auswählen

    Protected I.LVHITTESTINFO
....    
    I\pt\x =  *pnmcd\rc\left - GetScrollPos_(GadgetID(Gadget), #SB_HORZ)
    I\pt\y = *pnmcd\rc\top
....
    SendMessage_(GadgetID(Gadget), #LVM_SUBITEMHITTEST, 0, @I)
....
Nach einiger Ursachenforschung habe ich nun festgestellt, dass "GetScrollPos_(GadgetID(Gadget), #SB_HORZ)"
zu diesem Zeitpunkt noch den alten (falschen) Wert liefert. D.h. ich bekomme bei der Berechnung der Spalte die
falschen Werte und ändere somit die Farben in der falschen Spalte.

Das ganze passiert aber nur, wenn ich per Cursor aus dem Sichtbereich springen "muss". Die Reihenfolge der
Events kann ich ja nicht beeinflussen. Wenn ich in der aktuellen Ansicht bleibe funktioniert die Zuweisung tadellos.
Auch ein Scrollen am Scrollbalken funktioniert. das Problem ist nur (per Debug-Ausgaben überprüft) die Reihenfolge
der eintreffenden Events.

Daher suche ich eine andere Möglichkeit die aktuell sichtbaren Spaltennummern zu extrahieren.

Den Originalcode darf ich leider nicht posten bzw. dieser ist auch nicht das Problem.. :wink:

Danke.

Re: LIG: Welche Spalten sind aktuell sichtbar?

Verfasst: 09.04.2018 15:25
von techniker
Ach ja: Der Vollständigkeit halber:
Berechnung der Spaltennummer erfolgt nun zu Fuß -> Alles OK :allright:

Code: Alles auswählen

    For column = 0 To GetColumnCount(Gadget) - 1
      If *pnmcd\rc\left <= x_offset : Break : EndIf
      x_offset + GetColumnWidth(Gadget, column)
    Next
    *Data\Column = column
PS: GetColumnCount und GetColumnWidth sind Prozeduren..