Refresh eines String Grids (OnDrawCell)



  • Hallo,

    ich möchte ein String Grid ein wenig modifizieren.
    Das soll folgendes können:

    - Elemente die nicht markiert sind haben eine bestimmte Höhe,
    sagen wir mal 10 Pixel.

    - das markierte Element ist wesentlich grösser, so ca. 50 Pixel.

    - über das markierte Element platziere ich ein Panel, welches mit
    weiteren Informationen du diesem Eintrag gefüllt wird.

    im Test sieht das bei mir so aus:
    www.gsm-dev.de/newlist.GIF

    Problem: das ganze flackert schrecklich und wenn ich mit dem Cursor nach
    unten oder oben fahre wird ab dem Anschlag die OnDrawCell Routine nicht
    mehr aufgerufen.

    hier die OnDrawCell Routine:

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
    
        // wenn das markierte Element nicht im sichtbaren Bereich ist -> ausblenden 
        if ((StringGrid1->TopRow > StringGrid1->Selection.Top)
          ||(StringGrid1->VisibleRowCount + StringGrid1->TopRow < StringGrid1->Selection.Top)
        ){
            Panel1->Visible = false;
        } else {
            Panel1->Visible = true;
        }
    
        if(ARow == StringGrid1->Selection.Top) {
            // Das markierte Element:
            if (StringGrid1->RowHeights[ARow] != 50)
            StringGrid1->RowHeights[ARow] = 50;
            Panel1->Top = Rect.Top + StringGrid1->Top + 2;
            Panel1->Left = Rect.Left + StringGrid1->Left + 2;
            Panel1->Height = Rect.Height();
            Panel1->Width = Rect.Width();
            lblUeberschrift->Caption = StringGrid1->Cells[0][ARow];
        } else {
            // ein normales (kleines) Element
            if (StringGrid1->RowHeights[ARow] != 15)
                StringGrid1->RowHeights[ARow] = 15;
        }
    }
    

    Tests zeigen, das die Routine 2-3 mal für jede Zelle aufgerufen wird. Daher
    wird das flackern kommen. Aber es muss doch eine Möglichkeit geben das zu
    verhindern oder?

    Vielen Dank schonmal!



  • Problem gelöst 🙂

    ich mach die Anpassung der Cell-Höhe nun in OnSelectCell. Das ganze ist noch
    nicht 100% perfekt (flackert nicht immer etwas) aber schon sehr viel besser.



  • Moin,

    leg das StringGrid mal auf ein Panel und setze DoubleBuffered = true. Obwohl ich nicht weiß, ob das in diesem Fall hilft.

    Ansonsten solltest Du versuchen auf das Panel zu verzichten und direkt in den Canvas zu zeichnen.


Anmelden zum Antworten