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

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
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 08:37
@Dolly: Evtl. hilft dir das, wenn nicht war es ein Versuch
So mache ich es in Lazarus (ohne ):
Delphi-Quellcode:
LargeIco, SmallIco : hIcon;
...
      ExtractIconEx(PChar(Pfad\Datei.exe), 0, LargeIco, SmallIco, 1);
      Icon.Handle := LargeIco;
      Icon.Transparent := True;
      ToolI.Picture.Icon := Icon;
So habe ich es vorher in Delphi gemacht:
Delphi-Quellcode:
icon : TIcon;
Filter : word;
...
    Icon := TIcon.Create;
    try
      Icon.Handle:=ExtractAssociatedIcon(hInstance, PChar(ToolE.Text), Filter);
      ToolI.Picture.Icon := icon;
    finally
      icon.Free;
    end;
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (11. Dez 2020 um 08:42 Uhr)
  Mit Zitat antworten Zitat
DieDolly

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

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 11:38
Damit habe ich dasselbe Problem wie mit SHGetFileInfo. Alles ruckelt und ist langsam gefolgt von seltsamen Canvas-Fehlern.
IconCache? Klingt irgendwie kompliziert und für mich nicht umsetzbar. Obwohl es interessant klingt. Würde man da einfach alle Dateiendungen die es gibt durchgehen, SHGetFileInfo aufrufen und sich das Info.iIcon holen?

Ich habe das jetzt so und es ruckelt ohne Ende.
Delphi-Quellcode:
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
 Info: TSHFileInfo;
begin
 Node.SetData<TTreeData>(TreeDataKlassen[Node.Index]);

 if TreeDataKlassen[Node^.Index].IconIndexSpalte1 = -1 then
  begin
   SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
   TreeDataKlassen[Node^.Index].IconIndexSpalte1 := Info.iIcon;
  end;
end;

procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex);
begin
 if (not(Column in [0, 1])) or (not Assigned(TreeDataKlassen)) then
  Exit;

 if Kind in [ikNormal, ikSelected] then
  begin
   ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1;
  end;
end;
Wie man da mit der ImageList arbeiten soll, ist für mich immer noch ein großes Geheimnis.

