Eine angewählte Zeile farbig hervorheben (focused row)

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