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