Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Leere Zeilen löschen


ConditionZero - Mi 13.09.06 21:20
Titel: Leere Zeilen löschen
hi

kann mir vielleicht jmd. weiterhelfen, also ist recht dringend muss des teil donnerstag abend abgeben. Ich will leere Zeilen aus einem StringGrid löschen, aber erst wenn das Formular sichtbar wird. Eig. wollte ich es erst einfach eine abfrage mit if machen aber die Anzahl der beschriebenen Zellen variiert immer. Hab aber keine Ahnung wie das gehen soll habs jetzt mal so ausprobiert des geht aber nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TPopUp.FormShow(Sender: TObject);
var
i,x,y:Integer;
begin
x:=1;
y:=MSGPlaner.TabelleGrid.RowCount;
i:=1;
while x<=y do
  begin
  i:=i+1;
  x:=x+1;
  while TabelleGrid1.Rows[i].Text = (''do
    begin
    TabelleGrid1.Rows[i].Delete(i);
    end;
  end;
end;



Danke im vorraus schonmal.
Lg Marc

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


mkinzler - Mi 13.09.06 22:22

Ich würde die Schleife vom Ende zum Anfang machen und die Inhalte vor dem Vergleich noch Trimmen.


ConditionZero - Mi 13.09.06 22:43

ok, danke aber was heißt trimmen? :D weil ich versteh darunter "klein machen"


mkinzler - Mi 13.09.06 22:45

Der Befehl Trim() entfernt Leerzeichen am Anfang und Ende eines Strings so daß aus ' ' oder ' ' '' wird.


ConditionZero - Mi 13.09.06 23:08

achso ok. also jz kommt aba ein fehler wenn ich auf den Button drück: "Im Projekt Projekt1.exe ist eine Exception der Klasse EInvalidGridOperation aufgetreten. Meldung: 'Es können keine Zeilen des Tabellengitters gelöscht oder eingefügt werden'. also des ist wenn so mach:


Delphi-Quelltext
1:
while Trim(TabelleGrid1.Rows[i].Text) = Trim(''do                    


un wenn ich so mach passiert alles wie davor:


Delphi-Quelltext
1:
while TabelleGrid1.Rows[i].Text = Trim(''do                    


mkinzler - Mi 13.09.06 23:15

Wie gesagt von hinten, sonst gibts Probleme wenn du etwas löschst. Du kannst ja auch ne For-downto-Schleife nehmen.


ConditionZero - Mi 13.09.06 23:31

hä? wie von hinten sorry ich steh grad voll aufm schlauch >.<


JayEff - Mi 13.09.06 23:51


Delphi-Quelltext
1:
2:
3:
for i:=TabelleGrid1.Rows.Count-1 downto 0 do
  if Trim(TabelleGrid1.Rows[i].Text)='' then
    TabelleGrid1.Rows.Delete(i);

Ungetestet, aber das Prinzip dürfte stimmen.


ConditionZero - Do 14.09.06 00:05

hm funktioniert leider nicht, kommt immer noch der gleiche fehler :-(


JayEff - Do 14.09.06 00:07

user profile iconConditionZero hat folgendes geschrieben:
'Es können keine Zeilen des Tabellengitters gelöscht oder eingefügt werden'

Hmm.. warum gibts überhaupt die Methode Delete, wenn man sie nicht aufrufen darf? :shock:
Musst wohl drumrum denken und einen Trick anwenden: Statt dem Löschen, überträgst du die nicht leeren Zeilen in eine NEUE Liste und löschst die alte komplett. Dann schreibst du die Werte der Neuen in die Alte.


Christian S. - Do 14.09.06 00:19

So sollte es das tun:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure DeleteRow(aGrid : TStringGrid; index : Integer);
var
  i_row, i_col : Integer;
begin
  for i_row := index to aGrid.RowCount - 2 do
    for i_col := 0 to aGrid.ColCount - 1 do
      aGrid.Cells[i_col, i_row] := aGrid.Cells[i_col, i_row+1];

  aGrid.RowCount := aGrid.RowCount-1;
end;

function IsEmptyRow(aGrid : TStringGrid; index : Integer) : Boolean;
begin
  result := Trim(aGrid.Rows[index].Text) = '';
end;

procedure DeleteEmptyRows(aGrid : TStringGrid);
var
  i: Integer;
begin
  for i := aGrid.RowCount-1 downto 0 do
    if IsEmptyRow(aGrid, i) then
      DeleteRow(aGrid, i);
end;


Aufruf sollte klar sein, mit "DeleteEmptyRows(DeinStringGrid)"


ConditionZero - Do 14.09.06 00:25

will auch nicht auf die weiße klappen kommt mal keine fehlermeldung, aber die leeren zeilen sind immer noch da


Edit: ok sry hab grad en fehler von meiner seite gemacht, funktioniert alles bestens dankeschön jetzt kann ich ja beruhigt schlafen gehn un des teil morgen schön cool meiner lehrerin geben :D


Christian S. - Do 14.09.06 00:32

Ich hab den Quellcode bei mir probiert, funktioniert bei mir prima :gruebel:

Ich habe auch gerade nochmal ein leeres Projekt erstellt, StringGrid drauf gepackt, Source von hier reinkopiert :arrow: funktioniert. Lediglich in der Optionen des StringGrid noch "goEdition" auf true, damit ich da was eintragen kann.

Vielleicht ersetz mal "IsEmptyRow" durch das hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function IsEmptyRow(aGrid : TStringGrid; index : Integer) : Boolean;
var
  i_col : Integer;
begin
  for i_col := 0 to aGrid.ColCount - 1 do
    if Trim(aGrid.Cells[i_col, index]) <> '' then
    begin
      result := False;
      exit;
    end;

  result := true;
end;


Das ist zwar nicht schön, sollte aber gehen :zwinker:


//edit: Na, dann bin ich ja froh :-)