Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Inhalt von Stringrid auf einmal löschen (https://www.delphipraxis.net/68828-inhalt-von-stringrid-auf-einmal-loeschen.html)

tom_po 6. Mai 2006 07:24


Inhalt von Stringrid auf einmal löschen
 
ich möchte mit einem Button den Inhalt aller Zeilen und Spalten auf einmal löschen, habe gesucht, aber noch nichts gefunden.
Ich kann zwar die gesamte Zeile eines Grid löschen, das will ich aber nicht.
Danke für Eure Hilfe.

Sharky 6. Mai 2006 07:39

Re: Inhalt von Stringrid auf einmal löschen
 
Hai tom_po,

meinst Du so etwas?:
Delphi-Quellcode:
procedure ClearStringGrid (sg : TStringGrid);
var
  ndx: Integer;
begin
  with sg do
  begin
    for ndx := FixedRows to Pred(RowCount) do
    begin
      Rows[ndx].Clear;
    end;
  end;
end;

procedure TDemoForm.btn_ClearClick(Sender: TObject);
begin
  ClearStringGrid(StringGrid1);
end;

tom_po 6. Mai 2006 08:38

Re: Inhalt von Stringrid auf einmal löschen
 
Zunächst danke Sharky für deine hilfe

Hab's probiert, bekomme aber dann diesen Kompilierfehler:

"[Fehler] loteunit.pas(41): Ungenügende Forward- oder External-Deklaration: 'Tlote.ClearStringGrid'"

weisst du woran es liegt?

fkerber 6. Mai 2006 08:41

Re: Inhalt von Stringrid auf einmal löschen
 
Hi!

Du hast sicherlich versucht, die Prozedur oben bei den Prozeduren der Klasse Tlote einzutragen.
Wenn du das tust (warum auch immer), dann müsstest die erste Zeile der eigentlichen Prozedur lauten:

Delphi-Quellcode:
procedure Tlote.ClearStringGrid (sg : TStringGrid);
Nur dann ist sie auch wirklich "Bestandteil" der Klasse.


Ciao Frederic

Sharky 6. Mai 2006 08:45

Re: Inhalt von Stringrid auf einmal löschen
 
Zitat:

Zitat von fkerber
Hi!

Du hast sicherlich versucht, die Prozedur oben bei den Prozeduren der Klasse Tlote einzutragen....

Eher umgedreht.

Ich glaube tom_po hat die Procedure so im Code stehen:
Delphi-Quellcode:
procedure Tlote.ClearStringGrid (sg : TStringGrid);
Aber sie nicht im Type-Abschnitt der Klasse eingetragen.
Delphi-Quellcode:
Type = class(TForm)
   .
   .
   .
  private
    { Private-Deklarationen }
     procedure ClearStringGrid (sg : TStringGrid);[/
  public
    { Public-Deklarationen }
  end;
Wobei das eigentlich nicht notwendig ist. Es reicht wenn die Procedure von mir im Quellcode vor dem ersten Aufruf steht.
Sie muss keine Methode der Klasse sein.

fkerber 6. Mai 2006 08:49

Re: Inhalt von Stringrid auf einmal löschen
 
Hi!

nein, dann käme:
Zitat:

[Error] Unit1.pas(26): Undeclared identifier: 'ClearStringGrid'
Trägt er sie hingegen oben ein und schreibt sie unten ohne Tlote. dann kommt der beschriebene Fehler.


Ciao Frederic

tom_po 6. Mai 2006 08:56

Re: Inhalt von Stringrid auf einmal löschen
 
ich hatte wirklich das tlote bei der procedure vergessen, sorry.
bekomme jetzt aber diesen fehler:
[Fehler] loteunit.pas(473): Nicht genügend wirkliche Parameter

fkerber 6. Mai 2006 09:04

Re: Inhalt von Stringrid auf einmal löschen
 
Hi!

Wie genau rufst du die Prozedur denn auf? Und was steht in Zeile 473?


Ciao Frederic

tom_po 6. Mai 2006 09:23

Re: Inhalt von Stringrid auf einmal löschen
 
dir procedure rufe ich über button2 auf:

Delphi-Quellcode:
procedure Tlote.Button2Click(Sender: TObject);
begin
 clearstringgrid;
end;
in der zeile 473 steht das
Delphi-Quellcode:
clearstringgrid;
über der aufruf mit dem button steht meine procedure:

Delphi-Quellcode:
procedure tLote.ClearStringGrid (sg : TStringGrid);
var
  ndx: Integer;
begin
  with sg do
  begin
    for ndx := FixedRows to Pred(RowCount) do
    begin
      Rows[ndx].Clear;
    end;
  end;
end;
fehlermeldung:
[Fehler] loteunit.pas(473): Nicht genügend wirkliche Parameter

Die Muhkuh 6. Mai 2006 09:25

Re: Inhalt von Stringrid auf einmal löschen
 
Hi,

du musst als Parameter dein Stringgrid mitgeben:

Delphi-Quellcode:
ClearStringGrid(NameDeinesStringGrids);

tom_po 6. Mai 2006 09:29

Re: Inhalt von Stringrid auf einmal löschen
 
super, spider, vielen dank, das war's
klappt super

hatte zwischenzeitlich noch einen anderen vorschlag zum löschen bekommen:

Delphi-Quellcode:
procedure tlote.ClearGrid(var Grid: TStringGrid);
var
  i: integer;
begin
  for i := 0 to Grid.RowCount - 1 do
    Grid.Rows[i].Clear;
end;
was hälst du davon?

tom_po 6. Mai 2006 10:02

Re: Inhalt von Stringrid auf einmal löschen
 
habe doch noch ein Problem:

ich habe ja in der ersten Zeile des Stringrids Menu-Name eingetragen, die ich nicht löschen will,
habe aber auch in der ersten Spalte eine fortlaufende Nummer eingetragen, die ich auch nicht löschen will, wie mache ich das?

Klaus01 6. Mai 2006 10:09

Re: Inhalt von Stringrid auf einmal löschen
 
Delphi-Quellcode:
procedure tLote.ClearStringGrid (sg : TStringGrid);
var
  r_ndx,c_ndx: Integer;
begin
  with sg do
  begin
    for r_ndx := FixedRows +1 to Pred(RowCount) do
       for c_ndx := FixedColls +1 to Pred(CollCount) do
         cells[c_ndx,r_ndx] := '';
  end;
end;
sollte ungefähr so gehen, nicht getestet.

Grüße
Klaus

Hawkeye219 6. Mai 2006 10:13

Re: Inhalt von Stringrid auf einmal löschen
 
Die einfachste Lösung besteht darin, mit zwei Schleifen jede Zelle einzeln zu löschen:

Delphi-Quellcode:
with Grid do
  for ndy := FixedRows to RowCount - 1 do
    for ndx := FixedCols to ColCount - 1 do
      Cells[ndx, ndy] := '';
Gruß Hawkeye

//Edit @Klaus01: sehe gerade, daß du deinen Beitrag korrigiert hast. Es heißt trotzdem "Cols" und das Cells-Array ist nullbasiert :wink:

tom_po 6. Mai 2006 10:31

Re: Inhalt von Stringrid auf einmal löschen
 
super jetzt habe ich es so wie ich es wollte:

Delphi-Quellcode:
procedure tLote.ClearStringGrid (sg : TStringGrid);
var
  ndx,ndy: Integer;
begin
  with sg do
  for ndy := FixedRows to RowCount - 1 do
    for ndx := FixedCols to ColCount - 1 do
      Cells[ndx, ndy] := '';
end;

Hawkeye219, kannst du noch kurz mir deine meinung über diese alternative sagen, bitte:

Delphi-Quellcode:
procedure tlote.ClearGrid(var Grid: TStringGrid);
var
  i: integer;
begin
  for i := 1 to Grid.RowCount - 1 do
    Grid.Rows[i].Clear;
    grid.Cols[i].Clear;
end;

Hawkeye219 6. Mai 2006 10:45

Re: Inhalt von Stringrid auf einmal löschen
 
Die Alternative dürfte nicht funktionieren, sie enthält mehrere Fehler:
  • Die Schleife durchläuft alle Zeilen des Grids und löscht diese komplett - also inklusive der festen Zellen (FixedCols).
  • Nach der Schleife erfolgt ein Zugriff auf das Spalten-Array mit dem undefinierten Wert der Schleifenvariablen i. Um die Spalten zu löschen, wäre hier eine weitere Schleife über alle Spalten notwendig.
  • Die Clear-Methoden löschen komplette Zeilen bzw. Spalten. Der Inhalt der festen Zellen (FixedRows, FixedCols) wird ebenfalls gelöscht. Somit wird dieses Lösung in keinem Fall zum Ziel führen.
Gruß Hawkeye

Die Muhkuh 6. Mai 2006 12:40

Re: Inhalt von Stringrid auf einmal löschen
 
[edit] Sorry, ich hab nicht gesehen, dass es eine zweite Seite gibt :oops: [/edit]

tom_po 7. Mai 2006 02:36

Re: Inhalt von Stringrid auf einmal löschen
 
Danke für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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