Delphi-PRAXiS
Seite 1 von 3  1 23      

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/)
-   -   Hilfeersuchen - schnelle Anzeige Textdatei in TListBox (https://www.delphipraxis.net/208037-hilfeersuchen-schnelle-anzeige-textdatei-tlistbox.html)

CaseyRyback 31. Mai 2021 10:44

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.

hoika 31. Mai 2021 10:59

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Hallo,
zeig doch mal etwas Quellcode,
wie Du das Einlesen machst.
(Stichwort z.B. BeginUpdate/EndUpdate)

stifflersmom 31. Mai 2021 11:01

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Wie wäre es mit:
Delphi-Quellcode:
Listboxdieesbetrifft.Items.LoadFromFile();

CaseyRyback 31. Mai 2021 13:16

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.

BerndS 31. Mai 2021 13:31

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Wie wäre es mit VirtualStringTree. Der ist sehr schnell und kostenlos.

TiGü 31. Mai 2021 14:55

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;
   ...
};

CaseyRyback 31. Mai 2021 17:02

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.

sakura 31. Mai 2021 17:13

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Wie oben schon erwähnt, warum nicht einfach
Code:
LBNCFile->Items->LoadFromFile(...)
?

...:cat:...

dummzeuch 31. Mai 2021 17:20

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
TStringGrid? Oder vielleicht sogar TVirtualStringGrid (gibt's doch jetzt in Delphi, oder? Falls nicht TdzVirtualStringGrid aus meiner dzlib), dann kann man den Text gleich in einer TStringList lassen.

Das kann allerdings von Hause aus keine Checkboxen, die muss man nachbauen. Ist aber recht einfach. Probier erstmal, ob es schnell genug wäre.

TurboMagic 31. Mai 2021 18:10

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Zitat:

Zitat von CaseyRyback (Beitrag 1490476)
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.

Zumindest an die Memo Zeilen kommst du über .Linea des Memos Ran.
Das ist ein TStrings, kann also wie ein Array angesprochen werden
und hat natürlich eine .Count Eigenschaft.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Seite 1 von 3  1 23      

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