[Win] ListIconGadget mit Pfeilen für die Sortierrichtung
Verfasst: 17.02.2008 11:52
Morgen,
da ich die Suche hier und im englischen Forum nicht das brachte, was ich wollte bzw. mit PB4 nicht funktionierte, habe ich mal selbst was zusammengeklöppelt, um die Sortierrichtung in Listicongadgets mit Pfeilen (wie im Explorer) anzuzeigen. Hatte nämlich auch keine Lust, mich erst durch fremden Code zu wühlen oder riesige Fremdlibs einzubinden. Vielleicht gibt's da sogar eine Api-Funktion. Die habe ich aber nicht gefunden. Es werden wirklich nur die Pfeile gezeichnet. Die Eventabfrage für den Klick auf die Kopfzeile und das Sortieren selbst (geht bei mir über Datenbankabfrage) ist nicht mit drin. Aber im Beispiel ist das ja eingebaut. Sollte also jeder gleich loslegen können. Wer sowas einbauen will, kann den Code gerne benutzen, ausbauen und hier zur Verfügung stellen.
Verkleinern der Spalten sollte korrekt behandelt werden. Habe aber sicher nicht alle Möglichkeiten durchgetestet.
Die Erklärung der Parameter ist mit im Code.
Vielleicht kann es ja jemand gebrauchen.
Hier mal die Include-Datei:
Und noch ein Beispiel mit zwei ListIconGadgets
Beim Druck auf die Enter-Taste wird das untere Gadget wieder freigegeben und der Pfeil sollte verschwinden.
Gruß
bommel
da ich die Suche hier und im englischen Forum nicht das brachte, was ich wollte bzw. mit PB4 nicht funktionierte, habe ich mal selbst was zusammengeklöppelt, um die Sortierrichtung in Listicongadgets mit Pfeilen (wie im Explorer) anzuzeigen. Hatte nämlich auch keine Lust, mich erst durch fremden Code zu wühlen oder riesige Fremdlibs einzubinden. Vielleicht gibt's da sogar eine Api-Funktion. Die habe ich aber nicht gefunden. Es werden wirklich nur die Pfeile gezeichnet. Die Eventabfrage für den Klick auf die Kopfzeile und das Sortieren selbst (geht bei mir über Datenbankabfrage) ist nicht mit drin. Aber im Beispiel ist das ja eingebaut. Sollte also jeder gleich loslegen können. Wer sowas einbauen will, kann den Code gerne benutzen, ausbauen und hier zur Verfügung stellen.
Verkleinern der Spalten sollte korrekt behandelt werden. Habe aber sicher nicht alle Möglichkeiten durchgetestet.
Die Erklärung der Parameter ist mit im Code.
Vielleicht kann es ja jemand gebrauchen.
Hier mal die Include-Datei:
Code: Alles auswählen
; SortArrow.pbi
;
; zeichnen von Pfeilen zum Anzeigen der Sortierrichtung in ListIconGadgets
;
; SA_Register(SA_Window.l, SA_Gadget.l, SA_sortcol.b, SA_sortDir.b) - registriert ein ListIconGadget
; - SA_Window (Fenster, welches das ListIconGadget enthält)
; - SA_Gadget (das betreffende Gadget)
; - SA_sortcol (Spalte, die bei der Initialisierung den Pfeil enthält)
; - SA_sortDir (Pfeilrichtung bei der Initialisierung -> 0 = aufsteigend, 1 = absteigend)
;
; SA_Unregister(SA_Window.l, SA_Gadget.l) - entfernt ein Gadget aus dem System
; - SA_Gadget (das betreffende Gadget)
; SA_Change(SA_Gadget.l, SA_sortcol.b, SA_sortDir.b)
; - SA_Gadget (das betreffende Gadget)
; - SA_sortcol (die Spalte, in der der Pfeil angezeigt werden soll)
; - SA_sortDir (Pfeilrichtung bei der Initialisierung -> 0 = aufsteigend, 1 = absteigend)
;
; SA_DirFlip(SA_Gadget.l) - kehrt die Pfeilrichtung um
; - SA_Gadget (das betreffende Gadget)
;
; SA_GetDir(SA_Gadget.l) - gibt die Pfeilrichtung für das Gadget zurück (0 = aufsteigend, 1 = absteigend)
; - SA_Gadget (das betreffende Gadget)
;
; SA_GetSortColumn(SA_Gadget.l) - gibt die Spalte zurück, die den Pfeil enthält
; - SA_Gadget (das betreffende Gadget)
;
; SA_draw() - zeichnet die Pfeile (muß in der Eventschleife aufgerufen werden!)
Structure SortArrowGadget
Window.l
Gadget.l
left.l
top.l
sortcol.l
sortDir.l
EndStructure
Global NewList SA_Gadgets.SortArrowGadget()
Procedure SA_Register(SA_Window.l, SA_Gadget.l, SA_sortcol.b, SA_sortDir.b)
AddElement(SA_Gadgets())
SA_Gadgets()\Window = SA_Window
SA_Gadgets()\Gadget = SA_Gadget
SA_Gadgets()\left = GadgetX(SA_Gadgets()\Gadget)
SA_Gadgets()\top = GadgetY(SA_Gadgets()\Gadget)
SA_Gadgets()\sortcol = SA_sortcol
SA_Gadgets()\sortDir = SA_sortDir
EndProcedure
Procedure SA_Unregister(SA_Gadget.l)
ForEach SA_Gadgets()
If (SA_Gadgets()\Gadget = SA_Gadget)
; Kopfzeile neu zeichnen, um alte Pfeile zu löschen
SetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , GetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , SA_Gadgets()\sortcol), SA_Gadgets()\sortcol)
DeleteElement(SA_Gadgets())
Break
EndIf
Next
EndProcedure
Procedure SA_Change(SA_Gadget.l, SA_sortcol.b, SA_sortDir.b)
ForEach SA_Gadgets()
If (SA_Gadgets()\Gadget = SA_Gadget) And (SA_Gadgets()\Window = SA_Window)
; Kopfzeile neu zeichnen, um alte Pfeile zu löschen
SetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , GetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , SA_Gadgets()\sortcol), SA_Gadgets()\sortcol)
SA_Gadgets()\sortcol = SA_sortcol
SA_Gadgets()\sortDir = SA_sortDir
Break
EndIf
Next
EndProcedure
Procedure SA_DirFlip(SA_Gadget.l)
ForEach SA_Gadgets()
If (SA_Gadgets()\Gadget = SA_Gadget) And (SA_Gadgets()\Window = SA_Window)
If SA_Gadgets()\sortDir = 1
SA_Gadgets()\sortDir = 0
Else
SA_Gadgets()\sortDir = 1
EndIf
Break
EndIf
Next
EndProcedure
Procedure.l SA_GetDir(SA_Gadget.l)
ForEach SA_Gadgets()
If (SA_Gadgets()\Gadget = SA_Gadget) And (SA_Gadgets()\Window = SA_Window)
ProcedureReturn SA_Gadgets()\sortDir
EndIf
Next
EndProcedure
Procedure.l SA_GetSortColumn(SA_Gadget.l)
ForEach SA_Gadgets()
If (SA_Gadgets()\Gadget = SA_Gadget) And (SA_Gadgets()\Window = SA_Window)
ProcedureReturn SA_Gadgets()\sortcol
EndIf
Next
EndProcedure
Procedure SA_draw()
grey = RGB(130, 130, 130)
Static drawoffsety = 8
ForEach SA_Gadgets()
colwidth = 0
For countcol = 0 To SA_Gadgets()\sortcol-1
colwidth + GetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , countcol)
Next
drawx = SA_Gadgets()\left
drawy = SA_Gadgets()\top
StartDrawing(WindowOutput(SA_Gadgets()\Window))
DrawingFont(GetGadgetFont(SA_Gadgets()\Gadget))
drawoffsetx = TextWidth(GetGadgetItemText(SA_Gadgets()\Gadget, -1, SA_Gadgets()\sortcol)) + 15
If GetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , SA_Gadgets()\sortcol) < drawoffsetx+10
If Right(GetGadgetItemText(SA_Gadgets()\Gadget, -1, SA_Gadgets()\sortcol), 2) <> " "
SetGadgetItemText(SA_Gadgets()\Gadget, -1, RTrim(GetGadgetItemText(SA_Gadgets()\Gadget, -1, SA_Gadgets()\sortcol))+" ", SA_Gadgets()\sortcol)
EndIf
drawoffsetx = GetGadgetItemAttribute(SA_Gadgets()\Gadget, -1, #PB_ListIcon_ColumnWidth , SA_Gadgets()\sortcol)-8
Else
If Right(GetGadgetItemText(SA_Gadgets()\Gadget, -1, SA_Gadgets()\sortcol), 2) = " "
SetGadgetItemText(SA_Gadgets()\Gadget, -1, RTrim(GetGadgetItemText(SA_Gadgets()\Gadget, -1, SA_Gadgets()\sortcol)), SA_Gadgets()\sortcol)
EndIf
EndIf
If SA_Gadgets()\sortDir = 1
Line(drawx+colwidth+drawoffsetx,drawy+drawoffsety,7,0, grey)
Line(drawx+colwidth+drawoffsetx+1,drawy+drawoffsety+1,5,0, grey)
Line(drawx+colwidth+drawoffsetx+2,drawy+drawoffsety+2,3,0, grey)
Plot(drawx+colwidth+drawoffsetx+3,drawy+drawoffsety+3, grey)
Else
Plot(drawx+colwidth+drawoffsetx+3,drawy+drawoffsety, grey)
Line(drawx+colwidth+drawoffsetx+2,drawy+drawoffsety+1,3,0, grey)
Line(drawx+colwidth+drawoffsetx+1,drawy+drawoffsety+2,5,0, grey)
Line(drawx+colwidth+drawoffsetx,drawy+drawoffsety+3,7,0, grey)
EndIf
StopDrawing()
Next
EndProcedure
Beim Druck auf die Enter-Taste wird das untere Gadget wieder freigegeben und der Pfeil sollte verschwinden.
Code: Alles auswählen
Enumeration
#MainWindow
#ListIcon_1
#ListIcon_2
EndEnumeration
IncludeFile "SortArrows.pbi"
Procedure Open_Window()
If OpenWindow(#MainWindow, 5, 5, 450, 420, "SortArrow Example", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#MainWindow))
ListIconGadget(#ListIcon_1, 0, 0, 760, 200, "Spalte1", 70, #PB_ListIcon_GridLines)
AddGadgetColumn(#ListIcon_1, 1, "Spalte2", 120)
AddGadgetColumn(#ListIcon_1, 2, "Spalte3", 80)
AddGadgetColumn(#ListIcon_1, 3, "Spalte4", 80)
ListIconGadget(#ListIcon_2, 0, 210, 760, 200, "Spalte1", 90, #PB_ListIcon_GridLines)
AddGadgetColumn(#ListIcon_2, 1, "Spalte2", 100)
AddGadgetColumn(#ListIcon_2, 2, "Spalte3", 90)
AddGadgetColumn(#ListIcon_2, 3, "Spalte4", 70)
AddGadgetColumn(#ListIcon_2, 4, "Spalte5", 100)
EndIf
EndIf
EndProcedure
Procedure wndproc(hwnd,msg,wParam,lParam)
retrn=#PB_ProcessPureBasicEvents
Select msg
Case #WM_NOTIFY
*pnmhdr.NMHDR=lParam
If *pnmhdr\code=#LVN_COLUMNCLICK
*pnmlistview.NMLISTVIEW=lParam
If *pnmlistview\hdr\hwndFrom=GadgetID(#ListIcon_1)
sortcolumn=*pnmlistview\iSubItem
Select sortcolumn
Case 1
;Aktionen für Spalte1
Case 2
;Aktionen für Spalte2
;usw.
EndSelect
If SA_GetSortColumn(#ListIcon_1) <> sortcolumn
SA_Change(#ListIcon_1, sortcolumn, 0)
Else
SA_DirFlip(#ListIcon_1)
EndIf
oldsortcolumn = sortcolumn
ElseIf *pnmlistview\hdr\hwndFrom=GadgetID(#ListIcon_2)
sortcolumn=*pnmlistview\iSubItem
Select sortcolumn
Case 1
;Aktionen für Spalte1
Case 2
;Aktionen für Spalte2
;usw.
EndSelect
If SA_GetSortColumn(#ListIcon_2) <> sortcolumn
SA_Change(#ListIcon_2, sortcolumn, 0)
Else
SA_DirFlip(#ListIcon_2)
EndIf
EndIf
EndIf
EndSelect
ProcedureReturn retrn
EndProcedure
Open_Window()
SetWindowCallback(@wndproc())
SA_Register(#MainWindow, #ListIcon_1, 1, 1)
SA_Register(#MainWindow, #ListIcon_2, 3, 0)
Repeat ; Eventschleife
SA_draw() ; Pfeile zeichnen
Event = WaitWindowEvent(1)
If Event = #WM_KEYDOWN
Select EventwParam()
Case #VK_RETURN
SA_Unregister(#ListIcon_2)
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
bommel