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: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
 
#2

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
 
#3

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
 
#4

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
 
#5

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
venice2
(Gast)

n/a Beiträge
 
#6

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

  Alt 10. Dez 2020, 16:07
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.
sorry dann läuft bei dir was falsch.
Das ImageList wird zerstört oder sonst was.
Ist aber auch möglich das es in 10.4 einfach nicht mehr korrekt funktioniert.
  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:08
Ich verstehe deine Aussage aber auch nicht
Zitat:
Das ist sehr un-konstruktiv jedesmal eine neue ImageListe zu erstellen für 1 Icon! sorry
Das mache ich doch gar nicht.

Und außerdem. Woher will das VST wissen, welchen Index es für welches Node braucht? Dafür muss ich doch zwangsweise in jedem Node 1x GetSHFileInfo aufrufen.

Zitat:
Das ImageList wird zerstört oder sonst was.
Ich zerstöre da nix. Diese komischen Probleme kommen erst bei mehreren Tausend Einträgen.

Hier nochjmal zusammengefasst wie ich es immer gemacht habe und wie es auch eigentlich immer funktioniert hat

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);
 MeinNode-generisch.MeinIconIndex := Info.iIcon; // jetzt weiß der Datensatz unter dem Node, welcher IconIndex das Icon braucht.
VSTGetImageIndex
Delphi-Quellcode:
 if Kind in [ikNormal, ikSelected] then
  ImageIndex := MeinNode-generisch.MeinIconIndex;
ich glaube die ImageList benutze ich nicht einmal.

Geändert von DieDolly (10. Dez 2020 um 16:12 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