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.GIFProblem: 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.