AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen

Ein Thema von DieDolly · begonnen am 9. Dez 2020 · letzter Beitrag vom 12. Dez 2020
Antwort Antwort
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

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

  Alt 10. Dez 2020, 15:18
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).

Geändert von DieDolly (10. Dez 2020 um 15:23 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

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

  Alt 10. Dez 2020, 15:33
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.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

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

  Alt 10. Dez 2020, 15:37
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.

Geändert von DieDolly (10. Dez 2020 um 15:40 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

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

  Alt 10. Dez 2020, 15:39
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.

Geändert von venice2 (10. Dez 2020 um 15:46 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

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

  Alt 10. Dez 2020, 15:49
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).

Geändert von DieDolly (10. Dez 2020 um 15:56 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

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

  Alt 10. Dez 2020, 15:56
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.
Du musst alle in das Imagelist addieren die du benötigst sonst löst du jedesmal beim addieren eines neuen Icon ein repaint aus.
Das ist sehr un-konstruktiv jedesmal eine neue ImageListe zu erstellen für 1 Icon! sorry
Einmalig und fertig.

Das ist dein Problem.
Und wie gesagt das Handle des Icon löschen.

DestroyIcon(Info.HIcon);

Geändert von venice2 (10. Dez 2020 um 15:58 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

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

  Alt 10. Dez 2020, 16:00
Ungefähr so?

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;
InitNode
Delphi-Quellcode:
 SHGetFileInfo(PChar(FileName), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
 ImageList_AddIcon(SmallImages.Handle, Info.iIcon);
 DestroyIcon(Info.iIcon); // Mit dieser Zeile sehe ich dann keine Icons
Ach das funktioniert doch eh nicht. Deinen Code verstehe ich nicht und auch keine Ahnung wo der hin soll, welche Variablentypen das sind, wie ich das am Ende anzeige usw.

Geändert von DieDolly (10. Dez 2020 um 16:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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