![]() |
VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen
Ich fülle ein VST ganz normal über Init, GetText, Free. So wie es ja sein soll. Das macht auch keine Probleme.
Im Event GetImageIndex macht diese Zeile hier Probleme, wenn ich öfter schnell rauf- und runterscrolle und danach irgendeine der Spaltenbreiten verändere. Ein paar mal verändern geht, aber sobald ich auf einen Trenner doppelklicke, sodass sich die Spalte eigentlich die Auto-Größe holt, hängt sich alles auf. Das Programm hängt sich auf und manchmal kommt die Fehlermeldung oben. Manchmal kommt auch Falscher Parameter. Manchmal kommt das auch, wenn ich das Fenster über längere Zeit offen lasse ohne irgendwas zu machen. Manchmal reicht auch schon rumscrollen.
Delphi-Quellcode:
Lasse ich die Zeile weg, habe ich gar keine Probleme. Mache ich irgendwas falsch
if SHGetFileInfo(PChar(FileName), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX or SHGFI_ICON or
SHGFI_SMALLICON) = 0 then (wie ich Icons lade und anzeige, sieht man hier ![]() |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Keiner eine Idee was hier an VirtualStringTree falsch sein kann? Wenn ich keine Icons anzeige ist das Problem nicht da.
|
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Ohne den Rest deines Programms zu kennen:
Das riecht verdächtig nach Threads. Bearbeitest du irgendwo außerhalb des VCL-Mainthreads Bitmaps? Denn da muss man höllisch aufpassen, bzw. es besser ganz sein lassen. Selbst Thread-lokale TBitmaps können dir den Rest des Programms an ganz anderer Stelle zerschießen. |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Arbeitet VirtualStringTree intern mit Threads?
Weil ich selber nicht an dieser Stelle. Mit Bitmaps mache ich auch nichts. Wenn das VST 10000 Einträge hat, jeder Eintrag 6 Spalten und jeweils 2 Icons und man richtig wild rauf und runter fährt, kommt es auch irgendwann zu dem Fehler. Definitiv kommt es aber zu dem Fehler, wenn man auf einen Spalten-Trenner doppel-klickt, damit die Spalte die Auto-Breite bekommt. Dann kommt auch irgendwann Systemresourcen erschöpft und Canvas erlaubt kein Zeichnen. FormCreate
Delphi-Quellcode:
Und dann, egal wo, ob im GetImageIndex oder InitNode oder wo auch immer, sobald ich mit SHGetFileInfo arbeite um an die Icons zu kommen, kommen die Probleme.
SmallImages := TImageList.Create(Self);
SystemImageList := SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON); SmallImages.Handle := SystemImageList; SmallImages.ShareImages := True; VST.Images := SmallImages; Die Icons werden alle angezeigt, das ist kein Problem. Aber wild rumscrollen und sowas erzeugt dann irgendwann einfach ein einfrierendes/schwarzes Fenster. |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Zerstörst du denn die Icons irgendwann wieder? Die Remarks zu
![]() Zitat:
Zitat:
Dalai |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Reicht es, wenn ich die Imagelist einfach leere wenn ich das Fenster schließe?
Kannst du mir dafür ein Beispiele geben, wie ich das mit CoInitialize richtig mach? Einen Fehler hab ich vergessen. "Falscher Parameter" aus der Vcl.Graphics kommt auch gelegentlich. Wie gesagt bei wildem umherscrollen. Ich dachte immer ein VirtualStringTree hat kein Problem mit Millionen Einträgen. Bei mir sind es schon 9000 die Probleme machen (nur mit Icons, alles andere ist feinst säuberlich generisch aufgebaut). |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Zitat:
Die Image-list verwaltet dann die Icons das Handle des Icon das du vorher addiert hast musst du dann löschen. Zitat:
wenn du sonst nirgends ein COM object verwendest. Dann rufe vor SHGetFileInfo CoInitialize auf und wenn du alle Icons addiert hast CoUnInitialize. |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Ich rufe SHGetFileInfo in InitNode auf. Das heißt es wird nur ein Icon geladen, wenn es benötigt wird. Ich dachte eigentlich immer, dass das helfen würde.
CoInitialize und CoUnInitialize um SHGetFileInfo hat hier nichts gebracht leider. Könnte es helfen, wenn ich SHGetFileInfo ganz aus der Unit mit dem VST auslagere und schon dort aufrufe, wo ich meine Liste für das VST erestelle? Im VST GetImageIndex hole ich mir dann nur noch den ImageIndex. |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Zitat:
Dafür ist sie da! Ich mache hier auch nichts anderes.
Delphi-Quellcode:
Ok ist für ein ListView und Win32 Api aber in der Funktionsweise das gleiche.
if hLarge = 0 then
begin hLarge := ImageList_Create(round(bw), round(bh), ILC_COLOR32, 1, 1); // 32 Bit Bitmap konvertiert zu Icon ListView_SetImageList(Handle, hLarge, LVSIL_NORMAL); end; // Icon zur Liste addieren ImageList_AddIcon(hLarge, hIconItem); SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].Width := round(bw); ItemsInfo[nItem].Height := round(bh); ItemsInfo[nItem].ImgIcon := hIconItem; ItemsInfo[nItem].IdentStr := ImgIdent; // Icon freigeben // wird nicht mehr verwendet da in der ImageList enthalten DestroyIcon(hIconItem); Wenn ich jedes Icon extra laden würde oh.. oh.. das wird nix. Image list erstellen Icon addieren Handle löschen. |
AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
Deinen Code verstehe ich nicht. Ich mache nichts anderes. Ich lade das Icon und weise den ImageIndex zu.
Ich habe den Code jetzt ausgelagert und komplett von der VST-Unit abgekoppelt. Trotzdem kommen Fehlermeldungen. Bis vor 10.3.3 war das alles gar kein Problem bin ich der Meinung. Mein Code ist wie gesagt so.
Delphi-Quellcode:
SmallImages und SystemImageList: passiert im FormCreate. Beides lokale Variablen in FormCreate (warum, keine Ahnung).
SmallImages := TImageList.Create(Self);
SystemImageList := SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON); SmallImages.Handle := SystemImageList; SmallImages.ShareImages := True; VST.Images := SmallImages; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz