Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringGrid leeren (https://www.delphipraxis.net/131558-stringgrid-leeren.html)

rajuneon 26. Mär 2009 15:21


StringGrid leeren
 
Wenn ich mein StringGrid leeren möchte, verwende ich folgende Funktion:

Delphi-Quellcode:
for ireset := 0 to Werte.StringGrid1.RowCount do
    begin
      Werte.StringGrid1.Rows[ireset].Clear();
    end;
Allerdings erhalte ich dann den Fehler, dass die "FOR-Schleifenvariable eine lokale Variable sein" muss.
Was mach ich falsch, bzw. was will Delphi mir damit sagen?

SimStar001 26. Mär 2009 15:34

Re: StringGrid leeren
 
machs mal so:

Delphi-Quellcode:
var ireset : integer;
begin
  for i := 0 to stringgrid1.rowcount do
    stringgrid1.cells[0,rowcount] := '';
end;

BullsEye 26. Mär 2009 15:35

Re: StringGrid leeren
 
Delphi-Quellcode:
//alle Zellen leeren und auf eine Leerzeile beschränken
  for i := Pred(StringGrid1.RowCount) downto StringGrid1.FixedRows do
    StringGrid1.Rows[i].Clear;
  StringGrid1.RowCount := StringGrid1.FixedRows + 1;
Vllt hilft das, hab ich gerade gefunden.

Udo 26. Mär 2009 16:28

Re: StringGrid leeren
 
Zitat:

FOR-Schleifenvariable muss eine lokale Variable sein
Was ist denn daran unverständlich?

Falsch:
Delphi-Quellcode:
var
  Werte: TWerte;
  ireset: integer;

implementation
{$R *.dfm}

procedure TWerte.Button1Click(Sender: TObject);
begin
  for ireset := 0 to Werte.StringGrid1.RowCount do
    begin
      Werte.StringGrid1.Rows[ireset].Clear;
    end;
end;
Richtig:
Delphi-Quellcode:
var
  Werte: TWerte;

implementation
{$R *.dfm}

procedure TWerte.Button1Click(Sender: TObject);
var ireset: integer; //!!!!!!!!!!!!!!!!!
begin
  for ireset := 0 to Werte.StringGrid1.RowCount do
    begin
      Werte.StringGrid1.Rows[ireset].Clear;
    end;
end;

Satty67 26. Mär 2009 16:52

Re: StringGrid leeren
 
Also ich würde ja die Spalten löschen, also Cols[i].Clear. Denn in den meisten Fällen gibt das weniger Schleifendurchläufe.

Was mich aber brennend interessiert:

Es werden zwar die Inhalte gelöscht, aber der einmal reservierte Speicher bleibt weiterhin belegt (bis das StringGrid destroyed wird). Da die Spalten wohl einfach String-Listen sind, wundert mich das verhalten, denn TStringList gibt bei Clear auch den Speicher wieder frei.

Gibt es eine Möglichkeit, das StringGrid (ohne .Free) dazu zu bewegen, den nicht mehr benötigten Speicher frei zu geben?

joehd 25. Jun 2009 17:09

Re: StringGrid leeren
 
Also ich habe mir ein Funktion geschrieben die egal welches Stringrid löscht und nur die Fixen col und row unbearbeitet bleiben

Delphi-Quellcode:

function TForm1.StringGridLeer(genstrgrid:Tstringgrid):tstringgrid;
var
  i,j :integer;

begin
   for i := genstrgrid.FixedCols to genstrgrid.ColCount - 1 do
     begin
       for j := genstrgrid.FixedRows to genstrgrid.RowCount - 1 do
         begin
           genstrgrid.Cells[i,j] := '';
         end;
     end;
     genstrgrid.rowCount := genstrgrid.Fixedrows + 2;
     result := genstrgrid; // wieder zurückgeben
end;
Der Aufruf erfolgt dann mit

Delphi-Quellcode:
    kbuch1 := form1.StringGridLeer(kbuch1);   // Kbuch ist hier das Stringrid
Somit kann ich es einfach aufrufen egal welches löschen möchte !

und wie findet Ihr das ?

Oreaden 26. Jun 2009 22:46

Re: StringGrid leeren
 
die götter finden, dass da noch das objekt freigegeben oder zurückgesetzt werden sollte ...

schöne grüsse
Oreaden

alzaimar 26. Jun 2009 23:30

Re: StringGrid leeren
 
Zitat:

Zitat von Satty67
Es werden zwar die Inhalte gelöscht, aber der einmal reservierte Speicher bleibt weiterhin belegt (bis das StringGrid destroyed wird).

:gruebel: Wie kommst Du darauf?

joehd 28. Jun 2009 22:58

Re: StringGrid leeren
 
Zitat:

Zitat von Oreaden
die götter finden, dass da noch das objekt freigegeben oder zurückgesetzt werden sollte ...

schöne grüsse
Oreaden

:gruebel: Warum soll ich es freigeben ? Ich denke eine Speicherbereinigung führt Delphi selbst durch und ich mache doch kein neues Objekt auf ich verweise doch drauf oder ?
Wobei komisch ist natürlich das ich dem Objekt original das bearbeitete zuweisen kann .... :gruebel:

Denkst du oder bist du sicher, das in der Funktion ein neues Objekt erzeugt wird aber warum benötige ich dann keinen Konstruktor ? :roll:


Grüße
Joachim

Satty67 29. Jun 2009 06:23

Re: StringGrid leeren
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von Satty67
Es werden zwar die Inhalte gelöscht, aber der einmal reservierte Speicher bleibt weiterhin belegt (bis das StringGrid destroyed wird).

:gruebel: Wie kommst Du darauf?

Ich quote mich mal mit, damit der Zusamenhang da ist.

Also ist ja schon 3 Monate her, aber denke das ich den Speicherbedarf der Anwendung per Taskmanager überwacht hatte. Es ging wohl um ein großes StringGrid mit über 100 MByte Speicherbedarf (Demo von TSimpleTable).

Trotz Clearance und runtersetzen von RowCount blieb der Speicher (laut Taskmanager belegt). Ob das eine zuverlssige Information war, bin ich mir inzw. nicht mehr sicher. Aber das Grid wird ja jetzt in einer Art Paging-Mode va DrawCell angezeigt (also nahezu kein Speicherbedarf), weshalb ich das nicht weiter verfolgt hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
Seite 1 von 2  1 2      

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