Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VirtualStringTree - Nodes hinzufügen (https://www.delphipraxis.net/179669-virtualstringtree-nodes-hinzufuegen.html)

d7user1 23. Mär 2014 21:08

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:
var MeinItem: TListItem;
begin
 MeinItem:= ListView1.Items.Add;
 MeinItemChecked := True;

 MeinItemCaption := 'Item Caption';
 MeinItemAdd('SubItem Caption');
end;
wie bekomme ich das mit der VST so hin? ich habe die VST schon im Stil eines ListView (vsReport) mit zwei Spalten.
aber wie füge ich etwas hinzu =/

d7user1 23. Mär 2014 21:47

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:
  // 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;
komischerweise sind auch nur 7 icons in der ImageList zu anfang.

Sir Rufo 23. Mär 2014 22:29

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.

Popov 23. Mär 2014 23:12

AW: VirtualStringTree - Nodes hinzufügen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1253176)
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).

Jajn. Ich kann mich noch bei Windows 95 erinnern, da wurden die alle Icons eigentlich direkt geladen (ob im ersten Gang oder per Thread). Auf jeden Fall konnte da der Explorer sehr langsam sein. Das Problem hat man bald beseitigt, und so wie ich es beobachten konnte wurde zuerst ein 08/15 Standard-Icon zugewiesen. Erst im zweiten Durchlauf wurde der richtige Icon nachgeladen und korrigiert.

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.

d7user1 23. Mär 2014 23:13

AW: VirtualStringTree - Nodes hinzufügen
 
ok das werde mir mal angucken. ich habe es bereits etwas umgestellt:

Delphi-Quellcode:
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;
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.

ein wort zu dem bUpdated: wenn ich das nicht hinzufüge, dann "zeichnet" mein prozessor sich tot (cpu-last konstant 100).

Wishmaster 23. Mär 2014 23:15

AW: VirtualStringTree - Nodes hinzufügen
 
Hi.

wenn du versuchst Windows-Explorer nachzubauen, es gibt schon eine fertige lösung dafür. und zwar die Mustangpeak Components die sind open Source!:thumb:

d7user1 23. Mär 2014 23:19

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;

Sir Rufo 23. Mär 2014 23:20

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.

Popov 23. Mär 2014 23:21

AW: VirtualStringTree - Nodes hinzufügen
 
Delphi-Quellcode:
      SHGetFileInfo(PChar(Data.sFileName), 0, aFileIcon, SizeOf(aFileIcon), SHGFI_SYSICONINDEX or SHGFI_ICON);
      Icon.Handle := aFileIcon.hIcon;

      ImageIndex := ImageList1.AddIcon(Icon);
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.

d7user1 23. Mär 2014 23:24

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: http://www.delphipraxis.net/179658-l...heckbox-2.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.
Seite 1 von 6  1 23     Letzte »    

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