Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Daten schnell in VST laden (https://www.delphipraxis.net/154537-daten-schnell-vst-laden.html)

youuu 14. Sep 2010 21:09

Datenbank: mysql • Version: 5.x • Zugriff über: devart

Daten schnell in VST laden
 
Hi,

wie lade ich am schnellsten mehrere 1.000 Daten in ein VST?
Momentan mach ich es über (gekürzt):
Delphi-Quellcode:
    liste.test1:= Query.FieldByName('test1').AsWideString;    
    Vst.addchild(nil, liste);
Jedoch dauert diese Art extrem lange.

wicht 14. Sep 2010 21:39

AW: Daten schnell in VST laden
 
Delphi-Quellcode:
Vst.RootNodeCount := 10000;
und dann im OnGetText-Event den passenden Text rausgeben. Das wäre eine Möglichkeit.

Satty67 14. Sep 2010 21:56

AW: Daten schnell in VST laden
 
Ja, denke wie bei jedem WinControl (z.B. auch StringGrid) bei größeren Datenmengen nichts in das Control laden sondern nur den sichbaren Abschnitt aus der externen Datenquelle laden und bereit stellen.

Luckie 14. Sep 2010 23:47

AW: Daten schnell in VST laden
 
Was soll der Benutzer mit tausend Datensätzen anfangen? Ich wäre da ziemlich überfordert, wenn ich die alle durchsehen müsste, um meine gewünschte Information zu bekommen.

wicht 15. Sep 2010 00:23

AW: Daten schnell in VST laden
 
Das ist natürlich wahr, aber eben eine der Stärken des VST :P

Die Frage ist auch noch, falls das hier youuu alles nicht so weiterhilft, wie er den Baum befüllt. Von welchem Typ ist das Objekt "liste"? Meine Zeit mit den DB-Komponenten ist lange vorbei... Macht er erst eine Query, iteriert dann über das Ergebnis und fügt jedes Node einzeln hinzu? Der Fehler wird vermutlich sein, dass das virtuelle Paradigma, oder wie man das nennt, hier nicht befolgt wurde. Selbst ein simples VST.Add() geht glaube ich noch recht schnell, auch wenn man es sehr sehr oft hintereinander aufruft. Das RootNodeCount ist aber der bessere Weg, denke ich.

Ich würde es mal so versuchen:
Query machen, Ergebnis irgendwo merken, RootNodeCount auf die Anzahl der Zeilen im Ergebnis setzen. Im OnGetText-Ereignis dann auf das gecachete Query-Ergebnis zugreifen und den passenden Text rausrücken. Dabei könnte man zum Beispiel den Index des Nodes, für welches OnGetText aufgerufen wird, benutzen, um die passenden Daten aus der Ergebnismenge herauszufischen.

Falls das auch noch nicht reicht.. etwas mehr Code, bitte :-D.. und Entschuldigung für meine sehr knappe Antwort von vorhin. Ich musste weg, aber musste trotzdem noch antworten, war so ein innerer Zwang.

Gute Nacht.

youuu 15. Sep 2010 07:17

AW: Daten schnell in VST laden
 
Morgen, bin gestern eingepennt :)

Also, ich mach ein Query auf die DB, fülle die Klasse Liste und pack es in das VST.

Delphi-Quellcode:
    Query.SQL.Text := 'Query String'

    Query.Open;

    while not Query.eof do
    Begin
      Liste := TListe.Create;
      with Liste do
      Begin
        liste.test1:= Query.FieldByName('test1').AsWideString;      
        .
        .
        .
      end;

      Vst.addchild(nil, Liste);

      Query.Next;
    End;

wicht 15. Sep 2010 11:15

AW: Daten schnell in VST laden
 
Hi,

mach doch mal zwei Schleifen, eine, die z.B. ein Array mit den "Liste"-Objekten befüllt, und dann eine, die die Nodes hinzufügt, basierend auf dem Array. Und dann guck mal, welche die meiste Zeit verbraucht. Ich vermute, dass die DB-Sachen dauern, das .Add() aber ganz schnell geht. Und falls nicht, versuch es mal mit dem RootNodeCount, wie oben vorgeschlagen.

HTH

youuu 15. Sep 2010 11:18

AW: Daten schnell in VST laden
 
Dann wird aber Zeit gleich bleiben im Endeffekt?
Oder verstehe ich das falsch?

Stevie 15. Sep 2010 11:59

AW: Daten schnell in VST laden
 
RootNodeCount auf RecordCount des DataSets setzen und im GetText den Datensatz im Dataset über den NodeIndex referenzieren. Dann wird beim Scrollen durch den VST auch im Dataset gescrollt.
Delphi-Quellcode:
  ds.Open;
  vst.RootNodeCount := ds.RecordCount;

...

// Im OnGetText
// Setzt vorraus, dass du vorher Columns im VST angelegt hast,
// die vom Index genau zu seinen Feldern im Dataset passen
// ansonsten einfach nen bestimmtes Feld nehmen
  if Column > -1 then
  begin
    ds.RecNo := Node.Index + 1;
    CellText := ds.Fields[Column].AsString;
  end;
@Luckie: Solch eine pauschale Aussage halte ich für überflüssig, es gibt durchaus Anwendungsfälle, wo man viele Daten präsentiert bekommt. Ob man dann eine weitere Auswertung durchführen kann (über Filter etc) steht auf einem anderen Blatt. 2 Fälle die mir sofort einfallen: 1. Anschauen eines Logs, 2. SQL Tool

Luckie 15. Sep 2010 12:01

AW: Daten schnell in VST laden
 
Zitat:

Zitat von Stevie (Beitrag 1049773)
Ob man dann eine weitere Auswertung durchführen kann (über Filter etc) steht auf einem anderen Blatt. 2 Fälle die mir sofort einfallen: 1. Anschauen eines Logs, 2. SQL Tool

Und warum dann den Filter nicht schon vorher anwenden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr.
Seite 1 von 2  1 2      

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