WinAPI: puColumns auswerten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: WinAPI: puColumns auswerten

Beitrag von jacdelad »

Stimmt, daran hatte ich nicht mehr gedacht. Das gute alte

Code: Alles auswählen

SendMessage_(GadgetID(MyLIG),#WM_SETREDRAW,0,0)
;...
SendMessage_(GadgetID(MyLIG),#WM_SETREDRAW,1,0)
geht natürlich auch.
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
techniker
Beiträge: 184
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: WinAPI: puColumns auswerten

Beitrag von techniker »

Hallo H.Brill,

Es geht nicht nur um das Befüllen, sondern auch um das Scrollen (und programmatische bearbeiten per Callback).
Ein Standard-LIG mit >250MB Daten ist praktisch nicht mehr bedienbar.
Never change a running system - Never run a changed system!
(PB 6.20 LTS [x86])
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: WinAPI: puColumns auswerten

Beitrag von H.Brill »

Bei so vielen Daten wird auch bestimmt Excel & Co. langsamer.
Evtl. wäre es besser, das LIG aus einer SQL-DB zu befüllen. Also
nur die Menge Daten, die man z. Zt. unbedingt braucht, ins leere
LIG setzen.

Ich habe zwar noch eine Listview.dll (in MASM geschrieben von
Frank Abbing), aber die wird auch nicht schneller sein.
PB 6.10
Benutzeravatar
techniker
Beiträge: 184
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: WinAPI: puColumns auswerten

Beitrag von techniker »

Excel ist bei der Datenmenge zwar auch langsamer - aber immer noch deutlich schneller!

Ich habe sowieso schon alles auf Virtual ListView umprogrammiert. Das war schonmal ein gewaltiger Geschwindigkeitssprung,
da nun nur noch die sichtbaren Zeilen per Callback angefordert werden. Leider wird aber immer die komplette Zeile angefordert,
anstatt nur der sichtbare Bereich. Dies möchte ich nun gerne noch anpassen, so dass nur der sichtbare Bereich (Spalten) befüllt werden.

Daher nochmal die Frage:
Wie kann ich herausfinden, welche Spalten momentan dargestellt werden?

Ich habe auch schon LVM_GETITEMPOSITION versucht, jedoch funktioniert dies nicht zusammen mit LVS_OWNERDATA.. :-(
Es gibt mit Sicherheit eine Lösung, aber nur wie..?!?
Never change a running system - Never run a changed system!
(PB 6.20 LTS [x86])
Benutzeravatar
techniker
Beiträge: 184
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: WinAPI: puColumns auswerten

Beitrag von techniker »

Problem ist nun gelöst. Geschwindigkeit ist nun vergleichbar mit Excel und fast flüssig.

Für die Allgemeinheit anbei nun in Auszügen die entsprechenden Codezeilen.
Ich habe leider keine Zeit einen lauffähigen Beispiel-Code zu erzeugen.
Wer jedoch das gleiche Problem hat, kann sich damit sicherlich arrangieren.

Code: Alles auswählen

  Procedure.l GetHScrollPos(Gadget.i)
    ProcedureReturn GetScrollPos_(GadgetID(Gadget), #SB_HORZ)
  EndProcedure

....

  Procedure.l GetColumnWidth(Gadget,index)
    ProcedureReturn SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMNWIDTH, index, 0)
  EndProcedure

....

  Procedure _GetVisibleColumns(Gadget.i, *col_start.Integer, *col_end.Integer)
    Static last_gadget.i, last_hpos.i, last_colcnt.i, last_col_start.i, last_col_end.i
    Protected hpos.i = GetHScrollPos(Gadget)
    Protected colcnt.i = GetColumnCount(Gadget)
    Protected gadgetw.i, x_range_start.i, x_range_end.i, column.i, x_offset.i
    
    If Gadget = last_gadget And hpos = last_hpos And colcnt = last_colcnt
      ; No horizontal change -> return last values
      *col_start\i = last_col_start
      *col_end\i = last_col_end
      ProcedureReturn
    Else
      last_gadget = Gadget
      last_hpos = hpos
      last_colcnt = colcnt
    EndIf
    
    gadgetw = GadgetWidth(Gadget)
    
    x_range_start = hpos
    x_range_end = hpos + gadgetw
    *col_start\i = 0
    *col_end\i = colcnt - 1
    
    For column = 0 To colcnt - 1
      If x_range_start >= x_offset : *col_start\i = column : EndIf
      x_offset + GetColumnWidth(Gadget, column)
      If x_range_end <= x_offset : *col_end\i = column : Break : EndIf
    Next
    
    last_col_start = *col_start\i
    last_col_end = *col_end\i
  EndProcedure

....

Protected col_start.i, col_end.i
_GetVisibleColumns(Gadget, @col_start, @col_end)
Debug "col_start: "+Str(col_start)+", col_end: "+Str(col_end)
Never change a running system - Never run a changed system!
(PB 6.20 LTS [x86])
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: WinAPI: puColumns auswerten

Beitrag von jacdelad »

Danke für das Bereitstellen des Codes. Da bin ich doch ein bisschen gespannt (kann ihn erst nächste Woche probieren).
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
Antworten