Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen (https://www.delphipraxis.net/206324-virtualstringtree-shgetfileinfo-haengt-programm-auf-canvas-erlaubt-kein-zeichnen.html)

DieDolly 9. Dez 2020 17:45


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:
if SHGetFileInfo(PChar(FileName), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX or SHGFI_ICON or
SHGFI_SMALLICON) = 0 then
Lasse ich die Zeile weg, habe ich gar keine Probleme. Mache ich irgendwas falsch

(wie ich Icons lade und anzeige, sieht man hier https://www.delphipraxis.net/1478875-post14.html)

DieDolly 10. Dez 2020 12:10

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.

Gausi 10. Dez 2020 12:32

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.

DieDolly 10. Dez 2020 13:12

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:
 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;
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.
Die Icons werden alle angezeigt, das ist kein Problem. Aber wild rumscrollen und sowas erzeugt dann irgendwann einfach ein einfrierendes/schwarzes Fenster.

Dalai 10. Dez 2020 15:00

AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
 
Zerstörst du denn die Icons irgendwann wieder? Die Remarks zu MSDN-Library durchsuchenSHGetFileInfo sagen klar, dass man DestroyIcon rufen muss, wenn man die Ressourcen nicht mehr braucht:
Zitat:

If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.
Außerdem:
Zitat:

You must initialize Component Object Model (COM) with CoInitialize or OleInitialize prior to calling SHGetFileInfo.
Grüße
Dalai

DieDolly 10. Dez 2020 15:18

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).

venice2 10. Dez 2020 15:33

AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
 
Zitat:

wenn man die Ressourcen nicht mehr braucht:
yep und das ist der Fall wenn sie zu einer Image-list addiert wurden.
Die Image-list verwaltet dann die Icons das Handle des Icon das du vorher addiert hast musst du dann löschen.

Zitat:

Kannst du mir dafür ein Beispiele geben, wie ich das mit CoInitialize richtig mach?
Was für ein Beispiel?

wenn du sonst nirgends ein COM object verwendest.
Dann rufe vor SHGetFileInfo CoInitialize auf und wenn du alle Icons addiert hast CoUnInitialize.

DieDolly 10. Dez 2020 15:37

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.

venice2 10. Dez 2020 15:39

AW: SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen / VirtualStringTr
 
Zitat:

Zitat von DieDolly (Beitrag 1478865)
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.

Fülle die ImageList mit allen Icons und hole dir dann den Index aus der ImageList vom Icon das du benötigst für die jeweilige Node.
Dafür ist sie da!
Ich mache hier auch nichts anderes.

Delphi-Quellcode:
  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);
Ok ist für ein ListView und Win32 Api aber in der Funktionsweise das gleiche.
Wenn ich jedes Icon extra laden würde oh.. oh.. das wird nix.

Image list erstellen
Icon addieren
Handle löschen.

DieDolly 10. Dez 2020 15:49

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 := 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;
SmallImages und SystemImageList: passiert im FormCreate. Beides lokale Variablen in FormCreate (warum, keine Ahnung).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr.
Seite 1 von 6  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz