Seite 2 von 2

Re: *Gelöst* Listicongadget quälend langsam

Verfasst: 03.07.2023 14:13
von jacdelad
@Led Zep:
Mit BindGadgetEvent hast du sogar ein "Live-Resize":

Code: Alles auswählen

Enumeration
  #parent
  #font1
  #lig
  #menu
  #csb
EndEnumeration

Procedure updateLig()
  SendMessage_(GadgetID(#lig),#WM_SETREDRAW,0,0)
  ResizeGadget(#lig, 0, 0, WindowWidth(#parent), WindowHeight(#parent)-StatusBarHeight(#csb)-MenuHeight())
  korrekturwert = 2
  If GetWindowLongPtr_(GadgetID(#lig), #GWL_STYLE) & #WS_VSCROLL    ;wenn scrollbalken vorhanden
    korrekturwert = 4 + GetSystemMetrics_(#SM_CXVSCROLL)            ;dann Bereich für die Spalten reduzieren
  EndIf
  MaxColWidth = GadgetWidth(#lig) - korrekturwert
  cols = GetGadgetAttribute(#lig, #PB_ListIcon_ColumnCount)
  x = MaxColWidth/cols : rest = MaxColWidth
  For i = 0 To cols-2     ;Platz für erste bis vorletzte Spalte verteilen
    SetGadgetItemAttribute(#lig, #PB_Ignore, #PB_ListIcon_ColumnWidth, x, i)
    rest - x
  Next
  SetGadgetItemAttribute(#lig, #PB_Ignore, #PB_ListIcon_ColumnWidth, rest ,cols-1)  ; Rest für die letzte Spalte
  SendMessage_(GadgetID(#lig),#WM_SETREDRAW,1,0)
EndProcedure

; initialisieren
winflags = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
ligflags = #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection

;- openwindow
OpenWindow(#parent,0,0,1200,700,"Tabelle",winflags)
LoadFont(#font1, "Arial", 11) : SetGadgetFont(#PB_Default, FontID(#font1))

;- Menu
If CreateMenu(#menu, WindowID(#parent))
  MenuTitle("Tabelle")
  MenuItem(101, "Tabelle")
EndIf

;- Statusbar
CreateStatusBar(#csb, WindowID(#parent))
AddStatusBarField(100)
AddStatusBarField(#PB_Ignore)
AddStatusBarField(#PB_Ignore)
StatusBarText(#csb, 0, "")
StatusBarText(#csb, 1, "")

;- LIG
ListIconGadget(#lig, 0, 0, WindowWidth(#parent), WindowHeight(#parent), "A", 10, ligflags)
AddGadgetColumn(#lig, 1, "B", 10)
AddGadgetColumn(#lig, 2, "C", 10)
AddGadgetColumn(#lig, 3, "D", 10)
AddGadgetColumn(#lig, 4, "E", 10)
AddGadgetColumn(#lig, 5, "F", 10)
AddGadgetColumn(#lig, 6, "G", 10)
AddGadgetColumn(#lig, 7, "H", 10)
AddGadgetColumn(#lig, 8, "I", 10)
AddGadgetColumn(#lig, 9, "J", 10)
AddGadgetColumn(#lig, 10, "K", 10)
AddGadgetColumn(#lig, 11, "L", 10)
AddGadgetColumn(#lig, 12, "M", 10)
AddGadgetColumn(#lig, 13, "N", 10)
AddGadgetColumn(#lig, 14, "O", 10)
AddGadgetColumn(#lig, 15, "P", 10)
AddGadgetColumn(#lig, 16, "Q", 10)

x$ = ""
For i = 0 To 15
  x$ + "Blutwurst" + Chr(10)
Next
x$ + "Blutwurst"

For i = 0 To 105
  AddGadgetItem(#lig, -1, x$)
Next

updateLig()

;- ********** Event ************
BindEvent(#PB_Event_SizeWindow,@updateLig(),#Parent)
Repeat
  event = WaitWindowEvent()
  Gadget = EventGadget()
  
  Select event
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #parent
          End
      EndSelect
      
;     Case #PB_Event_SizeWindow
;       ResizeGadget(#lig,0,0,WindowWidth(#parent),WindowHeight(#parent))
;       updateLig()
      
    Case #PB_Event_Menu
      Select EventMenu()
        Case 101
      EndSelect
  EndSelect
  
  Select Gadget
    Case #lig
      Select EventType()
        Case #PB_EventType_Change
        Case #PB_EventType_DragStart
        Case #PB_EventType_LeftClick
        Case #PB_EventType_LeftDoubleClick
          SetGadgetState(Gadget, -1)
        Case #PB_EventType_RightClick
          SetGadgetState(Gadget, -1)
        Case #PB_EventType_RightDoubleClick
          SetGadgetState(Gadget, -1)
      EndSelect
      
  EndSelect
ForEver
End

Re: *Gelöst* Listicongadget quälend langsam

Verfasst: 03.07.2023 16:12
von mk-soft
Ja,
es gehen Events verloren.

@dige
Das problem ist hier das jede Änderung an dem ListIconGadget bei Windows sofort gezeichnet wird. Führt man wie hier viele Änderungen durch, sollte das neu zeichnen solage unterdrückt werden bis man alle Änderungen an das ListIconGadget übergeben wurde.
Bei MacOS oder Linux ist es kein Problem, das das neu zeichnen erst beim durchlauf von WaitWindowEvent ausgeführt wird.