*Gelöst* Listicongadget quälend langsam

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

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

Beitrag 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
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten