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: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn

  Alt 10. Dez 2020, 18:10
Sorry wegen der langen Antwortzeit. Ich hatte hier Probleme die Datei hochzuladen.

Ich habe hier mal ein Minimalprojekt gebaut. Das zeigt das Problem und auch GANZ grob runtergebrochen meinen Aufbau mit meiner Liste.
Ich glaube hier dran kann man am besten sehen was das Problem ist.

Benötigt wird ein Verzeichnis mit sehr vielen Dateien und Verzeichnissen. Ich nehme dafür gerne das Mozilla-Verzeichnis in AppData.
Die Datei ist etwas größer weil ich da noch die Exe-Datei drin habe, kompiliert mit 10.3.3 CE und VirtualStringTree 7.X (die neueste).

... Dateien hochladen funktioniert heute nicht. Deswegen hab ichs woanders hochgeladen: https://www.file-upload.net/download...15/VST.7z.html
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#2

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

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

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

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

  Alt 10. Dez 2020, 21:02
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.
Was ich gerade bestätigen konnte: ein Doppelklick auf den Trenner nach Spalte 1 führt zum Einfrieren und OutOfResources; aus Vcl.Graphics wird aufgerufen.
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;
Zitat:
Ü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.
Die Funktion verwende ich im Originalprojekt nicht. Die hab ich nur auf die Schnelle reingekloppt.

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

n/a Beiträge
 
#4

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

  Alt 10. Dez 2020, 21: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
 
#5

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

  Alt 10. Dez 2020, 21: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 00:42 Uhr)
  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 10. Dez 2020, 21: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
 
#7

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

  Alt 10. Dez 2020, 22: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 15:46 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#8

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

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