![]() |
StringGrid leeren
Wenn ich mein StringGrid leeren möchte, verwende ich folgende Funktion:
Delphi-Quellcode:
Allerdings erhalte ich dann den Fehler, dass die "FOR-Schleifenvariable eine lokale Variable sein" muss.
for ireset := 0 to Werte.StringGrid1.RowCount do
begin Werte.StringGrid1.Rows[ireset].Clear(); end; Was mach ich falsch, bzw. was will Delphi mir damit sagen? |
Re: StringGrid leeren
machs mal so:
Delphi-Quellcode:
var ireset : integer;
begin for i := 0 to stringgrid1.rowcount do stringgrid1.cells[0,rowcount] := ''; end; |
Re: StringGrid leeren
Delphi-Quellcode:
Vllt hilft das, hab ich gerade gefunden.
//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; |
Re: StringGrid leeren
Zitat:
Falsch:
Delphi-Quellcode:
Richtig:
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;
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; |
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? |
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:
Der Aufruf erfolgt dann mit 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;
Delphi-Quellcode:
Somit kann ich es einfach aufrufen egal welches löschen möchte !
kbuch1 := form1.StringGridLeer(kbuch1); // Kbuch ist hier das Stringrid
und wie findet Ihr das ? |
Re: StringGrid leeren
die götter finden, dass da noch das objekt freigegeben oder zurückgesetzt werden sollte ...
schöne grüsse Oreaden |
Re: StringGrid leeren
Zitat:
|
Re: StringGrid leeren
Zitat:
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 |
Re: StringGrid leeren
Zitat:
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. |
Re: StringGrid leeren
Hallo,
das mit dem Speicherverbrauch stimmt leider. Erzeuge doch mal eine StringGrid mit 100 Zeilen/Spalten. Schreibe dort in jede Zeile was rein ('bla' ;) ). Dann Colcount/RowCount auf z.B. 2 setzen. Dann wieder zurück auf 100. Bei mir (D6) steht wieder 'bla' überall drin. Noch ein Tipp.
Delphi-Quellcode:
das bringt (warum auch immer) eine grosse Beschleunigung
if Cells[]<>'' then
begin Cells[]:= ''; end; bei grossen Grids. Heiko |
Re: StringGrid leeren
Das Problem ist das das Persistenzobjekt des Stringgrids sich nicht Speicher aus dem Heap hohlt sondern durch verschieben des Basispointers (oder war es der Stackpointer?)...
Das Kommentar im Quellcode sagt quasi sowas wie (Schnell aber trotzdem felxibel....) Ach ne doch nicht die benutzen StackAlloc nur für die anzeigen...also Irrtum... |
Re: StringGrid leeren
Also was stimmt wenn man das String Grid nicht löscht dann bleiben die Infos vorhanden das war der Grund warum ich die Löschroutine geschrieben habe aber
warum löscht er keine leeren Einträge ? Nach meiner Erfahrung spielen Row und col count nur ne rolle für das anzeigen sonst nichts, man kann es beliebig füllen und auslesen was ich manchmal auch absichtlich mache für Infos die der Kunde nicht sehen soll ! Ist halt Pascal ;-) aber ich muss echt mal testen ob er nach meiner leer Methode dies nicht auch leer macht. Grüße joachim |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 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