- Normalerweise kann einfach im Objektinspektor unter Options->goRowSelect festgelegt werden, ob die ganze akt. gewählte Zeile in einem StringGrid markiert werden soll. Das Problem dabei ist, dass der User später nicht mehr in den einzelnen Zellen herumeditieren kann. Folgender Code umgeht dieses Problem:
- *.h
private: // Anwender-Deklarationen
int FocusedRow; //akt. gewählte Zeile (Row) abspeichern
void __fastcall SetColWidth(TStringGrid *Grid); // Funktion zum Setzen der Spaltenbreite
*.cpp
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *Grid = (TStringGrid*)Sender;
// Hilfsfunktion zum Einstellen der optimalen Breite der letzten Spalte
if (ACol == Grid->ColCount - 1) SetColWidth(Grid);
if (!Grid->Enabled) return;
// wenn die Funktion innerhalb des editierbaren Zellbereiches ist,
if (ACol ->= Grid->FixedCols && ARow ->= Grid->FixedRows)
{
// wenn die akt. gewählte Zeile erreicht wurde
if (FocusedRow == ARow)
{
// blauer Markierungsbalken mit weißer Schrift
Grid->Canvas->Brush->Color = clHotLight;
Grid->Canvas->Font->Color = clWhite;
}
else
{
// sonst nur weißer Hintergrund mit schwarzer Schrift
Grid->Canvas->Brush->Color = clWhite;
Grid->Canvas->Font->Color = clBlack;
}
}
else
{
// wenn nicht innerhalb des Editorbereiches, dann Titelleiste oder 1. Spalte fett malen
Grid->Canvas->Font->Style = TFontStyles() << fsBold;
Grid->Canvas->Font->Color = clBlack;
}
Grid->Canvas->FillRect(Rect); // Hintergrund malen
// Text horizontal und vertikal zentriert in der Zelle ausgeben
DrawText(Grid->Canvas->Handle, Grid->Cells[ACol][ARow].c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
}
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect)
{
TStringGrid *Grid = (TStringGrid*)Sender;
if (CanSelect)
{
// Sobald eine Zelle angewählt wurde, die akt. Zeile speichern
FocusedRow = ARow;
Grid->Repaint(); // neu malen ist wichtig!
}
}
void __fastcall TForm1::SetColWidth(TStringGrid *Grid)
{
int iCol;
int iColWidthsSum = 0;
for (iCol = 0; iCol < Grid->ColCount-1; iCol++)
{
iColWidthsSum += Grid->ColWidths[iCol] + Grid->GridLineWidth;
}
if (iColWidthsSum < Grid->ClientWidth)
{
Grid->ColWidths[Grid->ColCount-1] = Grid->ClientWidth - iColWidthsSum - 1;
}
}