WinAPI: puColumns auswerten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 184
Registriert: 27.01.2016 11:08
Wohnort: BY

WinAPI: puColumns auswerten

Beitrag von techniker »

Hallo,

lt. https://learn.microsoft.com/de-de/windo ... rl-lvitema

gibt die Struktur LVITEMA im Callback von einem LIG den Pointer auf ein Array zurück, welches die aktuell dargestellten
Spalten in der entsprechenden Reihenfolge enthält. Soweit so gut. :)

Aber irgendwie sitze ich momentan voll auf der Leitung, wie ich auf dieses Array puColumns zugreifen kann?

Aktueller Codeausschnitt aus dem Callback:

Code: Alles auswählen

  Procedure.i Callback(result, hwnd, msg, wParam, lParam)
    Protected idx.i
    Protected *Data.LIG_SubClassInfo
    Protected *pnmh.NMHEADER
    Protected *pnmlvdi.NMLVDISPINFO
    Protected *NMLVCUSTOMDRAW.NMLVCUSTOMDRAW
    Protected HitInfo.LVHITTESTINFO
    Protected OffX.i, OffY.i, img_offset.i
    Protected PBWinID.i
    Static fieldtxt.s ; WICHTIG! Muss unbedingt als STATIC deklariert werden!
    
    If IsGadget(wParam)
      If GadgetType(wParam) = #PB_GadgetType_ListIcon
        *Data = GetProp_(GadgetID(wParam), "_LIG_SubClassInfo")
        
        If *Data
          Select msg
            Case #WM_NOTIFY
              *NMLVCUSTOMDRAW = lParam
              *pnmh = lParam
              
              Select *pnmh\hdr\code
                Case #LVN_ODCACHEHINT
                  result = 0
                  
                Case #LVN_ODFINDITEM
                  result = -1
                 
                Case #LVN_GETDISPINFO
                  *pnmlvdi = lParam
                  If *pnmlvdi\item\mask & (#LVIF_TEXT | #LVIF_IMAGE | #LVIF_STATE)
If *pnmlvdi\item\mask & #LVIF_TEXT
  *pnmlvdi\item\puColumns - tja und nu? :-)
;   Debug "Row: "+Str(*pnmlvdi\item\iItem)+", Column: "+Str(*pnmlvdi\item\iSubItem)
EndIf
                    If *Data\Enable_ColumnSort
                      If SelectElement(*Data\LIG_RowSortRef(), *pnmlvdi\item\iItem)
                        idx = *Data\LIG_RowSortRef()
                      Else
                        idx = 0
                      EndIf
                    Else
                      idx = *pnmlvdi\item\iItem
                    EndIf
                    
                    If SelectElement(*Data\LIG_Data(), idx)
                      ; Checkbox
                      If *pnmlvdi\item\iSubItem = 0 And *pnmlvdi\item\mask & #LVIF_STATE
                        *pnmlvdi\item\stateMask = #LVIS_STATEIMAGEMASK
                        If *Data\Disabled : img_offset = 5 : EndIf ; Offset für Umschaltung auf "ausgegraute" Bildelemente
                        *pnmlvdi\item\state = (*Data\LIG_Data()\checkbox_state + 1 + img_offset) << 12
                      EndIf
                    
                      ; Text
                      If *pnmlvdi\item\mask & #LVIF_TEXT
                        fieldtxt = ""
                        If SelectElement(*Data\LIG_Data()\value(), *pnmlvdi\item\iSubItem)
                          fieldtxt = *Data\LIG_Data()\value()
                        EndIf
                        *pnmlvdi\item\pszText = @fieldtxt
                      EndIf
                      
                      ; Icon
                      If *pnmlvdi\item\mask & #LVIF_IMAGE
                        If SelectElement(*Data\LIG_Data()\property(), *pnmlvdi\item\iSubItem)
                          *pnmlvdi\item\iImage = *Data\LIG_Data()\property()\icon
                        EndIf
                      EndIf
                      
                      result = #True
                    EndIf
                  EndIf
Kann mir evtl. jemand einen kleinen Schups geben? :mrgreen:
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 »

Wenn ich mich nicht irre (kann es gerade nicht testen):
Teste, ob das Flag #LVIF_COLUMNS in \mask zurückgegeben wird. Falls ja, enthält \cColumns die Anzahl der Spalten. Dann kannst du die ab Adresse \puColumns abrufen (jeder Wert ist 32 Bit breit).
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 »

