Seite 2 von 2
Re: WinAPI: puColumns auswerten
Verfasst: 06.12.2023 08:31
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.
Re: WinAPI: puColumns auswerten
Verfasst: 06.12.2023 09:28
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.
Re: WinAPI: puColumns auswerten
Verfasst: 06.12.2023 14:02
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.
Re: WinAPI: puColumns auswerten
Verfasst: 06.12.2023 14:14
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..?!?
Re: WinAPI: puColumns auswerten
Verfasst: 06.12.2023 16:21
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)
Re: WinAPI: puColumns auswerten
Verfasst: 07.12.2023 14:56
von jacdelad
Danke für das Bereitstellen des Codes. Da bin ich doch ein bisschen gespannt (kann ihn erst nächste Woche probieren).