Announcement

Collapse
No announcement yet.

Zeile löschen in TStringGrid???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeile löschen in TStringGrid???

    Hallo Leute,

    kann mir jemand sagen was ich es anstellen muss, damit ich eine Zeile aus einem TStringGrid löschen kann??

    Vielen Dank für eure Vorschläge

  • #2
    Hallo,<br>
    ich habe folgendes Beispiel gefunden(www.SwissDelphiCenter.ch), es allerdings nicht getestet:
    <pre>
    procedure GridDeleteRow(RowNumber : Integer; Grid : TStringGrid);
    Var
    i : Integer;
    Begin
    Grid.Row := RowNumber;
    If (Grid.Row = Grid.RowCount -1) Then
    Begin
    {On the last row}
    Grid.RowCount := Grid.RowCount - 1;
    End
    Else
    Begin
    {Not the last row}
    For i := RowNumber To Grid.RowCount - 1 Do
    Begin
    Grid.Rows[i] := Grid.Rows[i+ 1];
    End;
    Grid.RowCount := Grid.RowCount - 1;
    End;
    End;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    GridDeleteRow(3,StringGrid1);
    end;
    </pre>Gruß Alex

    Comment


    • #3
      Hallo,<br> ich empfehle folgende Methode<br>
      <pre>
      procedure DeleteRow(yourStringGrid: TStringGrid; ARow: Integer);
      var i: Integer;
      begin
      with yourStringGrid do
      begin
      for i := ARow to RowCount-2 do
      Rows[i].Assign(Rows[i+1]);
      RowCount := RowCount - 1
      end;
      end;
      </pre>Jens Schuman

      Comment


      • #4
        Hallo Jens,<br>
        <br>
        da ein StringGrid zu Beginn aus Leerstrings besteht, würde ich die Schleife allerdings nicht bis RowCount-2, sondern bis RowCount-1 laufen lassen, um so, für die ehemals letzte Zeile, den ursprünglichen Zustand wieder herzustellen.<br>
        <br>
        Ciao<br>
        Chri

        Comment


        • #5
          Hallo Jens,<br>
          <br>
          da ein StringGrid zu Beginn aus Leerstrings besteht, würde ich die Schleife allerdings nicht bis RowCount-2, sondern bis RowCount-1 laufen lassen, um so, für die ehemals letzte Zeile, den ursprünglichen Zustand wieder herzustellen.<br>
          <br>
          Ciao<br>
          Chri

          Comment


          • #6
            Hallo Christian,<br>wg Rows[i].Assign(Rows[i+1]); darf die Schleife nur bis RowCount-2 laufen. Die Sache läuft so: Kopiere den Inhalt der nächsten Zeile in den Inhalt der aktuellen Zeile. Wenn fertig, dann lösche die letzte Zeile. Wenn die Schleife bis RowCount-1 läuft, wird versucht Row[RowCount-1] Row[RowCount] zuzuweisen. Das klappt nicht.<br>Jens Schuman

            Comment


            • #7
              Hallo Jens,<br>
              <br>
              dass versucht wird Row[RowCount-1] Row[RowCount] zuzuweisen, ist ja gerade der Witz an der Sache. Mal davon abgesehen, dass es wunderbar klappt:<br>
              Wenn das immer so gemacht wird, ist sichergestellt, dass in der ursprünglich letzten Zeile nicht die Werte stehenbleiben, die in die Row[RowCount-1] kopiert wurden, sondern die der folgenden, bislang nicht genutzten Zeile stehenden Daten, nämlich Leerstrings, in die zu löschende Zeile kopiert werden.<br>
              Ergo: Dann ist die Zeile wirklich gelöscht, denn RowCount := RowCount-1 macht ja nur die bisher letzte Zeile unsichtbar, sie ist aber nach wie vor vorhanden.<br>
              Durch das erhöhen von RowCount, kannst Du ja schliesslich die Zeilenzahl auch erhöhen (und nicht durch eine Add-Methode, wie z.B. bei einer TStringList)<br>
              Probier's aus, und lass einfach mal das RowCount := RowCount-1 weg.<br>
              <br>
              Ciao<br>
              Chri

              Comment


              • #8
                Hallo Christian,<br>
                sonderbarer hast Du recht. Bislang bin ich davon ausgegangen, das die Zählung immer bei<br>
                0 anfängt und bei Count-1 aufhört. Deshalb bin ich davon ausgegangen, dass auf<br>
                Rows[RowCount] nicht zugegriffen werden kann. Bei TStringGrid scheint das wohl<br>
                nicht der Fall zu sein.<br>
                Jens Schumann<br&gt

                Comment


                • #9
                  Hallo Jens,<br>
                  <br>
                  zu meinem Leidwesen, kann ich mir leider nicht erklären, warum dass so ist. Rows (und Cols) sind ja schliesslich TStrings. Darauf gekommen, dass es gehen müsste, bin ich dadurch, dass man Cells nicht mit Add erweitern muss, sondern einfach in die gewünschte Zelle die Daten schreiben kann. Egal ob ARow dabei grösser als RowCount-1 ist oder nicht. Ggf. wird die Anzahl der dargestellten Zeilen erhöht, ebenso wie RowCount. Das erklärt sich freundlicher Weise, wenn man sich mal die Methode SetRowCount von TCustomGrid ansieht.<br>
                  Da TStringGrid doch relativ umfangreich geraten ist (TCustomGrid, TStringGridStrings, TSparseList....) bin ich bislang noch nicht so ganz durchgestiegen wie das mit dem Zuweisen der Strings zu den Zellen so funktioniert.<br>
                  Ich wäre dankbar, wenn sich jemand finden sollte, der mal erklären kann, wie das funktioniert (ggf. auch mit Bezug auf die grids.pas).<br>
                  Zu wissen, dass es geht ist ja gut und schön, aber dass WARUM interessiert mich auch.<br>
                  <br>
                  Ciao<br>
                  Chri

                  Comment


                  • #10
                    um die fixed rows zu schützen

                    with yourStringGrid do begin

                    if RowCount = FixedRows + 1 then begin

                    Rows[FixedRows].Clear;

                    exit;

                    end;

                    for i := ARow to RowCount-1 do .....

                    es ist schon sehr merkwürdig, egal welche löschmethode man verwendet, die fixedrows würden gelöscht und beim nächsten versuch gäbe es eine fehlermeldung. da das hier für einsteiger ist: hiermit wird auch das vermieden
                    gruß, bernhard :

                    Comment

                    Working...
                    X