![]() |
Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Hallo,
bitte um einen Tip. Aktueller Zustand.... Wir arbeiten mit C++Builder Seattle und haben eine recht große und komplexe Applikation. Wir lesenen eine Textdatei in eine ListBox ein und das dauert bei großen Dateien zB. >10MB sehr lange. Wir lesen die Datei zeilenweise und fügen das mit Add() der Listbox hinzu. Leider gibt es standardmäßig kein ReadFromFile() oder keine Stream-Methode. Ein Memofeld geht zwar sehr schnell aber wir müssen hinterher einzelne Zeilen einfach markieren können, in der Gesamtliste schnell blättern und mit TopIndex und ItemIndex zugreifen können bzw. bestimmte Einzelzeilen zu gegebener Zeit als markiert anzeigen. Gibt es eine andere Komponente, mit der ich diese großen Dateien möglichst schnell einlesen kann ? Wenn ich einen Wald- und Wieseneditor mit meinen Dateien füttere, auch mit 100MB Größe, dann ist das sofort sichtbar. Bin für jeden Tip dankbar... Gruß vom Bodensee B.L. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Hallo,
zeig doch mal etwas Quellcode, wie Du das Einlesen machst. (Stichwort z.B. BeginUpdate/EndUpdate) |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Wie wäre es mit:
Delphi-Quellcode:
Listboxdieesbetrifft.Items.LoadFromFile();
|
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
danke für die schnellen Antworten...
Mein Code sieht prinziell so aus... -----schnipp f = fopen(ncPfad.c_str(),"rt"); if (f != NULL) { while ( ! feof(f)) { fgets(str,190,f); LineStr = AnsiString(str); LineStr = LineStr.TrimLeft(); LBNCFile->Items->Add(LineStr); uiCount++; -----schnipp Items->LoadFromFile() hab ich auch grad getestet bringt, aber nicht wirklich eine Verbesserung. Kennt jemand eine andere Komponente ? Gerne auch etwas kostenpflichtiges ? Gruß C.R. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Wie wäre es mit VirtualStringTree. Der ist sehr schnell und kostenlos.
|
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Code:
f = fopen(ncPfad.c_str(),"rt");
if (f != NULL) { LBNCFile->Items->BeginUpdate; while ( ! feof(f)) { fgets(str,190,f); LineStr = AnsiString(str); LineStr = LineStr.TrimLeft(); LBNCFile->Items->Add(LineStr); uiCount++; ... } LBNCFile->Items->EndUpdate; ... }; |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Hallo und danke,
BeginUpdate() und EndUpdate() haben schonmal eine Halbierung der Zeit gebracht. Danke für den Tip. Hat jemand einen Hinweis auf eine andere Komponente ? TMemo geht sehr schnell aber wie komme ich dann an die einzelnen Textzeilen und wie könnte ich die jeweils ganze Zeile mit einem Mausklick markieren ? Editiren muß ich das nicht. Schönen Abend Gruß C.R. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Wie oben schon erwähnt, warum nicht einfach
Code:
?
LBNCFile->Items->LoadFromFile(...)
...:cat:... |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
TStringGrid? Oder vielleicht sogar TVirtualStringGrid (gibt's doch jetzt in Delphi, oder? Falls nicht
![]() Das kann allerdings von Hause aus keine Checkboxen, die muss man nachbauen. Ist aber recht einfach. Probier erstmal, ob es schnell genug wäre. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Zitat:
Das ist ein TStrings, kann also wie ein Array angesprochen werden und hat natürlich eine .Count Eigenschaft. Grüße TurboMagic |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Hallo und danke an alle,
ich werde die verschiedenen Sachen testen und schauen, ob das für unsere Anwendung geht. Gruß C.R. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
danke an alle, ich teste das und melde mich wieder...
Gruß C.R. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Statt VirtualStringtree würde auch ein einfaches TListView gehen.
Mit den Einstellungen
Delphi-Quellcode:
und
DoubleBuffered = True
OwnerData = True ReadOnly = True RowSelect = True ViewStyle = vsReport OnData = lv1Data
Delphi-Quellcode:
geht es sehr schnell, da die Daten nicht in das Listview geladen werden müssen.
procedure TForm1.lv1Data(Sender: TObject; Item: TListItem);
begin if Assigned(Item) then begin Item.Caption := Succ(Item.Index).ToString; Item.SubItems.Add(FLines[Item.Index]); end; end; FLines muss eine TStringList sein, die per LoadFromFile die Daten enthält. Das Beispiel verwendet zwei Spalten, Zeilennummer und Text. Es geht auch mit einer.
Delphi-Quellcode:
procedure TForm1.lv1Data(Sender: TObject; Item: TListItem);
begin if Assigned(Item) then Item.Caption := FLines[Item.Index]; end; |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Uwe Raabe hat vor langer Zeit eine kurze Geschichte zum ultraschnellen Befüllen von ListBoxen geschrieben. Ist in Delphi geschrieben, hilft aber doch sicher auch bei C++? Uwe Raabe verpackt 250'000 Einträge in 20 Millisekunden. Die ganze Story findest du
![]() |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
In Delphi gibt es seit der letzten Version die TControlList, eine sehr schnelle und einfach zu verwendende Listenkomponente.
Vielleicht die mal ansehen. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Danke für alle Hilfen, der Tipp mit der Virtuellen StringList klappt gut und wir haben das eingebaut.
Vielen Dank dafür.... Gruß vom Bodensee |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Ich habe mir mal das von Michael II genannte Beispiel von Uwe Raabe heruntergeladen und ausprobiert. Seltsamerweise lassen sich mit dem Rollbalken nicht alle 250000 Einträge anzeigen. Beim Erreichen von 65535 fängt die Anzeige wieder bei 1 an, und wenn ich dann den Rollbalken 'loslasse', springt er wieder zurück auf Anfang, bzw. die Position der letzten Anzeige (1..65535)
Wenn ich die Einträge mit den Scrolltasten Up, Down, und 'Bild auf' und 'Bild ab' durchgehe, werden alle 250000 angezeigt.
Delphi-Quellcode:
Ich habe keine Eigenschaft von TListbox gefunden, mit der sich dieses Vehalten beeinflussen läßt. Es würde mich doch mal interessieren, woran das liegen könnte.
unit Unit474;
interface uses System.SysUtils, System.Classes, Vcl.Forms, Vcl.StdCtrls, Vcl.Controls; type TForm474 = class(TForm) Button1: TButton; ListBox1: TListBox; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ListBox1Data(Control: TWinControl; Index: Integer; var Data: string); function ListBox1DataFind(Control: TWinControl; FindString: string): Integer; private FListBox1Items: TStringList; public destructor Destroy; override; end; var Form474: TForm474; implementation uses System.Diagnostics; {$R *.dfm} destructor TForm474.Destroy; begin FListBox1Items.Free; inherited Destroy; end; procedure TForm474.FormCreate(Sender: TObject); begin FListBox1Items := TStringList.Create; end; procedure TForm474.Button1Click(Sender: TObject); var I: Integer; sw: TStopWatch; begin sw := TStopwatch.StartNew; FListBox1Items.Clear; for I := 1 to 250000 do FListBox1Items.Add(I.ToString); ListBox1.Style := lbVirtual; ListBox1.Count := FListBox1Items.Count; Label1.Caption := sw.ElapsedMilliseconds.ToString; end; procedure TForm474.ListBox1Data(Control: TWinControl; Index: Integer; var Data: string); begin Data := FListBox1Items[Index]; end; function TForm474.ListBox1DataFind(Control: TWinControl; FindString: string): Integer; begin Result := FListBox1Items.IndexOf(FindString); end; end. Gruß LP |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Hallo Maekkelrajter
das ist mindestens in 10.4.2 (ich glaub schon viel länger) generell ein "Problem"* bei Listboxen mit vielen Einträgen (und hängt nicht mit dem Lösungsansatz von Uwe Raabe zusammen). [* in "", weil man wohl eher selten derart viele Elemente in eine Listbox quetscht. Problem, weil: Wenn's angeboten wird sollte es funktionieren.] Der Scrollbalken verhält sich nicht wie erwartet; springt nach dem nach unten Scrollen weit nach oben; dadurch wird dann auch nicht der Teil der Liste angezeigt, den man eigentlich hätte sehen wollen. (Mit Delphi 10.4.2, VCL Win32 und Win64 unter Microsoft Windows [Version 10.0.19043.1055] und auch mit älteren 10.0.19043 getestet.) Gruss Michael |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Gibt's dazu schon einen QP Eintrag?
Falls nicht, kann jemand einen erstellen? Ist halt auch die Frage woher der Scrollbar kommt. Wenn direkt aus Win32, dann könnte der Bug auch dort sein. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Zitat:
Nicht QP..., eher im Feedback Hub von microsoft als Feature Request für Windows 12 posten. Die MAXWORD Grenze beim Scrollen via Rollbalken ist eine Schranke von Windows; es läuft genau gleich "komisch", wenn C++ von m$ verwendet wird. (ListBox1.TopIndex := 70000 hingegen funktioniert problemlos.) |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Joar, aber sei froh, dass es erst ab 65k Probleme gibt, denn eigentlich ist war der Index "signed" und 16 Bit, also bloß bis 32k :stupid:
![]() |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Zitat:
Ja, war bei früheren Win Versionen so - aber heute funktionieren LB_SETTOPINDEX und LB_GETTOPINDEX jenseits der 64K Grenze problemlos. Nur via Scrollbalken geht's nicht; aber egal... es gibt sicher immer andere Lösungen als 1 Mio Items in einer einzigen Box. |
AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
Aber nur weil was 32 Bit hat, muß es nicht "immer" 32 Bit können, wenn es irgendwo irgendwie verwendet wird. :angle2:
z.B. ![]() ![]() Und hier wird zwar jetzt LongInt genutzt, aber es kann dennoch sein, dass eine (veraltete / nie aktualisierte) Implementation nicht vielleicht dennoch weiterhin SmallInt/Word verwendet und dann dennoch weiterhin überschlägt. :freak: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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