![]() |
VirtualStringTree - Nodes hinzufügen
hallo, nach einigen stunden habe ich es endlich hinbekommen die komponente VST zu installieren.
ich bin aber irgendwie schockiert. denn die komponente ist so dermaßen mächtig und doch möchte ich doch nur Nodes hinzufügen. mit einer listview ging es so:
Delphi-Quellcode:
wie bekomme ich das mit der VST so hin? ich habe die VST schon im Stil eines ListView (vsReport) mit zwei Spalten.
var MeinItem: TListItem;
begin MeinItem:= ListView1.Items.Add; MeinItemChecked := True; MeinItemCaption := 'Item Caption'; MeinItemAdd('SubItem Caption'); end; aber wie füge ich etwas hinzu =/ |
AW: VirtualStringTree - Nodes hinzufügen
update:
ich schaffe es mittlerweile nodes aus einer dateiliste hinzuzufügen, diese korrekt und farblich darzustellen. das funktioniert alles wunderbar und schnell. doch wenn ich GetImageIndex verwende ist die VST sehr sehr träge und langsam. zudem werden nicht alle icons angezeigt. die systemicons hole ich so:
Delphi-Quellcode:
komischerweise sind auch nur 7 icons in der ImageList zu anfang.
// private deklariert
hImgSm: HIMAGELIST; aFileIcon: TSHFileInfo; // ... // OnCreate: hImgSm := HIMAGELIST(SHGetFileInfo('', 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_ICON)); if (hImgSm <> 0) then ImageList1.Handle := hImgSm; ImageList1.ShareImages := True; VST.Images := ImageList1; // ... procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: integer); var Data: PTreeData; begin Data := VST.GetNodeData(Node); begin ZeroMemory(@aFileIcon, SizeOf(aFileIcon)); if SHGetFileInfo(PChar(Data.sFileName), 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_ICON) <> 0 then begin ImageIndex := aFileIcon.iIcon; end; end; end; |
AW: VirtualStringTree - Nodes hinzufügen
Lerne von denen, die das professionell machen ;)
Wenn ich mir den Windows-Explorer anschaue, dann werden dort erst nur die Dateinamen angezeigt und einen kleinen Augenblick später erscheinen die Icons (sieht man sehr schön, wenn die Kiste mal gut ausgelastet ist). Die Icons und andere Zusatzinformationen werden per Thread geladen und dann nach und nach erst angezeigt. |
AW: VirtualStringTree - Nodes hinzufügen
Zitat:
Wie das jetzt ist weiß ich nicht, dafür sind die Rechner zu schnell, aber gelegentlich bin ich der Meinung noch einen Standard-Icon für kurze Zeit zu sehen. In Grunde ist das aber das gleiche, denn ob man kein Icon zuweist oder ein Standard-Icon, ist ja die gleiche Zeit. |
AW: VirtualStringTree - Nodes hinzufügen
ok das werde mir mal angucken. ich habe es bereits etwas umgestellt:
Delphi-Quellcode:
mit diesem gut war alles in ordnung. aber, ich weiß nicht seit wann, seit geraumer zeit sind die icons nicht mehr sichtbar. sie blitzen nur auf wenn ich scrolle.
procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: integer); var Data: PTreeData; Icon: TIcon; begin Data := VST.GetNodeData(Node); if (not Data.bUpdated) and (Column = 0) then begin Icon := TIcon.Create; ZeroMemory(@aFileIcon, SizeOf(aFileIcon)); SHGetFileInfo(PChar(Data.sFileName), 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_ICON); Icon.Handle := aFileIcon.hIcon; ImageIndex := ImageList1.AddIcon(Icon); Data.bUpdated := True; Icon.Free; end; end; ein wort zu dem bUpdated: wenn ich das nicht hinzufüge, dann "zeichnet" mein prozessor sich tot (cpu-last konstant 100). |
AW: VirtualStringTree - Nodes hinzufügen
Hi.
wenn du versuchst Windows-Explorer nachzubauen, es gibt schon eine fertige lösung dafür. und zwar die ![]() |
AW: VirtualStringTree - Nodes hinzufügen
Liste der Anhänge anzeigen (Anzahl: 1)
danke für den zipp aber das versuche ich nicht =)
zu meinem problem mit den icons die verschwunden sind und nur auftauchen wenn ich scrolle: siehe screenshot. der rot markierte kasten ist ein screenshot genau dann wann ich schnell scrolle. P.S.: und warum die CheckBox in column 1 ist und nicht in 0 weiß ich auch nicht =/ daten in treeview bringen:
Delphi-Quellcode:
var
TreeData: TTreeData; // ... VST.NodeDataSize := SizeOf(TTreeData); TreeData.a:= sl.Strings[i]; TreeData.b:= IntToStr(getFileSizeA(TreeData.sFileName)); TreeData.c:= DateTimeToStr(getFileLastModified(TreeData.sFileName)); TreeData.d:= '=>'; TreeData.e:= sl.Strings[i]; TreeData.f:= ''; TreeData.g:= ''; TreeData.bUpdated := False; AddVSTStructure(VST, TreeData); // ... function AddVSTStructure(aVST: TVirtualStringTree; aRecord: TTreeData): PVirtualNode; var Data: PTreeData; begin Result := aVST.AddChild(nil); Result.CheckType := ctCheckBox; Result.CheckState := csCheckedNormal; Data := aVST.GetNodeData(Result); aVST.ValidateNode(Result, False); Data^ := aRecord; end; |
AW: VirtualStringTree - Nodes hinzufügen
@Popov
Ich bezog mich schon auf die aktuelleren Windows-Versionen ;) So ist es, erst ist dort ein Standard-Icon und dann wird das übermalt/ersetzt. |
AW: VirtualStringTree - Nodes hinzufügen
Delphi-Quellcode:
Hier sieht man, dass du dein Icon direkt liest und speicherst. Das kostet Zeit. Ich habe in dem anderen Thread doch dieses Beispiel gepostet. Eine Seite weiter habe ich paar Änderungen gepostet. Da greift das Beispiel auf die ImageListe vom System und holt sich nur noch den ImageIndex. Guck dir das mal an. Zumindest brauchst du den Ordner-Icon nicht zig mal zu laden, sondern nur einmal.
SHGetFileInfo(PChar(Data.sFileName), 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_ICON);
Icon.Handle := aFileIcon.hIcon; ImageIndex := ImageList1.AddIcon(Icon); |
AW: VirtualStringTree - Nodes hinzufügen
das mit dem system-icon hatte ich vorher in einer listview schon eingesetzt. aber komischerweise werden bei der VST ungefähr 90% der icons nicht geladen.
momentan habe ich eh das problem dass gar keine icons angezeigt werden und ich verstehe nicht wieso (siehe posting open mit screenshot). ich bin echt zufrieden mit dieser komponente. aber es gibt viele dinge die ich vermisse und ich habe keine ahnung wie man das macht. z.b. vermisse ich MeinItem.SubItemImages[X] usw. generell. zudem wird meine checkbox nicht korrekt positioniert. leider weiß ich nicht wie man eine checkbox bei virtuellem modus in eine listiew zeichnet. dann würde ich VST nicht nutzen müssen. siehe hier: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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