LIG: Welche Spalten sind aktuell sichtbar?
LIG: Welche Spalten sind aktuell sichtbar?
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..
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..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])
Re: LIG: Welche Spalten sind aktuell sichtbar?
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.
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?
Quick & Dirty:
- Aber was sagen mir nun die Werte?
- Warum ist die "0" von left irgendwo im vorderen Drittel der Scrollbreite?
- Aber was sagen mir nun die Werte?
- Warum ist die "0" von left irgendwo im vorderen Drittel der Scrollbreite?
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])
(PB 6.03 LTS [x86])
Re: LIG: Welche Spalten sind aktuell sichtbar?
Oh mann..
Die Werte beziehen sich auf den Bildschirm..
Die Werte beziehen sich auf den Bildschirm..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])
Re: LIG: Welche Spalten sind aktuell sichtbar?
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?
@techniker: Kannst Du kurz erklären, warum Du diese Funktionalität benötigst? Evtl. findet sich ein anderer Lösungsansatz.
Grüße ... Peter
Grüße ... Peter
Hygge
Re: LIG: Welche Spalten sind aktuell sichtbar?
Klar - aber das ist etwas aufwändiger..
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:
Die Prozedur "GetColFromCoord" sieht dann symbolisch wie folgt aus:
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..
Danke.
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)
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)
....
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..
Danke.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])
Re: LIG: Welche Spalten sind aktuell sichtbar?
Ach ja: Der Vollständigkeit halber:
Berechnung der Spaltennummer erfolgt nun zu Fuß -> Alles OK
PS: GetColumnCount und GetColumnWidth sind Prozeduren..
Berechnung der Spaltennummer erfolgt nun zu Fuß -> Alles OK
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
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
(PB 6.03 LTS [x86])