Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherstelle und StringGrid (https://www.delphipraxis.net/74200-speicherstelle-und-stringgrid.html)

Nisbo 30. Jul 2006 12:25


Speicherstelle und StringGrid
 
Moin Moin,

ich habe im moment einen kleinen Hänger und komme da nicht weiter,
ich lese aus einer textdatei einen csv-text aus mit diesem code

Delphi-Quellcode:
    Screen.Cursor := crHourGlass;

    csv := TStringList.Create;
    csv.LoadFromFile('artikel_shop_' + StringGrid1.Cells[2,stringgrid1.row] + '.txt');
    StringGrid2.Rowcount := csv.Count;

    for ccc2 := csv.Count - 1 downto 1 do
      begin
        AnzTokens := Explode(A, ';', csv.Strings[ccc2]);
        for i := 0 to AnzTokens -1 do
          begin
            ccc := ccc+1;
              if ccc < 2 then begin
                StringGrid2.Cells[ccc, ccc2] := A[i];
              end;
              if ccc = 21 then begin
                ccc := -1;
              end;

          end;
      end;
      Screen.Cursor := crDefault;
aus und speicher diesen im StringGrid2
Explode zerlegt hierbei die ; getrennten text in seine bestandteile

das ganze funktioniert auch, allerdings ist mein problem dabei die zeit bis dies alles eingelesen ist (davon allerdings nur der artikelname und die artikelID) und auch die programmlast von 100% über ca 1 Minute bei ca 1800 Zeilen und einer dateigröße von ca 2,3 MB und das möchte ich vermeiden

wenn ich alles ins Grid schreibe dann hört das programm gar nicht mehr auf mit der systemlast und hängt bis ich es abschieße

habt ihr da ideen wie ich das besser lösen kann

ach ja D5 habe ich

Christian Seehase 30. Jul 2006 13:08

Re: Speicherstelle und StringGrid
 
Moin Nisbo,

die Geschwindigkeit könntest Du so erhöhen (ungetestet)

Delphi-Quellcode:
StringGrid2.Rows.BeginUpdate;
try
  // hier die Schleife
finally
  StringGrid2.Rows.EndUpdate;
end;
dann wird das StringGrid nicht immer neu gezeichnet, bevor es gefüllt ist.

Ausserdem noch ein Application.ProcessMessages in die Schleife einbauen.
Z.B. direkt zu beginn der äusseren-Schleife.

Statt des BeginUpdate/EndUpdate könntest Du auch den RowCount vor der Schleife auf 0, und nach der Schleife auf den gewünschten Wert setzen. Das könnte bei einem StringGrid den gleichen Effekt haben, da RowCount nur für die Anzeige der Zeilen interessant ist.

Nisbo 30. Jul 2006 16:54

Re: Speicherstelle und StringGrid
 
Zitat:

Zitat von Christian Seehase
Statt des BeginUpdate/EndUpdate könntest Du auch den RowCount vor der Schleife auf 0, und nach der Schleife auf den gewünschten Wert setzen. Das könnte bei einem StringGrid den gleichen Effekt haben, da RowCount nur für die Anzeige der Zeilen interessant ist.

thx erstmal für den tipp, aber das hat es leider bnicht getan
bei

Delphi-Quellcode:
StringGrid2.Rows.BeginUpdate;
try
  // hier die Schleife
finally
  StringGrid2.Rows.EndUpdate;
end;
bekomme ich nur die Info das bei StringGrid2.Rows.BeginUpdate ein [ erwartet wird aber ein . (Punkt) gefunden wurde, das tut es also leider auch nicht, hatte es auch schon mal mit ner prozedur ReadTabFile aus einem anderen board versucht (weiß nich tob ich hier den link dazu posten darf) die hat das StringGrid zwar schnell gefüllt aber dafür war alles nicht so geordnet und durcheinander

momentan schaut mein Code jetzt so aus:
Delphi-Quellcode:
  if FileExists('artikel_shop_' + StringGrid1.Cells[2,stringgrid1.row] + '.txt') then begin
    Screen.Cursor := crHourGlass;
    csv := TStringList.Create;
    csv.LoadFromFile('artikel_shop_' + StringGrid1.Cells[2,stringgrid1.row] + '.txt');
    StringGrid2.Rowcount := 0;
    ProgressBar1.max := csv.Count;

    for ccc2 := csv.Count - 1 downto 1 do begin
      AnzTokens := Explode(A, ';', csv.Strings[ccc2]);
      for i := 0 to AnzTokens -1 do begin
        ccc := ccc + 1; // Spalten-Position erhöhen
        if ccc < 2  then begin StringGrid2.Cells[ccc, ccc2] := A[i]; end; // testweise nur bei Titel und ID
        if ccc = 21 then begin ccc := -1; end; // wenn max Spalten erreicht Zähler wieder auf Spalte 0 setzen
      end;

      ccc3 := ccc3 + 1;
      ProgressBar1.Position := ccc3;
    end;

    StringGrid2.Rowcount := csv.Count;
    Screen.Cursor := crDefault;
  end;
habe da noch eine Progressbar eingebaut, da siehst man das das ganze dann zum anfang schnell geht und dann zu ende hin immer langsamer wird

hast du eventuell noch eine andere idee wie man das ganze lösen könnte ?
so wie es jetzt ist hat es nicht wirklich einen wert wenn schon ca 1800 Artikel das System für ca 1 Minute lahmlegen

marabu 30. Jul 2006 17:54

Re: Speicherstelle und StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jens,

schau dir mal meine Demo an. Da mir nicht alle Randbedingungen bekannt sind, kann es sein, dass du da und dort etwas nachbessern musst, aber eigentlich zeigt die Demo sehr schön, dass du auf Zeiten unterhalb einer Sekunde hoffen kannst.

Grüße vom marabu

Nisbo 31. Jul 2006 07:11

Re: Speicherstelle und StringGrid
 
super das ging ja fix, danke vielmals :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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-2025 by Thomas Breitkreuz