Geändert von DieDolly (11. Dez 2020 um 11:48 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 11:56
Delphi-Quellcode:
   SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
   TreeDataKlassen[Node^.Index].IconIndexSpalte1 := Info.iIcon;
Es wird immer ruckeln und du wirst immer die Ressourcen Probleme haben, von wegen kann nicht auf das Canvas zeichnen.
Es hat ganz einfach damit zu tun das du sehr viele Handles in den Speicher lädst und sie nicht freigibst.

Sorry aber du kannst das auf diese weise niemals in den griff bekommen weil Windows das nicht zulässt.
Und bedenke irgendwann ist das Limit an Handles erreicht und dann geht bei dir gar nichts mehr.
Und ja es gibt eine Beschränkung wie viele Handles ein Anwendung verwenden darf.

Genau wie dein vorheriges SystemImageList := SHGetFileInfo was zur folge hatte das überhaupt keine Icons geladen wurden.
Wie dem auch sei.. Tut mir leid für dich aber das ist der falsche weg.
Das VirtualStringTree macht es einen aber auch besonders schwer weil man nicht auf den Index jeder Node hin prüfen kann.
Deshalb macht eine ImageList auch keinen sinn wenn man sie mit nichts vergleichen kann.
Nun ist halt so.

Zitat:
Wie man da mit der ImageList arbeiten soll, ist für mich immer noch ein großes Geheimnis.
Kann man nicht weil du den Index vom ImageList mit nichts vergleichen kannst.
Wenn das gehen würde..
If ImageList.ImageIndex = NOde^.Index then

aber selbst das funktioniert nicht! Eine andere Lösung habe ich auch nicht gefunden.

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

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

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 12:05
Auch wenn ich DestroyIcon(Info.hIcon); verwende, dasselbe Problem. Komische Fehlermeldungen und ein Zusammenbruch des Programms.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 12:10
Zitat:
Wie man da mit der ImageList arbeiten soll, ist für mich immer noch ein großes Geheimnis.
Kann man nicht weil du den Index vom ImageList mit nichts vergleichen kannst.
Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ...

In dem Fall wäre ein TDictionary<string, Integer> eine Möglichkeit. Die Dateiendung wird als Key verwendet und als Value kommt der ImageIndex der ImageList heraus. Da braucht man keinen Node Index oder sonst etwas.

EDIT: Hat den Vorteil, dass man auf ein Image prinzipiell mehrfach verweisen könnte. Dann müsste man eben nur beim Erstellen des Dictionarys wissen, welche Icons identisch sind.
  Mit Zitat antworten Zitat
DieDolly

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

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 12:20
Gibt es dazu irgendwo Beispiele? Ich kann mir darunter überhaupt nichts vorstellen leider.
Ich hab das immer mit SHGetFileInfo gemacht weil ich dachte das sei richtig.

Und das hier im FormCreate scheint ja mal für absolut gar nichts sinnvoll zu sein
Delphi-Quellcode:
 SmallImages := TImageList.Create(Self);
 SmallImages.Handle := SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
 SmallImages.ShareImages := True;
 VST.Images := SmallImages;
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 12:27
Zitat:
Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ..
Dir ist aber schon klar das ein ImageList keine Oberfläche hat. Oder?
Und wo ist das Problem wenn ich den Index einer Imagelist mit einer Node vergleichen will?

Selbst den Tag auch wenn man ihn belegen würde kann man fast mit nichts vergleichen.
Welcher Sinn steckt dahinter?

Zitat:
Und das hier im FormCreate scheint ja mal für absolut gar nichts sinnvoll zu sein
Richtig erkannt.
  Mit Zitat antworten Zitat
DieDolly

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

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 12:34
Ich gebe auf mein VST wird niemals Bilder für die Dateien anzeigen können ohne Fehler zu werfen.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 11. Dez 2020, 13:05
Zitat:
Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ..
Dir ist aber schon klar das ein ImageList keine Oberfläche hat. Oder?
Und wo ist das Problem wenn ich den Index einer Imagelist mit einer Node vergleichen will?
Die ImageList nicht, aber der VST. Sortiere doch mal die Nodes im VST. Dann bekommst du plötzlich ganz andere Icons für die unterschiedlichen Dateitypen angezeigt. Würdest du ein Interface dazwischenbauen (in dem Fall evtl. in Form eines TDictionary<string, Integer>) und die zur Node gehörigen Daten damit vergleichen, dann wäre das Problem damit behoben.

Gibt es dazu irgendwo Beispiele? Ich kann mir darunter überhaupt nichts vorstellen leider.
Ich hab das immer mit SHGetFileInfo gemacht weil ich dachte das sei richtig.
SHGetFileInfo muss an der Stelle ja nicht falsch bzw. wird evtl. sogar die einzig sinnvolle Lösung sein. Nur müsstest du das ggf. in einen Thread auslagern oder zumindest das Abrufen der Icons nicht beim Zeichnen jeder Node des Trees ausführen. Die Zeichen Events sollten maximal auf Daten zugreifen, die die Anwendung ohne große Berechnung zur Verfügung stellt. Jeder weitere Schritt verlangsamt das Zeichnen jeder einzelnen Node (und Column) u.U. enorm.

Die Daten werden auf dem Laufwerk abgerufen und in einer internen Struktur gespeichert. Erst wenn das alles geschehen ist, wird der VST mit RootNodeCount gefüllt.

Ich gebe auf mein VST wird niemals Bilder für die Dateien anzeigen können ohne Fehler zu werfen.
Bitte nicht. Mach dir daraus lieber mehrere kleine Teilprojekte wie z.B. das effiziente Abrufen von Icons je nach Dateityp und das Füllen des Trees anhand von Verzeichnisinformationen. Wenn das alles gut, sauber und effizient läuft, dann kannst du das kombinieren.

Eventuell kannst du dir ja mal die ShellTreeView Komponente anschauen und dir daran ein Beispiel nehmen wie dort die Bilddaten abgerufen werden.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:17 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