Delphi-PRAXiS

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/)
-   -   Delphi Virtual TreeView (https://www.delphipraxis.net/20910-virtual-treeview.html)

celinaw 25. Apr 2004 09:16


Virtual TreeView
 
Hi, Guten Morgen @all

Kennt sich hier jemand mit der Virtual TreeView aus?
Ich habe bissher die Daten mit unten stehendem Code in eine TListView Komponente eingelesen.
Bei vielen Datensätzen ist das jedoch relativ langsam. Jetzt habe ich etwas über die VirtualTreeView gelesen.
Diese soll schneller und flexiebler sein.
Ich habe mir das Tutorial dazu angesehen, komme aber nich damit klar.
Kann mir mal jemand an unten stehendem Beispiel erklären wie ich die Daten anstelle des TListView(lvAnzeige) jetzt in die VirtualTreeView bekomme?

Hier ein Link zu der Komponente : http://www.lischke-online.de/VirtualTreeview/VT.php



Delphi-Quellcode:
procedure TForm1.bSucheClick(Sender: TObject);
var
   ListItem : TlistItem;
begin
  dbMain.HostName:=edServer.Text; //Server
  dbMain.User:=edLogin.Text; //Benutzername
  dbMain.Password:=edPassword.Text; //Passwort
  dbMain.Database:=edDB.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  lvAnzeige.Items.Clear;
  try
    qrMain.SQL.Text :=
  'SELECT ' +
    'T.Order_Type,' +
    'T.Customer_Number,' +
    'T.Order_Number,' +
    'T.First_Event,' +
    'T.PrePrint,' +
    'T.Print,' +
    'T.Cewe_Batch,' +
    'T.Iqena_Batch,' +
    'T.BMSLogout,' +
    'K.Na,' +
    'K.Customer_Number,' +
    'K.Str,'+
    'K.Ort,' +
    'K.Tel,' +
    'K.PFD,' +
    'K.Fach_TAG,' +
    'K.Fach_NAcht,' +
    'K.Ap,' +
    'K.PLZ ' +
  'FROM ' +
    'table_ordertracking T,' +
    'kundenmg K ' +
  'WHERE ' +
    'T.Customer_Number=K.Customer_Number ' +
    'AND ' +
    'T.Customer_Number like ''' + edknr.Text + '''"%" ' +
    'AND ' +
    'T.Order_Number like ''' + edatnr.Text + '''"%" ' +
  'ORDER BY ' +
    'T.Order_Number;';

     qrMain.Open;
     qrMain.FieldByName('Order_Type').AsString;
     gauge1.Visible:= True;
     gauge1.maxvalue := qrMain.recordcount;

     while not qrMain.Eof do
  begin
    ListItem := lvAnzeige.Items.Add;
    ListItem.Caption:=qrMain.FieldByName('Order_Type').AsString;
    ListItem.SubItems.Add(qrMain.FieldByName('Customer_Number').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('Order_Number').AsString);
    ListItem.SubItems.Add(FormatDateTime('dd.mm.yyyy    hh:mm:ss', qrMain.FieldByName('First_Event').AsDateTime));
    ListItem.SubItems.Add(qrMain.FieldByName('PrePrint').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('Print').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('BMSLogout').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('CeWe_Batch').AsString);
    gauge1.progress := gauge1.progress + 1;
    qrMain.Next;
  end;
   gauge1.progress := 0;
   gauge1.Visible:= false;

  finally
    dbMain.Connected:=False; //Verbindung trennen

  end;
 end;


Gruß CelinaW

Sharky 25. Apr 2004 09:29

Re: Virtual TreeView
 
Hai celinaw,

mit dem Virtual TreeView habe ich auh noch nicht gearbeitet. Aber Du solltest beim zufügen von vielen Daten zu einem TListView auf jeden Fall ein Items.BeginUpdate und Items.EndUpdate verwenden.

celinaw 25. Apr 2004 09:43

Re: Virtual TreeView
 
Hi Sharky

Bin leider noch Delphi Newbie.

Zitat:

Items.BeginUpdate und Items.EndUpdate
Sorry, aber das sagt mir nichts. Ich habe hier einige Delphi Bücher liegen und versuche halt fleißig zu lernen.
Dabei ist dieses Forum übrigens eine Super Hilfe :thuimb:
Muss allen hier mal ein Dickes Lob aussprechen. :love: :hello: :hello:
Wenn du mir das etwas genauer erklären könntest :oops: wäre ich dir dankbar.

Gruß CelinaW

Sharky 25. Apr 2004 10:04

Re: Virtual TreeView
 
Zitat:

Zitat von celinaw
...Bin leider noch Delphi Newbie.....

Das waren wir alle einmal oder sind es sogar noch immer ;-)

Einem ListView kannst Du sagen das es nicht jedesmal wenn Du ein Item hinzufügst oder änderst die Anzeige aktualisierst.
Dies benötigt nämlich relativ viel Zeit.

Zitat:

Zitat von Die Onlinehilfe
Die Methode BeginUpdate verhindert die Aktualisierung des TListItem-Objekts, bis die Methode EndUpdate aufgerufen wird.

Delphi-Quellcode:
begin
  lvAnzeige.Items.BeginUpdate; // Verhindert das die Anzeige aktualisiert wird.
  // Hier jetzt
  // Die Daten aus deiner Datenbank
  // eintragen
  lvAnzeige.Items.EndUpdate; // Erst jetzt die Anzeige aktualisieren.
end;

MrKnogge 25. Apr 2004 10:06

Re: Virtual TreeView
 
For der Schleife, in der du die Items hinzufügst schreibst du:
Delphi-Quellcode:
lvAnzeige.Items.BeginUpdate;

danach

lvAnzeige.Items.EndUpdate;
Dies hat den Vorteil, dass dein ListView nicht immer wieder neugezeichnet wird, sondern erst wenn alle Einträge hinzugefügt wurden.

celinaw 25. Apr 2004 10:12

Re: Virtual TreeView
 
:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Vielen Dank!
Das werde ich auf jedenfall mal so machen. Dennoch hoffe ich das mir das mal jeman mit der VirtualTreeView erlärt.
Diese hat nähmlich einige Extras die ich bei der TListView vermisse. Beispielsweise kann man hiermit Spalten ausblenen.
Bei der TListView kann man das nur umständlich über die "Width" Einstellung machen.

Erst aml Vielen Dank für deine Erklärung und das Beispiel :thuimb:

Gruß CelinaW

celinaw 25. Apr 2004 10:19

Re: Virtual TreeView
 
Also in meinem Fall ist es dann so?! :thuimb:

Delphi-Quellcode:
    while not qrMain.Eof do
  begin
    lvAnzeige.Items.BeginUpdate;  
    ListItem := lvAnzeige.Items.Add;
    ListItem.Caption:=qrMain.FieldByName('Order_Type').AsString;
    ListItem.SubItems.Add(qrMain.FieldByName('Customer_Number').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('Order_Number').AsString);
    ListItem.SubItems.Add(FormatDateTime('dd.mm.yyyy    hh:mm:ss', qrMain.FieldByName('First_Event').AsDateTime));
    ListItem.SubItems.Add(qrMain.FieldByName('PrePrint').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('Print').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('BMSLogout').AsString);
    ListItem.SubItems.Add(qrMain.FieldByName('CeWe_Batch').AsString);
    gauge1.progress := gauge1.progress + 1;
    qrMain.Next;
    lvAnzeige.Items.EndUpdate;
  end;
Hab ich das richtig verstanden?

Sharky 25. Apr 2004 10:24

Re: Virtual TreeView
 
Zitat:

Zitat von celinaw
Also in meinem Fall ist es dann so?!

Nein! ;-) Dann würdest Du ja doch nach jedem neuen Eintrag "updaten".

Delphi-Quellcode:
   lvAnzeige.Items.BeginUpdate;  // Bevor neue Einträge reinkommen
   while not qrMain.Eof do       // Jetzt kommen die Daten
   begin
     ListItem := lvAnzeige.Items.Add;
     ListItem.Caption:=qrMain.FieldByName('Order_Type').AsString;
     ListItem.SubItems.Add(qrMain.FieldByName('Customer_Number').AsString);
     ListItem.SubItems.Add(qrMain.FieldByName('Order_Number').AsString);
     ListItem.SubItems.Add(FormatDateTime('dd.mm.yyyy    hh:mm:ss', qrMain.FieldByName('First_Event').AsDateTime));
     ListItem.SubItems.Add(qrMain.FieldByName('PrePrint').AsString);
     ListItem.SubItems.Add(qrMain.FieldByName('Print').AsString);
     ListItem.SubItems.Add(qrMain.FieldByName('BMSLogout').AsString);
     ListItem.SubItems.Add(qrMain.FieldByName('CeWe_Batch').AsString);
     gauge1.progress := gauge1.progress + 1;
     qrMain.Next;
  end;                          // Alle Daten sind eingefügt
  lvAnzeige.Items.EndUpdate;    // NACH dem ALLE neuen Einträge eingefügt wurden.

celinaw 25. Apr 2004 10:48

Re: Virtual TreeView
 
:oops: :oops: :oops: :oops: :oops:

:angle2: Ups, hört sich logisch an!

Sehr schön! Ist jedenfalls schon einmal schneller geworden :thuimb:

Vielen Dank :hello:

Sharky 25. Apr 2004 10:53

Re: Virtual TreeView
 
Zitat:

Zitat von celinaw
..Sehr schön! Ist jedenfalls schon einmal schneller geworden ...

Sehr schön! Um welchen Faktor ist es denn schneller geworden?
Bevor Du dir jetzt einen Wolf programmierst um ein anderes TreeView zu füllen würde ich ersteinmal testen ob der Flaschenhals nicht die Datenbank ist.
Du kann ja einfach mal in einer Schleife 1000 Einträge in die TreeView machen und dies dann mit dem füllen aus der DB vergleichen.

Ich gehe nämlich davon aus das es auch mit dem Virtual TreeView nicht schneller wird.

celinaw 25. Apr 2004 11:02

Re: Virtual TreeView
 
:gruebel: Diesen Gedanken hatte ich auch bereits!

Aber das ist nicht der Fall. Das langsamste ist defenitiv die TListView.
Ich habe das bereits ausprobiert. Aber dennoch danke für den Hinweis!

PS:
Ist wirklich ein Tolles Forum! Bei euch ist es nicht einfach mit einer einfachen Antwort getan :thuimb:
Ich finde es klasse das sich hier wirklich Mühe gegeben wird etwas zu erklären.
Denke mal hier kann ich noch so einiges lernen. :-D

:coder: Gruß CelinaW

celinaw 25. Apr 2004 11:03

Re: Virtual TreeView
 
Ups.........

Zitat:

Um welchen Faktor ist es denn schneller geworden?
Nun, ich denke so um die 30% ist es schon.........

celinaw 25. Apr 2004 19:08

Re: Virtual TreeView
 
Hi @all

Kann mir keiner mit der VirtualTreeView Helfen? :(

Gruß CelinaW

samson 25. Apr 2004 21:04

Re: Virtual TreeView
 
Hallo,

es gibt nen Tutorial bei: Virtual Tree View

Die Tutorials haben mir auch schon viel geholfen.

Gruß´


Samson

celinaw 25. Apr 2004 21:22

Re: Virtual TreeView
 
Hi Samson

Danke, aber das Tutorial hab ich schon durch. Habs leider nicht für meinen zweck umsetzen können :(

Ich brauche mal ein klares Beispiel anhand meines Source :oops:

Kannst du mir da Helfen? :angle2:

Gruß CelinaW

samson 26. Apr 2004 08:07

Re: Virtual TreeView
 
Gerne will ich Dir helfen.

Wegen Termindruck, kann ich das aber nicht vor zwei Wochen tuen. Selbst dann muss ich gucken.

Gruß


Frank

generic 26. Apr 2004 09:18

Re: Virtual TreeView
 
der vst ist um einiges schnell als der treeview von windows.

der trick ist die statische speicherverwaltung.
erstell mal ein form, ein vst drauf, 4 spalten

um mit den vst zu arbeiten muss du dir erstmal ein record erstellen welches dann spaeter die daten halten soll.
desweiteren brauchst du einen zeiger auf deine daten.

Delphi-Quellcode:
type
  pVstDaten = ^rVstDaten;
  rVstDaten = Record
    spalte1, spalte2, spalte3 : String;
  end;
nun muss du den vst noch mitteilen wie gross deine daten sind.
das geht am besten im form.create

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.NodeDataSize:=sizeof(rVstDaten);
end;
wenn jetzt ein knoten hinzugefügt wird weiss der vst wieviel platz er jedesmal allocen muss.
um den tree zu füllen machst du folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
    aktueller_knoten : PVirtualNode;
    Daten_zum_knoten : pVstDaten;
begin
  // u.a. neuzeichnen verhindern
  VirtualStringTree1.BeginUpdate;
  for i:=0 to 1000 do
  begin
    aktueller_knoten:=VirtualStringTree1.AddChild(nil);
    Daten_zum_knoten:=VirtualStringTree1.GetNodeData(aktueller_knoten);

    Daten_zum_knoten.zeile:=i;
    Daten_zum_knoten.spalte1:='Das ist der Text Spalte: 1 Zeile:'+inttostr(i);
    Daten_zum_knoten.spalte2:='Das ist der Text Spalte: 2 Zeile:'+inttostr(i);
    Daten_zum_knoten.spalte3:='Das ist der Text Spalte: 3 Zeile:'+inttostr(i);
  end;
  // wieder zeichnen lassen;
  VirtualStringTree1.EndUpdate;
end;

da baum zeigt jetzt erstmal nur "node" als text an.
es gibt ein ereignis "ongettext"
dort gibts du den text zurueck der im knoten angezeigt werden soll.
hat den vorteil das du die daten beliebig aufbereiten kannst.

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);

var Daten_zum_knoten : pVstDaten;
begin
  Daten_zum_knoten:=VirtualStringTree1.GetNodeData(node);

  if TextType=ttNormal then
  begin
    case Column of
      0: CellText:=Daten_zum_knoten.spalte1;
      1: CellText:=Daten_zum_knoten.spalte2;
      2: CellText:=Daten_zum_knoten.spalte3;
      3: celltext:='Nun die Dynamische Spalte Nummer 4 mit Zeile:'+IntToStr(Daten_zum_knoten.zeile);
    end;
  end;
end;
so das sollte es sein.

generic 26. Apr 2004 09:24

Re: Virtual TreeView
 
ach ja habe noch diese zu deinen code anzumerken:


Delphi-Quellcode:
   
    'WHERE ' + 
    'T.Customer_Number=K.Customer_Number ' + 
    'AND ' + 
    'T.Customer_Number like ''' + edknr.Text + '''"%" ' + 
    'AND ' + 
    'T.Order_Number like ''' + edatnr.Text + '''"%" ' + 
    'ORDER BY ' + 
    'T.Order_Number;';
die editfelder niemals direkt einbinden.
arbeite lieber mit "parameter"

lies die das hier mal durch:
http://www.nextgenss.com/papers/adva..._injection.pdf

das bezieht sich zwar auf eine asp seite funktz aber genau so in anwendungen.

celinaw 27. Apr 2004 00:04

Re: Virtual TreeView
 
Hi generic

:thuimb: :thuimb:

Danke, das hst du gut erklärt. Ich werde es mal ausprobieren und hoffe das ich damit klar komme.
Ich werde auf jeden Fall wieder Posten wie es ausgegangen ist.
Und danke für den Tip mit den editfeldern!

Liebe grüße Celina

celinaw 27. Apr 2004 00:05

Re: Virtual TreeView
 
Hi samson

:nerd: Schön das du mir helfen willst. Ich werde mal versuchen ob ich es mit den Tips von generic hin bekomme.
Ich melde mich wieder!

:coder: :coder: :coder:

Vielen Dank

generic 27. Apr 2004 10:42

Re: Virtual TreeView
 
hab noch einen fehler enddeckt im record fehlt

zeile : integer;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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