![]() |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Hallo,
Delphi-Quellcode:
Und lass vor allem das Application.ProcessMessages; weg.
procedure Tfrm_main.SQLDataToVST_SubnetDetails;
var i : Integer; SubnetDetailsData : TOSubnetDetailsData; begin vst_network_subnetdetails.BeginUpdate; try vst_network_subnetdetails.Clear; ... und alles andere // Application.ProcessMessages; was soll das denn ???? finally vst_network_subnetdetails.EndUpdate; end; end; Ausserdem wundert mich, warum du überall String-Vergleiche hast
Delphi-Quellcode:
Du weisst schon, dass Column (als Integer beginnend mit 0) viel besser geeignet ist,
procedure Tfrm_main.vst_network_subnetdetailsGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var SubnetDetailsData : TOSubnetDetailsData; begin SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^); if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address' then CellText := SubnetDetailsData.ipaddress; if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device' then CellText := SubnetDetailsData.device; end; dann geht es sogar mit case ? Wenn du schon Strings vergleichst, dann so
Delphi-Quellcode:
Bringst zumindestens ein bisschen Speed-Up.
procedure Tfrm_main.vst_network_subnetdetailsGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var SubnetDetailsData : TOSubnetDetailsData; begin SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^); if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address' then begin CellText := SubnetDetailsData.ipaddress; Exit; end; if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device' then begin CellText := SubnetDetailsData.device; Exit; end; end; Heiko |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
BeginUpdate verursacht das der Tree sich erstmal nicht neu zeichnet, nicht sortiert und nichts anderes zwischenzeitlich macht.
das app.processmessages würde ich übrigens auch weg lassen. |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
ok, ich werde das morgen versuchen. Leider habe ich die Sachen nur auf Arbeit.
Vielen Dank für die guten Ideen. Ich werde es euch wissen lassen, ob es geholfen hat. Sven |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Achso...
Den String Vergleich mache ich deshalb weil die Splaten verschiebbar sind. Oder bleibt zur Laufzeit der ColumIndex gleich dem ColumIndex zur Entwurfszeit? Wenn nicht, macht der String Vergleich schon Sinn, oder? Natürlich nur mit dem Break. |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Ist es empfehlenswert immer mit BeginUpdate und EndUpdate zu arbeiten, wenn etwas am VST gemacht wird? Zum Beispiel beim OnGetText oder OnCompareNode?
Vielen Dank im voraus. |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
nee, isses nicht.
Dieses ist nur nötig, wenn "viel" geändert werden soll, also bei Schreibzugriffen, wie dem Hinzufügen oder Löschen von Nodes. Und OnGetText, sowie OnCompareNode führen nur Lesezugriffe aus. |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Zitat:
OnGetText wird ausgelöst, wenn der Text einer bestimmten Zelle o.ä. angezeigt werden soll, z.b. nach einem Scrollen von Zeilen. Zu dem Zeitpunkt wird aber an den Daten(Nodes) des Trees nichts mehr geändert. Ergo ist dafür keine solche Kapselung notwendig und wäre auch kontraproduktiv. Gruß, Christoph |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Danke.
|
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Zitat:
.BeginUpdate und .EndUpdate empfiehlt sich nur, wenn du .RootNodeCount änderst (bzw über .AddChild Datensätze hinzufügst, was ich nicht empfehle) Ich mache das immer so (mit einer Suchfunktion, ist immer ganz praktisch :mrgreen: ):
Delphi-Quellcode:
Du musst nur am Anfang deine Nutzdaten mit den Werten der Datenbank befüllen.
type
TMyTreeData = record Nr: Integer; end; PMyTreeData = ^TTreeData; ArrayOfInteger = array of Integer; var Nutzdaten: array of TMeineSelbstDefiniertenNutzdaten; Ergebnis: ArrayOfInteger; procedure foo; begin Ergebnis := SucheInNutzdatenNachWort(Nutzdaten, Wort); VST.BeginUpdate; VST.Clear; VST.RootNodeCount := Length(Ergebnis); VST.EndUpdate; end; procedure Bla.OnVSTInitNode(...); var Data: PMyTreeData; begin Data := VST.GetNodeData(Node); Data^.Nr := Ergebnis[Node.Index]; end; procedure Bla.OnVSTGetText(...); var Data: PTreeData; begin Data := VST.GetNodeData(Node); with Data^ do case ColumIndex of 0: ColumText := Nutzdaten[Nr].Wert1; 1: ColumText := Nutzdaten[Nr].Wert2; else ColumText := ''; end; end; Wenn du willst kann ich dir auch noch eine schnelle Suchfunktion hier rein stellen. |
Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
Hallo,
neeee, nur beim Füllen des Trees, dort wird eh (nach EndUpdate) OnGetText aufgerufen. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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 by Thomas Breitkreuz