"CountListIconColumns" ohne API?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

"CountListIconColumns" ohne API?

Beitrag 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)
"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.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Nein.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Danke, dann hör ich auf danach zu suchen. :lol:
"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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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

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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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
"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.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

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
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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
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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Noch kürzer! Bild

Code: Alles auswählen

SendMessage_(GetWindow_(GadgetID(GID),#GW_CHILD),#HDM_GETITEMCOUNT,0,0) 
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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:
"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.
Antworten