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 13. Dez 2020
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
venice2
(Gast)

n/a Beiträge
 
#31

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

  Alt 10. Dez 2020, 22:02
Ist das denn richtig?
Delphi-Quellcode:
    if SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON) = 0 then
    begin
     ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1;
     // Eigentlich müsste das Icon angezeigt werden, wird es aber nicht.
    end;
Wird .IconIndexSpalte1 jemals gesetzt und wenn ja, wo?

Übrigens:
procedure AddAllFilesInDir(const Dir: string; var List: TStringList); List sollte const sein, nicht var , denn es soll ja nicht der Zeiger zur Liste geändert werden (können) sondern nur deren Inhalt.

Grüße
Dalai
ja ist IO..
Ich sagte aber schon woran es liegt das Hicon wird nicht freigegeben.
Und einiges fehlt noch.

Ich kann hier 10000 Einträge laden ohne das irgendein Problem beim zeichnen hier auftritt.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#32

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

  Alt 10. Dez 2020, 22:03
Der Code da ist unwichtig, ist ein Fehler beim Kopieren passiert.
Es funktioniert ja ohnehin nicht, egal was ich mache und ob da jetzt eine Zuweisung fehlt.

Ich habe dieses Minimalbeispiel nur gebaut um grob zu zeigen wie alles aufgebaut ist. Und in der Hoffnung, dass ihr mir helfen könnt, SHGetFileInfo() dort richtig einzubauen.

So bekomme ich was angezeigt aber es ruckelt, zuckelt und führt sicher wieder zu fehlern.
Delphi-Quellcode:
procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex);
var
 Info: TSHFileInfo;
begin
 if (not(Column in [0, 1])) or (not Assigned(TreeDataKlassen)) then
  Exit;

 if Kind in [ikNormal, ikSelected] then
  begin
   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;

   ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1;
  end;
end;
Ich kann.. warte noch ein kleines bisschen.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#33

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

  Alt 10. Dez 2020, 22:47
preview.. 40566 Dateien scrolle ich ohne Probleme.
Kein Abstürze oder dergleichen.
Mit einer ImageList

https://www.magentacloud.de/lnk/ZOE1gPHT

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

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

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

  Alt 10. Dez 2020, 22:58
Kannst du mir zeigen, wie du das umgesetzt hast?
Hat jede Datei ein festes Icon oder das was zur Datei dazugehört und dynamisch bestimmt?
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#35

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

  Alt 10. Dez 2020, 23:42
Kannst du mir zeigen, wie du das umgesetzt hast?
Hat jede Datei ein festes Icon oder das was zur Datei dazugehört und dynamisch bestimmt?
Nun bei dem hier.. bekommst du ja nur ein festes Icon oder?
SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

Und zwar das des Laufwerks.
Das liegt dran weil du keine Datei zum auswerten vorgibst.


Dann verwendest du die falsche Funktion
Du muss dafür jedoch noch Vcl.ImgList in den uses hinzufügen.
Nicht VSTGetImageIndex sondern VSTGetImageIndexEx

Delphi-Quellcode:
procedure TForm1.VSTGetImageIndexEx(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: TImageIndex;
  var ImageList: TCustomImageList);
var
 Info: TSHFileInfo;
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; // Den aktuellen Index der Node
  end;
end;
in create

Delphi-Quellcode:
   

   SmallImages := TImageList.Create(Self);
   SmallImages.ShareImages := True;
   VST.Images := SmallImages;
   VST.Images.ColorDepth := cd32Bit; // Unbedingt wichtig damit du keinen schwarzen Hintergrund bei den Icons hast
   VST.Images.DrawingStyle := dsTransparent; // Transparenz einschalten
   // *********
   TreeDataKlassen.Add(TreeData);
   ZeroMemory(@Info, SizeOf(TSHFileInfo)); // Speicher bereinigen

   SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //Icon Holen

   if Info.hIcon <> 0 then
   begin
     Icon := TIcon.Create;
     Icon.Handle := Info.hIcon;
     VST.Images.AddIcon(Icon); // VST.Images = SmallImages
     FreeAndNil(Icon);
   end;
Du kannst das Hicon noch freigeben nach FreeAndNil(Icon)
DestroyIcon(Info.hIcon);
glaube aber nicht das dass nötig ist weil TIcon ja nach der Übergabe der Eigentümer des handle ist und es auch frei gibt bei Free.

Ich hoffe du kommst klar.
teste es mit deinem minimalen Sample.

Dein Projekt zurück.. wenn es hilft gut wenn nicht ab in die Tonne. Siehe meine Kommentare im code
Habe genug mit dem Kram rum gespielt. Canvas erlaubt das zeichnen nun wieder sogar mit Icons

Meine Meinung VirtualStringTree ist einfach nur müll es ist nicht möglich an den Index der Node zu kommen.
So wie du das gerne möchtest ist es nicht möglich.

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

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

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

  Alt 11. Dez 2020, 09:26
Zitat:
Ich hoffe du kommst klar.
Leider nicht, weil meine Ausgangsfrage nicht beantwortet wurde.
Ich weiß noch immer nicht, wie ich SHGetFileInfo richtig anwende, sodass ich jeweils das Icon habe, was zur Datei gehört.
Kommt das einfach in VSTGetImageIndexEx? Dann hab ich ja wieder die Ruckler und Aussetzer.

Geändert von DieDolly (11. Dez 2020 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

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

  Alt 11. Dez 2020, 09: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 09:42 Uhr)
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 11. Dez 2020, 12:38
Kommt das einfach in VSTGetImageIndexEx? Dann hab ich ja wieder die Ruckler und Aussetzer.
Naja bei den Remarks zu SHGetFileInfo im MSDN steht geschrieben, dass die Ausführung in einem Thread gemacht werden soll. Ansonsten kann es zu Rucklern bzw. Abstürzen führen. Siehe hier ...

Ich würde in dem Fall evtl. einen IconCache anlegen und dem beim Erstellen der Dateiliste füllen. Beim Zeichnen in OnGetImageIndex musst du dann nur noch den ImageIndex angeben. Kommt ein Dateityp hinzu der noch nicht in deinem IconCache enthalten ist, dann wird der hinzugefügt. Beim Zeichnen im Tree kannst du evtl. noch ein Fallback einbauen, dass ein Standardicon angezeigt wird, wenn der Thread Aufruf von SHGetFileInfo noch nicht abgeschlossen ist.


Das ist jetzt alles nur Theorie. Ich habe keinen SourceCode hierfür. Aber so sollte es funktionieren.
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 11. Dez 2020, 12: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 12:48 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#40

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

  Alt 11. Dez 2020, 12: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 12:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 18:00 Uhr.
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