LIG: Welche Spalten sind aktuell sichtbar?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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)
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag von techniker »

Oh mann..
Die Werte beziehen sich auf den Bildschirm.. /:->
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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
Hygge
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: LIG: Welche Spalten sind aktuell sichtbar?

Beitrag 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..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Antworten