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. :lol:

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.

Bild

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! Bild

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. :oops: