"CountListIconColumns" ohne API?
"CountListIconColumns" ohne API?
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)
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)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
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
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
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.
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
Hui, fein... aber irgendwie ist das ganze bei mir (Win98SE) nicht ganz zuverlässig.
Ich habe aus Euren beiden Beispielen jetzt diesen Testcode zusammengabaut.
Und es kommt bei jedem Durchlauf ein anderer (utopischer) Wert heraus. Manchmal allerdings auch die 6.

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

"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Hui! Hab ich was verpasst? Kein einziger der Codes läuft bei mir. Verfallen alle in eine Endlosschleife.
Windows 10 Pro, 64-Bit / Outtakes | Derek
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
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
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
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Noch kürzer! 

Code: Alles auswählen
SendMessage_(GetWindow_(GadgetID(GID),#GW_CHILD),#HDM_GETITEMCOUNT,0,0)
Windows 10 Pro, 64-Bit / Outtakes | Derek
@ Fluid Byte: Funzt super!
Ist zwar nun doch wieder API, aber die PB-Only Lösungen funktionieren ja nicht zuverlässig.
Nebnbei hab ich jetzt auch gelernt, daß SendMessage_ Werte zurückgeben kann. 
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

"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.