StringGrid - Zeilen und Spalten löschen/einfügen



  • Gibt es eine Methode um aus einer StringGrid eine Beliebige Zeile zu löschen (BCB 1.0). In meiner Hilfe steht nichts dazu.

    [ Dieser Beitrag wurde am 31.10.2002 um 22:06 Uhr von Jansen editiert. ]



  • ne methode gibts da nicht, dass musst du von hand machen...

    alle zeilen nach der zu löschende um jeweil eine zeile nach oben verschieben und die letzte zeile leeren, bzw. rowcount-- machen.



  • Es geht genauso, wie Sunday es beschrieben hat.Hier ein mögliches
    Beispiel dazu:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    { // Zeile löschen
    int Wahl;
    int Zeile, Spalte;
    
    Wahl = Application->MessageBox("Wirklich löschen?","Zeile löschen",
                                    MB_YESNO+MB_ICONQUESTION );
    if (Wahl == IDYES)
        {// Zeile soll gelöscht werden
        Zeile = StringGrid1->Row;
        while (Zeile < (StringGrid1->RowCount - 1) )
            {// für jede Zeile unterhalb der aktuellen Zeile (außer letze Zeile)
            // (Zeile+1) nach (Zeile) kopieren
            // Zelle für Zelle kopieren
            Spalte = 0;     // 1. Spalte hat die Nummer 0!!!
            while (Spalte < StringGrid1->ColCount)
                { // Innerhalb einer Zeile alle Spalten von der folgenden Zeile
                  //   einzeln kopieren
                StringGrid1->Cells[Spalte][Zeile] =
                                             StringGrid1->Cells[Spalte][Zeile+1];
                Spalte++;  // Spaltenzähler erhöhen
                }
            Zeile++;  // Zeile erhöhen
            }
        if (StringGrid1->RowCount > 2)
            StringGrid1->RowCount--;   // Zeilenzahl erniedrigen
        }// Zeile soll gelöscht werden
    }
    

    Hoffe das hilft dir ein bissel.
    Cu.......

    Edit:
    Den Code bitte zwischen die Code-Tags setzen! 😉

    [ Dieser Beitrag wurde am 03.05.2002 um 16:45 Uhr von Jansen editiert. ]



  • Läuft einwandfrei. Danke 🙂



  • @Jansen

    Sorry, bin neu hier (aber total begeistert von diesem Forum) und das war mein erster Beitrag.
    Aber danke für den Tip.Ich werde es beherzigen.

    Cu...........



  • No problemo. 🙂

    Beim Zeilenlöschen kann man übrigens dank CommaText auch auf die Manipulation der einzelnen Zellen verzichten.

    Um den Thread FAQ-würdig zu machen hier mal ein Ansatz für eine Komplettlösung, d.h Zeilen löschen und einfügen sowie Spalten löschen und einfügen.

    Edit 1:
    Es lassen sich mehrere Zeilen/Spalten auf einmal löschen/hinzufügen. Gelöscht wird von der selektierten Spalte/Zeile ausgehend nach rechts bzw. unten, eingefügt wird links vor bzw. über der selektierten Spalte/Zeile.

    Edit 2:
    Dank eines Tip von WebFritzi wird jetzt Rows->Assign statt CommaText verwendet.

    Edit 3:
    BeginUpdate/EndUpdate hinzugefügt.

    ////////////////////////////////////////////////////////////////////////////////
    // Funktion zum Löschen und Hinzufügen beliebig vieler Zeilen oder Spalten in
    // einem TStringGrid. Parameter:
    //  TStringGrid  *Grid - Zeiger auf das zu bearbeitende Grid
    //  bool Delete        - true für Löschen, false für Hinzufügen
    //  bool Cols          - true für Spalten, false für Zeilen
    //  int AdjCount       - Zahl der zu löschenden/hinzuzufügenden Spalten/Zeilen
    ////////////////////////////////////////////////////////////////////////////////
    
    void AdjustGrid(TStringGrid *Grid, bool Delete, bool Cols, int AdjCount)
    {
      if (AdjCount > 0)
      {
        Grid->Rows->BeginUpdate();
    
        if (Cols) /////////// Spalten bearbeiten ///////////////////////////////////
        {
          TStringList *list = new TStringList(); // Zwischenspeicher für Zeilen/Spalten
    
          if (Delete) //***** Spalte soll gelöscht werden ************************//
          {
            // wenn selektierte Spalte plus "Zahl zu löschender Spalten" grösser/
            // gleich Gesamtzahl der Spalten, entsprechend weniger Spalten löschen
            if (Grid->Col + AdjCount >= Grid->ColCount + 1)
              AdjCount = Grid->ColCount - Grid->Col;
    
            // wenn nur (noch) eine  Spalte, dann einfach die  Inhalte löschen
            if (Grid->ColCount <= Grid->FixedCols + 1)
              for (int y = 0; y < Grid->RowCount; y++)
                Grid->Cells[Grid->FixedCols][y] = "";
    
            else
            {
              // nicht über den Rand  links hinauslöschen
              if (AdjCount > Grid->ColCount - (Grid->FixedCols + 1))
                AdjCount = Grid->ColCount - (Grid->FixedCols + 1);
    
              // StringList mit den Einträgen der aktuellen Zeile füllen und
              // darin an der der Spalte entsprechenden Position die nötige
              // Zahl von Einträgen löschen; dann in die Zeile zurück kopieren
              for (int x = 0; x < Grid->RowCount; x++)
              {
                list->Assign(Grid->Rows[x]);
                for (int z = 0; z < AdjCount; z++)
                  list->Delete(Grid->Col);
                Grid->Rows[x]->Assign(list);
              }
              // die letzte(n) Spalte(n) entfernen
              Grid->ColCount -= AdjCount;
            }
          }
    
          else //************ Spalte soll eingefügt werden ***********************//
          {
            Grid->ColCount += AdjCount;                    // neue Spalte(n) hinzufügen;
    
            for (int x = 0; x < Grid->RowCount; x++)       // StringList mit den Ein-
            {                                              // trägen der aktuellen
              list->Assign(Grid->Rows[x]);                 // Zeile füllen und darin
              for (int z = 0; z < AdjCount; z++)           // an der der Spalte ent-
                list->Insert(Grid->Col, "");               // sprechenden Stelle die
              Grid->Rows[x]->Assign(list);                 // nötige Anzahl von leeren
            }                                              // Einträgen hinzufügen,
          }                                                // dann zurück kopieren
    
          delete list;                                     // nicht vergessen!
        }
    
        else //////////////// Zeilen bearbeiten ////////////////////////////////////
        {
          if (Delete) //***** Zeile soll gelöscht werden *************************//
          {
            // wenn selektierte Zeile plus "Zahl zu löschender Zeilen" grösser/
            // gleich Gesamtzahl der Zeilen, entsprechend weniger Zeilen löschen
            if (Grid->Row + AdjCount >= Grid->RowCount + 1)
              AdjCount = Grid->RowCount - Grid->Row;
    
            if (Grid->RowCount <= Grid->FixedRows + 1)    // wenn nur eine Zeile, dann
              Grid->Rows[Grid->FixedRows]->Clear();       // einfach den Inhalt löschen
    
            else
            {
              int Zeile = Grid->Row - 1;                  // Zeileninhalt jeweils mit
              while (Zeile++ < Grid->RowCount)            // dem der nächsten nicht zu
                Grid->Rows[Zeile] = Grid->Rows[Zeile + AdjCount];
                                                          // löschenden Zeile ersetzen;
              Grid->RowCount -= AdjCount;                 // letzte Zeile(n) löschen
            }
          }
    
          else  //*********** Zeile soll eingefügt werden ************************//
          {
            Grid->RowCount += AdjCount;                     // neue Zeile(n) anfügen
    
            int Zeile = Grid->RowCount;                     // Zeileninhalt jeweils mit
            while (Zeile-- > Grid->Row && Zeile - AdjCount > 0)//dem der entsprechenden
              Grid->Rows[Zeile] = Grid->Rows[Zeile - AdjCount];
                                                            // vorhergehenden ersetzen;
            for (int z = 0; z < AdjCount; z++)              // zum Schluss noch die
              Grid->Rows[Grid->Row + z]->Clear();           // "eingefügte(n)" Zeile(n)
          }                                                 // leeren
        }
    
        Grid->Rows->EndUpdate();
      }
    }
    

    [ Dieser Beitrag wurde am 09.07.2003 um 11:32 Uhr von Jansen editiert. ]



  • Hey, die Idee mit dem CommaText finde ich ja mal voll geil. Kann man dann auf jedes StringGrid anwenden ohne sich um die Anzahl Cols scheren zu müssen. ***top*** 🙂


Anmelden zum Antworten