AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

VirtualStringTree - Nodes hinzufügen

Ein Thema von d7user1 · begonnen am 23. Mär 2014 · letzter Beitrag vom 30. Mär 2014
Antwort Antwort
Seite 1 von 6  1 23     Letzte » 
d7user1
(Gast)

n/a Beiträge
 
#1

VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 21:08
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 =/
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#2

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 21:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 22:29
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Mär 2014 um 22:40 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:12
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.
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#5

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:13
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).

Geändert von d7user1 (23. Mär 2014 um 23:15 Uhr)
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#6

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:15
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!
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#7

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:19
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;
Miniaturansicht angehängter Grafiken
sans-titre.png  

Geändert von d7user1 (23. Mär 2014 um 23:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:20
@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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:21
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.
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#10

AW: VirtualStringTree - Nodes hinzufügen

  Alt 23. Mär 2014, 23:24
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

Geändert von d7user1 (23. Mär 2014 um 23:53 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf