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