Hab mich nochmal damit beschäftigt und hab's jetzt selbst gelöst. War gar nicht soo kompliziert. Heißen Dank an
Luckie's Win32API-Tutorials (hab die ListView-Demo als Basis zum Experimentieren genommen)
Also gelöst habe ich es jetzt, indem ich die WM_NOTIFY-Messages abfange und die LVN_GETDISPINFO für meine ListView selbst behandle. Dadurch kommt die VCL gar nicht erst dazu, Speicher zu verschwenden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| ...
uses ..., CommCtrl;
type TForm1 = class(TForm) ListView1: TListView; private procedure WMNOTIFY(var M: TWMNotify); message WM_NOTIFY; end;
const entry_name = 'Testname'; entry_size = 1234;
...
procedure GETDISPINFO(item: PLVITEM); begin with item^ do if (mask and LVIF_TEXT) <> 0 then case iSubItem of 0: pszText := PChar(entry_name); 1: wvsprintf(pszText, '%u', PChar(@entry_size)); end; end;
procedure TForm1.WMNOTIFY(var M: TWMNotify); begin with M.NMHdr^ do if hwndFrom = ListView1.Handle then case code of LVN_GETDISPINFO: GETDISPINFO(@PLVDispInfo(M.NMHdr)^.item); else Inherited; end else Inherited; end; |
Falls das jemand mal selbst ausprobieren will,
hier der Source für ein kleines Testprogramm... per Define lässt sich das Abfangen der Notification ein- und ausschalten und unten wird der Speicherverbrauch angezeigt. Bei der VCL-Version kostet es sogar Speicher, mit der Maus über die Einträge zu fahren.
Cya, worm
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.