![]() |
stringGrid --> Zeilen löschen
Wie die überschrift schon sagt, genau das bekomme ich im Moment nicht hin
übwer die OH habe ich StringGrid1.Free; und StringGrid1.Destroy; gefunden aber das tut es nicht wirklich sondern verursacht nen Zugriffsfehler beim Programmstart sowie ein nichtdasein von stringgrid Wie bekomme ich es jetzt hin in einem StringGrid eine Zeile bzw alle Zeilen zu löschen ? |
Re: stringGrid --> Zeilen löschen
Delphi-Quellcode:
Stringgrid1.RowCount := 0;
|
Re: stringGrid --> Zeilen löschen
Ich hatte mal genau das gleiche Problem und habe mir aus diesem Grund diese Procedure geschrieben:
Delphi-Quellcode:
[edit] Wenn du wirklich das gesamte StrinGrid löschen möchtest, musst du das so schreiben:
Procedure StringgridDelete(Stringgrid:TStringGrid; Index:Cardinal);
var FixedRows,i:integer; begin if Index<Stringgrid.RowCount then begin FixedRows:=Stringgrid.FixedRows; if Stringgrid.RowCount=FixedRows+1 then Stringgrid.Rows[FixedRows].Clear else begin if Stringgrid.RowCount>2 then begin for i:=Index to Stringgrid.RowCount-1 do Stringgrid.Rows[i]:=Stringgrid.Rows[i+1]; Stringgrid.RowCount:=Stringgrid.RowCount-1; end; end; end; end;
Delphi-Quellcode:
[/edit]
StringGrid1.RowCount:=1;
StringGrid1.Rows[StringGrid1.RowCount-1].Clear; |
Re: stringGrid --> Zeilen löschen
ichhabe das schon mit
StringGrid1.RowCount := 2; versucht aber in der liste bleiben die alten einträge unter zeile 2 stehen |
Re: stringGrid --> Zeilen löschen
kommando zurück, ich held hatte die ganze zeit mit der falschen procedur getestet :wall:
|
Re: stringGrid --> Zeilen löschen
Was meinste denn mit der "falschen" Procedure?
|
Re: stringGrid --> Zeilen löschen
Hallo,
@gordon freeman Damit löscht du nicht die Einträge. :mrgreen: @Nogge StringGrid leeren geht nur mit einer Schleife. :gruebel: Aus der Delphi-Hilfe Zitat:
Delphi-Quellcode:
Eventuell bei fixen Zeilen/Spalten den Code anpassen, oder diese nach dem Löschvorgang neu beschriften.
for z := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Rows[z].Clear(); |
Re: stringGrid --> Zeilen löschen
Der "freie Mann" hatte auch unrecht, da man RowCount gar nicht auf 0 setzen kann. Aber ich habe das Wort "löschen" so verstanden, dass es für das Auge entfernt werden sollte. Somit wäre es dann ja egal, ob die Einträge noch vorhanden sind oder nicht.
|
Re: stringGrid --> Zeilen löschen
@ Nogge
nach statt bei button1click hatte ich das im oncreate drinn :D kein wunder das ich so immer auf den button klicken konnte und sich da nix gerührt hat |
Re: stringGrid --> Zeilen löschen
Also ich hab genau dasselbe Problem.
Kann man denn bei nem StringGrid keine einzelne Zeile rauslöschen, ohne jeden Eintrag, der sich darunter befindet, nach oben zu schieben? |
Re: stringGrid --> Zeilen löschen
Was genau willst du denn?
Ich sehe darin kein Problem, sondern eher die Lösung. Wohin soll der Inhalt der unteren Rows denn sonst verschoben werden? |
Re: stringGrid --> Zeilen löschen
Ich mein ja nur...
Das ganze Stringgris basiert ja auf den StrinLists. Und da wäre es net schlecht, wenn man da einfach zb. mit delete eine Zeile rauslöschen könnte. (Was ja bei Stringlists möglich ist.) Denn wenn man eine stringgrid mit 1.000.001 einträgen hat und den oberen rauslöschen will, muss man 1.000.000 einträge verschieben. Ich hatte nur auf eine effizientere lösung gehofft. Aber seis drum. Diese lösung tuts auch und da ich nicht mit 1.000.000 einträgen arbeite, merke ich auch keinen zeitunterschied ... |
Re: stringGrid --> Zeilen löschen
Hallo,
die Klasse TStringGrid besitzt eine Proected-Methode DeleteRow, die man über einen "Class-Cracker" erreichen kann:
Delphi-Quellcode:
Gruß Hawkeye
type
TGridCracker = class (TStringGrid) procedure TForm1.DeleteRow (aIndex: Integer); begin TGridCracker(Grid1).DeleteRow (aIndex); end; |
Re: stringGrid --> Zeilen löschen
Hallo Hawkeye,
ich fürchte DeleteRow() kann die row-order nicht beibehalten. Freundliche Grüße vom marabu Nachtrag: Meine Befürchtung ist unbegründet - ich habe die Parameter von MoveRow() vertauscht... |
Re: stringGrid --> Zeilen löschen
Zitat:
Delphi-Quellcode:
Das einzige, was Du ändern könntest, ist der Name und der Zugriff auf die Prozedur. Erstell Dir doch 'ne eigene Klasse, in der Du anstelle der globalen Prozedur (s.o.) eine Klassenprozedur deklarierst:
// TStringList
if Index < FCount then System.Move(FList^[Index + 1], FList^[Index], (FCount - Index) * SizeOf(TStringItem)) // TList if Index < FCount then System.Move(FList^[Index + 1], FList^[Index], (FCount - Index) * SizeOf(Pointer));
Delphi-Quellcode:
So kannst Du dann natürlich nicht mehr das VCL-Objekt benutzen.
type
TMyStringGrid = class(TStringGrid) public procedure Delete(Index: Integer); end; [...] procedure TMyStringGrid.Delete(Index: Integer); var FixedRows, i: integer; begin if (Index < self.RowCount) then begin FixedRows := self.FixedRows; if (self.RowCount = FixedRows+1) then self.Rows[FixedRows].Clear else begin if (self.RowCount > FixedRows+1) then begin for i := Index to self.RowCount-2 do self.Rows[i] := self.Rows[i+1]; self.Rows[self.RowCount-1].Clear; self.RowCount := self.RowCount-1; end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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