StringGrid Spalten hinzufügen/löschen

  • Mehrere Zeilen/Spalten in einem StringGrid 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
// Grid - Zeiger auf das zu bearbeitende Grid
// bool Delete - true = Löschen, false = Hinzufügen
// bool Cols - true = Spalten, false = Zeilen
// int AdjCount - Zahl der zu löschenden/hinzuzufügenden Spalten/Zeilen

void AdjustGrid(TStringGrid *Grid, bool Delete, bool Cols, int AdjCount)
{
    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;

            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;
    }
    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
        }
    }
}