cColumns kann aber lt. Doku nur max. den Wert 20 anzeigen:
cColumns
Typ: UINT
Version 6.0 Anzahl der Datenspalten (Unterelemente), die für dieses Element in der Kachelansicht angezeigt werden sollen. Der Höchstwert ist 20. Wenn dieser Wert I_COLUMNSCALLBACK ist, werden die Größe des Spaltenarrays und des Arrays selbst (puColumns) durch Senden einer LVN_GETDISPINFO-Benachrichtigung abgerufen.
Ich habe hier bis zu 120 Spalten in der Tabelle - was passiert dann?
Woher weiß ich, wie groß das Array unter puColumns ist?
Wie mappe ich die Adresse auf ein PB-Array, um ArraySize() nutzen zu können?
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 »

Das Stichwort heißt hier "Kachelansicht". Und da sind maximal 20 Zeilen (=die eigentlichen Spalten) erlaubt. Mehr als 20 macht da auch keinen Sinn, das wird sehr unübersichtlich.
die Größe des Arrays steht in \cColumns -> Anzahl Werte.

PS: Dein oben geposteter Code ist nicht lauffähig. Da ich nicht alles allein machen will, wäre es gut, wenn du ein minimales Beispiel, welches das Problem zeigt, zusammenklampfen würdest. Ins Blaue geraten müsste es in etwa sowas sein:

Code: Alles auswählen

  Protected Counter.a
  If *pnmlvdi\item\mask & #LVIF_COLUMNS
    For Counter=0 To *pnmlvdi\item\cColumns-1
      Debug "Column: "+Str(PeekL(*pnmlvdi\item\puColumns+4*Counter))
    Next
  EndIf
Das müsste dir die sichtbaren Spalten nacheinander ausgeben.
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 »

Danke für deine Hilfe.
Der Tip mit dem auslesen per PeekL hat mir gefehlt.. ;-)

Nächstes Problem: #LVIF_COLUMNS wird nicht gesetzt?!?
Hast du eine Idee, warum das so ist?
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 »

Ok - ich frage mal anders herum:
Kann ich im OwnerDraw-Callback herausfinden, ob die angefragten SubElemente (Zellen bzw. Spalten) überhaupt sichtbar sind?
Wenn nein, brauche ich erst gar nicht weiterzumachen.. :-)

Dadurch erhoffe ich mir nochmal etwas mehr an Geschwindigkeit.
Die Tabelle ist bis zu 120 Spalten breit, bis zu 8000 Zeilen lang und eine Zelle kann bis zu 1500 Zeichen enthalten.
Also nicht ganz trivial, da trotz CustomDraw immer die ganze Zeile geschrieben wird..
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 »

Da du mir immer noch nicht darauf geantwortet hast, nochmal die Frage: Nutzt du auch wirklich die KACHELANSICHT? Ansonsten wird cColumns nicht gesetzt!
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 »

Sorry - Nein, ich nutze die Report-Ansicht.
Ich hatte gehofft, dass die sichtbaren Spalten trotzdem mitgeliefert werden. Leider ist dem nicht so.. :-(

Hast du eine Idee, wie ich (siehe Post vom 05.12. 15:21) das Neuzeichnen sonst noch optimieren könnte?
Wie finde ich heraus, welche Spalten ich wirklich neu befüllen muss?

Das Ganze ist schon deutlich besser, als das Standard-LIG - aber immer noch etwas träge bei der Datenmenge.
Das Scrollen rauf/runter wäre i.O. Jedoch ist das scrollen links/rechts noch zu träge.. :-(
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 »

Da kann ich dir jetzt nicht wirklich weiterhelfen. Aber im englischen Forum kann das sicher jemand. Mit OwnerDraw-Gedöns hab ich mich noch nicht so beschäftigt, ich hab aber mal einen Code von jemandem von dort benutzt und für mich abgewandelt. Die Anzahl der Spalten war jedoch gering, da gings nur um einige Millionen Einträge.
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
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: WinAPI: puColumns auswerten

Beitrag von H.Brill »

Wenn es nur um das Befüllen und das langsame Repaint geht, kann man ja auch das
LIG für diese Zeit unsichtbar machen und dann wieder sichtbar. Hängt ja mit der
Trägheit des Auges zusammen.

Wenn man also nicht unbedingt zusehen braucht, wie sich das LIG befüllt, ist das
ein probates Mittel (auch ohne Custom-Draw).
PB 6.10
Antworten