Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Es ist ein Wunder, dass er nur so lange braucht. Der Code ist mehr als unperformant und zudem auch sehr unsicher.
1. Zuweisen und Lesen von der Eigenschaft .Text baut den String jedesmal erneut auf bzw. parst ihn neu. 2. try/finally fehlt komplett 3. .RowCount in einer Schleife in einzelnen Schritten zu erhöhen bzw. zu verringern kostet viel Zeit. 4. Du setzt einen neuen Wert bei der Progressbar und zwingst ihn sofort neu zu zeichnen. Somit wird das Zeichnen der Progressbar mit jedem Durchlauf innerhalb der Schleife getan und kostet somit noch mehr Zeit. Grundlegend: Trenne Daten von der Oberfläche! |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Bitte wie?? was?
Zitat:
|
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
@ Muetze1 .. nein, er schrieb ja, dass es ab der Stringgrid langsam wird, das zuweisen ist alles noch fix.
also das Problem ist, dass Du den gesamten Text in die Stringgrid kopierst. Das schafft die nicht wirklich. Dafür ist sie nicht gedacht. Was Du brauchst ist eine "virtuelle" Stringgrid. Du musst im Ereignis OnDrawCell den Text mit Canvas.Textout selbst zeichnen. Und immer nur den bereich, der auf dem Bildschirm zu sehen ist. die Stringlist fungiert nur als Hintergrundspeicher. Dann gehts auch fix ... Für riesige Files, die größer sind als Dein Hauptspeicher, brauchst Du das File noch nichtmal in den Hauptspeicher laden. Dann genügt es, wenn Du nur den aktuellen Bereich, der vom User gerade angezeigt werden möchte lädst und anzeigst. Aber solche einfachen Dinge kann noch nicht mal Notepad .. Ultraedit macht das aber ... Im Prinzip reicht für solche großen Textdateien dann auch eine TDrawGrid ... P.S. für die Funktion StringReplace gibts in der JCL von Jedi eine schnellere Variante als die in der VCL |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Virtuelle Stringgrid?? langsam verstehe ich immer mehr Bahnhof.
StringReplace aus VCL --> Für das ersetzen von ca.200 ß(sz) in mehrere s sowie zurück ist die VCL doch noch schnell genug. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Er schreibt, dass das Befüllen des StringGrid sehr langsam ist ... und das glaube ich sogar :mrgreen:
1. StringGrid1.RowCount Das ständige Erhöhen des Wertes stresst unnötig. Setze am Anfang der Schleife den Wert und fertig 2. StringGrid1.Cells[ x, y ] Benutze besser StringGrid1.Rows[ y ] und zwar so:
Delphi-Quellcode:
Denn sonst aktualisiert sich das Formular zu Tode
StringGrid1.Rows.BeginUpdate; // Anzeige der StringGrid.Reihen nicht mehr aktualisieren
for Zeile := 0 to StringGrid1.RowCount - 1 do begin Spalte := 1; // fängt bei 0 an, also ist es die 2. Spalte im StringGrid StringGrid1.Rows[ Zeile ][ Spalte ] := 'Tach auch'; end; StringGrid1.Rows.EndUpdate; // Anzeige der StringGrid.Reihen wieder aktualisieren 3. ProgressBar Die ProgressBar braucht auch nicht jede Änderung mitzubekommen
Delphi-Quellcode:
Dann sollte das schon schneller laufen
MaxWert := 10000;
ProgressBar1.Max := MaxWert; for i := 0 to MaxWert - 1 do begin if ( i mod 100 = 0 ) or ( i = MaxWert ) then ProgressBar1.Position := i; end; |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
Es geht auch so, wie Du es gemacht hast, dann aber mit einer zweiten Scrollbar neben der Stringgrid, welche diese ersetzt. Stringgrid.rowcount wird auf 30 oder so gesetzt. virtuell bedeutet. Du hast ein File mit 1 Mio Textzeilen. Beim Anzeigen siehst Du aber nur vielleict 30 Zeilen in der Stringgrid. Die Stringgrid hat nie mehr als 30 Zeilen effektive Einträge. Beim Scrollen wird Dir nur vorgegaugelt, es wäre soviel drin. in Wahrheit wird die gewünschte Anzeige erst dann live hineingemalt. Du schmeißt also nicht 1 Mio Zeilen in die Stringgrid, sondern immer nur 30 ... |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
.. ich hatte bei der Stringgrid gerade vergeblich BeginUpdate gesucht, .. in den Rows hat sich das also versteckt. ja .. das wäre eine Maßnahme die sehr helfen könnte :mrgreen: |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
Die Komponente fragt diese 30 Zeilen per Index ab und ich muss nur darauf reagieren und diese Informationen liefern. Aber auch nur genau in diesem Moment. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
@ Sir Rufo Also zwischen beginUpdate und endUpdate den QuellText setzen und damit die Stringgrid Aktualisierung aufheben. Ich werde das ganze mal ausprobieren. |
Re: TStringlist, THashedStringlist gibts nichts schnelleres?
Zitat:
.beginUpdate sowie .endUpdate wird zwar von der Codevervollständigung unterstützt, der Compiler dagegen erwartet eine eckige Klammer und compiliert deshalb nicht. Die Progressbar hab ich vorerst vollständig weggelassen so das mein Text jetzt so aussieht:
Delphi-Quellcode:
Try finally hab ich jetzt nur reingesetzt, sicher bin ich mir nicht wozu das gut sein soll.
begin
Screen.Cursor := crHourGlass; startZeit := now; x:=tstringlist.Create; x.LoadFromFile('C:\DB\DatenTest.tmp'); x.Text:= StringReplace(x.Text,'ß','SSSSSSS', [rfReplaceAll]); x.Sort; x.Text:= StringReplace(x.Text,'SSSSSSS','ß',[rfReplaceAll]); x.SaveToFile('sortiert.txt'); // ab hier wird es extrem langsam a:=0; // stringgrid1.rows.beginupdate; //fehlermeldung: [ erwartet // try for b:=0 to x.count-1 do begin if b>0 then begin if x.strings[b]=x.Strings[b-1] then begin StringGrid1.cells[1,a]:= inttostr(strtoint (StringGrid1.cells[1,a])+1) end else begin inc(a); StringGrid1.cells[1,a] := '1'; StringGrid1.cells[0,a] := x.strings[b]; StringGrid1.RowCount := StringGrid1.RowCount+1; end; end else begin StringGrid1.cells[0,a]:=x.Strings[b]; StringGrid1.cells[1,a]:='1'; end; end; // finally; // stringgrid1.rows.endUpdate //fehlermeldung: [ erwartet x.Destroy; StopZeit := Now; StatusBar6.Panels[1].Text :='SuchZeit : '+ FormatDateTime('nn:ss:zzz', StopZeit - StartZeit) ; Screen.Cursor := crDefault; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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