Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Hallo,
ich habe ein Stringgrid indem 2600 Bohrpunkte mit zugehörigen Koordinaten gespeichert sind und ich habe ein Listview in dem Dateinamen von Protokollen und als 1.Subitem der Bohrpunkt gespeichert ist. Ich vergleiche jetzt per Schleife jede Stringgridreihe mit allen Listviewreihen, ob es einen Listvieweintrag mit gleichem Bohrpunkt gibt.Das sind also 2600 mal 2600 Vergleiche, das ist natürlich extrem langsam. Hat jemand eine andere Idee.
Delphi-Quellcode:
function FindListViewItem(lv: TListView; const S: string; column: Integer): TListItem;
var i: Integer; found: Boolean; begin Assert(Assigned(lv)); Assert((lv.viewstyle = vsReport) or (column = 0)); Assert(S <> ''); for i := 0 to lv.Items.Count - 1 do begin Result := lv.Items[i]; if column = 0 then found := AnsiCompareText(Result.Caption, S) = 0 else if column > 0 then found := AnsiCompareText(Result.SubItems[column - 1], S) = 0 else found := False; if found then Exit; end; Result := nil; end; procedure TForm1.ToolButton23Click(Sender: TObject); var lvItem: TListItem; begin for I := stringgrid2.RowCount-1 downto 1 do begin lvItem := FindListViewItem(ListView1, stringgrid2.Cells[0,i], 1); if lvItem <> nil then begin {mach was} end; end; end; |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Als erstes natürlich alle Daten in nicht sichtbaren Strukturen speichern. Hier bietet sich doch eine generische TList an, Records oder Klassenstrukturen.
Aber Daten in den visuellen Komponenten speichern ist eigentlich immer Pfui. |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Moin...:P
Zitat:
|
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Falls es funktioniert, setze ein BeginUpdate in der FindListView() (oder sogar schon in der ToolButton23Click()) Funktion relativ weit oben und kurz vor Schluss ein EndUpdate. Das sollte theoretisch alles um 100% beschleunigen.
Zitat:
[Edit] Was mir gerade noch so Einfällt um alles enorm zu beschleunigen, an der Stelle wo Du Dein Stringgrid mit Daten füllst, bastel eine kleine Unterfunktion ein die folgendes macht: Bohrpunkte in Stringgrid-Column[XY] rein PLUS Bohrpunkte in ein Array, im Nachhinein nurnoch das Array nach Werten durchforsten. Eine TList geht auch, sollte die gleiche Performance bringen. [/Edit] |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Erst lesen, dann verstehen, dann erst posten (oder auch nicht), das ist der ideale Weg. Es ging nicht um die Darstellung und damit das Laden der Daten, sondern darum, wo sie vorgehalten werden. Und da sind visuelle Komponenten die schlechteste Alternative.
|
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Zitat:
@verkouter: Hast Du Einfluss auf die Reihenfolge Deiner Rohdaten? Angenommen, sie lägen sortiert vor, könntest Du Dir viele Vergleiche sparen, weil z.B. ab einem gewissen Punkt nur noch größere Elemente kommen können als das gesuchte. (Nur als Beispiel...) Alternativ: Wie oft baust Du Grid und ListView auf und wie oft suchst Du? Man könnte beim Aufbau der Controls eine Art Lookup schaffen. Hier gäbe es beispielsweise das Dictionary, mit dem Du eine Abbildung von Bohrloch-Daten zu StringGrid-Zeilen machen könntest, sei es 1:1 oder 1:n. |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Darf ich mal etwas Fragen was glaube ich zum Thema passt und helfen würde es besser zu Verstehen .... (das hat nichts mit dem Thema "suchen/vergleichen" am Hut sondern Perfomance bzw Logik)
Also man hat eine Datei, möchte sich aus der Datei Daten in ein Stringgrid Anzeigen lassen, nun füll ich das Stringgrid mit Daten weil sie ja visuell Dargestellt werden sollen. Wenn ich nun die Daten vorher in eine TList oder Array oder sonst was lade/puffer um sie dann trotzdem visuell darzustellen, in wie fern beschleunigt es die visuelle Komponente wenn die Daten aus einem TList o.ä. kommen anstelle direkt von der Datei? Mit dem Begin/EndUpdate hatte ich angemerkt "Falls es funktioniert" weil ich mir nicht sicher war, danke für Klarstellung. Der zweite Tipp von mir allerdings sollte definitiv funktionieren da ich es selbst so einsetze, wobei anzumerken ist das ich bei mir mein Array und die Visuelle Komponente so abgestimmt habe das beide immer den gleichen Index besitzen was mir beim suchen und anzeigen einen enormen Performance Vorteil einbringt. (suchen in einem Array mit 500.000 Einträgen = wenn es langsam ist (CPU/Core auslastung hoch) dauerts zwei bis drei Sekunden aber in der Regel ist ein Ergebniss unter einer Sekunde da) |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Zitat:
Von einer Liste zu laden hat aber den unschlagbaren Vorteil, dass man immer alle Daten parat und schon in einer passenden Datenstruktur hat und nicht immer wieder von der Festplatte lesen und aufbereiten muss. Auf Dauer könnte es also schneller sein, nicht aber bei einmaliger Anwendung. |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Ah Okay, das Verstehe sogar ich :thumb:
Klingt ja auch logisch im Nachhinein :oops: |
AW: Eintrag aus Stringgrid mit Eintrag aus Listview vergleichen sehr langsam
Zitat:
Es könnten unnötige Messagen aufgerufen werden wenn ich Daten direkt aus einer Visuellen Komponente abrufe. Zum Beispiel WM_PAINT ob das erwünscht und tragbar ist mag dahin gestellt sein. Und ja wenn es so ist macht es sehr wohl einen großen Unterschied. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 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