Delphi-PRAXiS
Seite 2 von 3     12 3      

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 1. Jun 2021 11:14

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.

CaseyRyback 1. Jun 2021 13:00

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
danke an alle, ich teste das und melde mich wieder...
Gruß
C.R.

BerndS 1. Jun 2021 13:11

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Statt VirtualStringtree würde auch ein einfaches TListView gehen.
Mit den Einstellungen
Delphi-Quellcode:
    DoubleBuffered = True
    OwnerData = True
    ReadOnly = True
    RowSelect = True
    ViewStyle = vsReport
    OnData = lv1Data
und
Delphi-Quellcode:
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;
geht es sehr schnell, da die Daten nicht in das Listview geladen werden müssen.
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;

Michael II 7. Jun 2021 22:41

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 hier.

Neumann 8. Jun 2021 07:35

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.

CaseyRyback 15. Jun 2021 11:08

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

Maekkelrajter 16. Jun 2021 10:42

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:
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.
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.

Gruß LP

Michael II 16. Jun 2021 15:52

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

TurboMagic 16. Jun 2021 23:17

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.

Michael II 18. Jun 2021 13:52

AW: Hilfeersuchen - schnelle Anzeige Textdatei in TListBox
 
Zitat:

Zitat von TurboMagic (Beitrag 1491162)
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.


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.)


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

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