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
Seite 3 von 6     123 45     Letzte »    
venice2
(Gast)

n/a Beiträge
 
#21

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

  Alt 10. Dez 2020, 17:05
Ich würde dir vorschlagen dir die Samples vom VirtualStringTree anzuschauen.
https://github.com/JAM-Software/Virtual-TreeView
Keine Ahnung ob es das gleiche ist was du verwendest.

Zuletzt.
https://stackoverflow.com/questions/...ngetimageindex
https://stackoverrun.com/de/q/3265058

den index aus der ImageList bekommt man so.
VirtualStringTree1GetImageIndex

Bei Google suchenvirtualstringtree and imagelist delphi

EDIT:
Zitat:
Hier ist auch ein Beispiel wo SHGetFileInfo ständig aufgerufen wird ohne irgendwas mit Destroy oder so
Dann darfst du dich nicht wundern das nichts mehr gezeichnet wird.
ImageIndex := MeinNode-generisch.MeinIconIndex;
Du lädst jedesmal ein neues Icon.
Prüfe dann mal das Handle es ist unterschiedlich oder?
Also wird das Icon nicht freigegeben das bedeutet der Speicher deiner Anwendung explodiert Exponential
Das ist der Grund warum du dann irgendwann einfach nicht mehr zeichnen kannst.

Das du das Icon nicht mehr siehst ist normal nach DestroyIcon(Info.Hicon) denn du verwendest nicht den Index der ImageList sondern dein Index ist ein HIcon.
Das ist definitiv falsch!

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

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

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

  Alt 10. Dez 2020, 17:27
Zitat:
den index aus der ImageList bekommt man so.
VirtualStringTree1GetImageIndex
Also ich habe keine Ahnung wie man damit den ImageIndex aus der ImageList bekommen.

Alle deine Links kenne ich leider schon.

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

n/a Beiträge
 
#23

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

  Alt 10. Dez 2020, 17:33
Zitat:
den index aus der ImageList bekommt man so.
VirtualStringTree1GetImageIndex
Also ich habe keine Ahnung wie man damit den ImageIndex aus der ImageList bekommen.

Alle deine Links kenne ich leider schon.
Die Demos helfen leider nicht weiter, weil da überall nur feste IconIndexes zugewiesen werden und nichts vom System geladen wird.
Lese mein Edit.

Das einzige was noch helfen könnte prüfe ob sich das Handle des Icon zu dem vorherigen unterscheidet
und lösche das alte (HIcon) bevor du ein neues lädst.

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

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

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

  Alt 10. Dez 2020, 17:35
Zitat:
Hier ist auch ein Beispiel wo SHGetFileInfo ständig aufgerufen wird ohne irgendwas mit Destroy oder so
Dann darfst du dich nicht wundern das nichts mehr gezeichnet wird.
Eben dann wird doch alles gezeichnet. Das ist jetzt aber egal.

Zitat:
Das ist der Grund warum du dann irgendwann einfach nicht mehr zeichnen kannst.

Das du das Icon nicht mehr siehst ist normal nach DestroyIcon(Info.Hicon) denn du verwendest nicht den Index der ImageList sondern dein Index ist ein HIcon.
Das ist definitiv falsch!
Ich verstehe gar nichts mehr.
Im InitNode rufe ich 1x SHGetFileInfo auf. Und egal, ob ich da jetzt mit einer ImageList was mache, mit Destroy oder ohne: die Fehler kommen trotzdem.

Geändert von DieDolly (10. Dez 2020 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#25

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

  Alt 10. Dez 2020, 17:38
Wenn du jedes mal vom System lädst, was soll die ImageList?

Sonst müsstest du einmal beim Befüllen des VST bei jedem Node einmalig gucken welches Image mit welchem Index das in der ImageList ist und das dann in dem Node speichern.
Ralph
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#26

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

  Alt 10. Dez 2020, 17:39
Zitat:
Ich verstehe gar nichts mehr! Jetzt ist Destroy falsch?
Ja.

Weil du das zuletzt geladenen Icon freigibst und nicht das vorherige das geladen wurde.
Du erkennst den unterschied?
Prüfe doch einfach mal was für einen Speicher deine Anwendung verwendet und vor allem ob dieser freigegeben wird. (Taskmanager)

Zitat:
Wenn du jedes mal vom System lädst, was soll die ImageList?
Nun das schliesst aber nicht aus das die Handles der vorherigen geladenen Icons nicht freigegeben werden.
Das ist nun mal fakt.

Die frage ist doch was geladen wird.
Wenn es nur um System icons geht wie Folder ec.. dann ist eine Imagelist immer vom vorteil.
Denn diese ändern sich nicht.

Aber dafür gibt es ja schon eine liste "SystemImageList"

Zitat:
VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen
Aber gut die Frage ist mit einem Satz beantwortet.
Gebe die Icon Handles frei und alles ist gut.

Geändert von venice2 (10. Dez 2020 um 17:54 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#27

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

  Alt 10. Dez 2020, 18:06
Eine Idee hätte ich noch.
Nur zum testen ob dein Problem damit behoben ist.

Erstelle eine ImageList.
Add 1 Icon nach dem addieren lösche das Handle.
Dann übergeben jeder Node den Index 0 der ImageList.

Prüfe dann ob dein Problem behoben ist.
Ja jede Node hat dann das gleiche Icon. Ist auch nur zum testen gedacht ob dein Problem damit behoben ist.
Falls ja dann weist du woran es liegt.
  Mit Zitat antworten Zitat
DieDolly

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

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.680 Beiträge
 
Delphi 5 Professional
 
#29

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

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
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


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 14:42 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