Seite 1 von 1
"CountListIconColumns" ohne API?
Verfasst: 27.09.2007 14:58
von Kurzer
Hallo,
hier im Forum habe ich nur API-bezogene Lösungen gefunden.
Gibt es wirklich keine reine PB-Lösung dafür, um rauszufinden, wieviele Spalten ein ListIcon Gadget hat?
(außer anfangs beim AddGadgetItem mitzuzählen)
Verfasst: 27.09.2007 15:15
von Fluid Byte
Nein.
Verfasst: 27.09.2007 15:40
von Kurzer
Danke, dann hör ich auf danach zu suchen.

Verfasst: 27.09.2007 19:54
von hjbremer
Probiere dies einmal:
Code: Alles auswählen
#Gadget_1 = 0
#maxspalten=5 ;Anzahl Spalten ab 0, also bei 5 = 6 Spalten
If OpenWindow(0,0,0,400,550, "",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
hLV = ListIconGadget(#Gadget_1,20,0,365,500, "1", 90,#PB_ListIcon_GridLines)
For j = 1 To #maxspalten
AddGadgetColumn(#Gadget_1, j, Str(j+1), 90+j)
Next
EndIf
For j = 1 To 10
AddGadgetItem(#Gadget_1,-1,"Links"+Str(j) + #LF$ + "Mitte" + #LF$ + "Rechts")
Next
;------------
col=0:flag=0
Repeat
col+1
breite = GetGadgetItemAttribute(#Gadget_1, 0, #PB_ListIcon_ColumnWidth , col) >> 16
Until breite
Debug col
;-----------
Repeat ;
EventID=WaitWindowEvent()
Until EventID=#PB_Event_CloseWindow
EndIf
End
Verfasst: 27.09.2007 21:06
von edel
Cool, enthaelt allerdings einen Fehler mit den Spalten, der Index
faengt bei 0 an nicht bei 1. Ich habe mir mal erlaubt daraus eine
Procedure zu basteln.
Code: Alles auswählen
Procedure CountGadgetColumn(Gadget)
Protected column
Protected width
Protected flag
If IsGadget(Gadget)
If GadgetType(Gadget) = #PB_GadgetType_ListIcon
flag = #PB_ListIcon_ColumnWidth
ElseIf GadgetType(Gadget) = #PB_GadgetType_ExplorerList
flag = #PB_Explorer_ColumnWidth
Else
ProcedureReturn -1
EndIf
Else
ProcedureReturn -1
EndIf
Repeat
width = GetGadgetItemAttribute(Gadget,0,flag, column) >> 16
column + 1
Until width
ProcedureReturn column - 1
EndProcedure
Verfasst: 27.09.2007 21:53
von Kurzer
Hui, fein... aber irgendwie ist das ganze bei mir (Win98SE) nicht ganz zuverlässig.
Ich habe aus Euren beiden Beispielen jetzt diesen Testcode zusammengabaut.
Code: Alles auswählen
#Gadget_1 = 0
#maxspalten=5 ;Anzahl Spalten ab 0, also bei 5 = 6 Spalten
Procedure CountGadgetColumn(Gadget)
Protected column
Protected width
Protected flag
If IsGadget(Gadget)
If GadgetType(Gadget) = #PB_GadgetType_ListIcon
flag = #PB_ListIcon_ColumnWidth
ElseIf GadgetType(Gadget) = #PB_GadgetType_ExplorerList
flag = #PB_Explorer_ColumnWidth
Else
ProcedureReturn -1
EndIf
Else
ProcedureReturn -1
EndIf
Repeat
width = GetGadgetItemAttribute(Gadget,0,flag, column) >> 16
column + 1
Until width
ProcedureReturn column - 1
EndProcedure
If OpenWindow(0,0,0,400,550, "",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
hLV = ListIconGadget(#Gadget_1,20,0,365,500, "1", 90,#PB_ListIcon_GridLines)
For j = 1 To #maxspalten
AddGadgetColumn(#Gadget_1, j, Str(j+1), 90+j)
Next
EndIf
For j = 1 To 10
AddGadgetItem(#Gadget_1,-1,"Links"+Str(j) + #LF$ + "Mitte" + #LF$ + "Rechts")
Next
Debug CountGadgetColumn(#Gadget_1)
Repeat ;
EventID=WaitWindowEvent()
Until EventID=#PB_Event_CloseWindow
EndIf
End
Und es kommt bei jedem Durchlauf ein anderer (utopischer) Wert heraus. Manchmal allerdings auch die 6.

Verfasst: 27.09.2007 21:58
von Fluid Byte
Hui! Hab ich was verpasst? Kein einziger der Codes läuft bei mir. Verfallen alle in eine Endlosschleife.
Verfasst: 27.09.2007 23:30
von hjbremer
Wer hätte gedacht, das die unterschiedlichen Windowsysteme jeweils bei fehlender Spalte andere Werte zurückgeben.
Abhilfe könnte folgendes bringen. Nicht um 16 Bit schieben, sondern weniger.
Es geht ja um folgendes: wenn eine Spalte existiert wird der korrekte Wert zurückgegeben von GetGadgetItemAttribute, bei einer fehlenden Spalte wird ein undefinierter Wert zurückgegeben. Dieser ist meist so groß, das die höherwertigen Bits gesetzt sind. 16 Bit hatte ich gewählt, weil ich dachte das dieser undefinierte Wert immer größer als eine Integerzahl ist. Falsch gedacht.
Es reicht auch um 10 Bits zu schieben. Das entspräche einer Spaltenbreite von bis zu 1024 oder 11 Bits wäre 2048 Spaltenbreite. Wer hat schon mehr.
Außerdem ist das sowieso alles akademisch, Lang Lebe API
hlv=GadgetID(listicongadget_pbnr)
Header = SendMessage_(hlv ,#LVM_GETHEADER,0,0)
col = SendMessage_(Header,#HDM_GETITEMCOUNT,0,0)
und wer bei null beginnen will, muß halt 1 abziehen
Verfasst: 28.09.2007 20:05
von Fluid Byte
Noch kürzer!
Code: Alles auswählen
SendMessage_(GetWindow_(GadgetID(GID),#GW_CHILD),#HDM_GETITEMCOUNT,0,0)
Verfasst: 28.09.2007 20:56
von Kurzer
@ Fluid Byte: Funzt super!
Ist zwar nun doch wieder API, aber die PB-Only Lösungen funktionieren ja nicht zuverlässig.
Code: Alles auswählen
#Gadget_1 = 0
#maxspalten=5 ;Anzahl Spalten ab 0, also bei 5 = 6 Spalten
If OpenWindow(0,0,0,400,550, "",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
hLV = ListIconGadget(#Gadget_1,20,0,365,500, "1", 90,#PB_ListIcon_GridLines)
For j = 1 To #maxspalten
AddGadgetColumn(#Gadget_1, j, Str(j+1), 90+j)
Next
EndIf
For j = 1 To 10
AddGadgetItem(#Gadget_1,-1,"Links"+Str(j) + #LF$ + "Mitte" + #LF$ + "Rechts")
Next
Debug SendMessage_(GetWindow_(GadgetID(#Gadget_1),#GW_CHILD),#HDM_GETITEMCOUNT,0,0)
Repeat ;
EventID=WaitWindowEvent()
Until EventID=#PB_Event_CloseWindow
EndIf
End
Nebnbei hab ich jetzt auch gelernt, daß SendMessage_ Werte zurückgeben kann.
