StringGrid DrawCell Problem
-
Mit folgendem Quellcode möchte ich erreichen, dass die Zellen 1-3 des Stringgrids Gelb hinterlegt werden.
void __fastcall TfrmTPParams::sgSPParamListDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (ACol == 3) SetColWidth(); if (State.Contains(gdFocused)) { AnsiString sZellTextCol1=sgSPParamList->Cells[1][ARow]; AnsiString sZellTextCol2=sgSPParamList->Cells[2][ARow]; AnsiString sZellTextCol3=sgSPParamList->Cells[3][ARow]; TRect Rect1 = sgSPParamList->CellRect(1, ARow); TRect Rect2 = sgSPParamList->CellRect(2, ARow); TRect Rect3 = sgSPParamList->CellRect(3, ARow); sgSPParamList->Canvas->Brush->Color = clYellow; //gelbe Zelle sgSPParamList->Canvas->Font->Color = clBlack; //schwarze Schrift Rect1.Right = Rect3.Right; //Rechteck über Zelle 1 - 3 sgSPParamList->Canvas->FillRect(Rect1); /* sgSPParamList->Canvas->FillRect(Rect2); sgSPParamList->Canvas->FillRect(Rect3); */ sgSPParamList->Canvas->TextOut(Rect1.Left+2, Rect1.Top+2, sZellTextCol1); sgSPParamList->Canvas->TextOut(Rect2.Left+2, Rect2.Top+2, sZellTextCol2); sgSPParamList->Canvas->TextOut(Rect3.Left+2, Rect3.Top+2, sZellTextCol3); } }
Leider funktioniert das aber nicht, es wird immer nur die Focusierte Zelle gemalt. Weis jemand, wie man trotzdem alle 3 Zellen gelb bekommt?
-
Hallo
schau dir das mal an (und du wirst den Fehler sofort sehen)
if (State.Contains(gdFocused))
MfG
Klaus
-
was machst du denn für nen wust?!
DrawCell wird doch für jede Zelle einzeln aufgerufen, da brauchste doch nicht
immer alle auf einmal zu verarzten, kein wunder wenn das nicht klappt.ps. gibt auch sowas für goRowSelect. damit ist auch der focus um die ganze zeile
[ Dieser Beitrag wurde am 28.02.2003 um 13:46 Uhr von Sunday editiert. ]
-
Ist mir prinzipiell schon klar. Aber wenn die Focusierte Zelle erreicht wird (nach dem Klick) soll die und die Zellen daneben auch gelb gemalt werden ... sogesehen müßte das doch gehen.
wenn goRowSelect = true, dann kann mal die Zellinhalte nicht mehr editieren (siehe Hilfe:
goRowSelect Es werden gesamte Zeilen ausgewählt und keine einzelnen Zellen. Ist goRowSelect in Options enthalten, hat goAlwaysShowEditor keine Auswirkung.
)Wie kann ich es da effizienter programmieren?
-
Pseudocode:
if (ARow == SelectedCell.RowNumber && ACol < 3) MaleDieZelle(gelb); else MaleDieZelle(weiss);
-
So gehts jetzt:
void __fastcall TfrmTPParams::sgSPParamListDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (ACol == 3) SetColWidth(); TStringGrid *Grid=(TStringGrid*)Sender; AnsiString sZellInhalt=Grid->Cells[ACol][ARow]; if ((ACol == 0) || (ARow == 0)) Grid->Canvas->Brush->Color = clBtnFace; else Grid->Canvas->Brush->Color = (FocusedRow == ARow) ? clYellow : clWhite; if (State.Contains(gdFocused)) Grid->Canvas->DrawFocusRect(Rect); else Grid->Canvas->FillRect(Rect); if (!sZellInhalt.IsEmpty()) { if ((ACol == 0) || (ARow == 0)) Grid->Canvas->Font->Style = TFontStyles()<< fsBold; int CenterX = Rect.Right - Rect.Left; int CenterY = Rect.Bottom - Rect.Top; int TextH = Grid->Canvas->TextHeight(sZellInhalt); int TextW = Grid->Canvas->TextWidth(sZellInhalt); CenterX -= TextW; if (CenterX < 0) CenterX = 0; else CenterX /= 2; CenterX += Rect.Left; CenterY -= TextH; if (CenterY < 0) CenterY = 0; else CenterY /= 2; CenterY += Rect.Top; Grid->Canvas->TextRect(Rect, CenterX, CenterY, sZellInhalt); } } void __fastcall TfrmTPParams::sgSPParamListSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { if (CanSelect) { FocusedRow=ARow; sgSPParamList->Repaint(); } }
-
Wie wär's damit (DefaultDrawing auf true)?
void __fastcall TForm1::GridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { if (ACol >= Grid->FixedCols && ARow >= Grid->FixedRows) Grid->Canvas->Brush->Color = (FocusedRow == ARow) ? clYellow : clWhite; else Grid->Canvas->Font->Style = TFontStyles() << fsBold; Grid->Canvas->FillRect(Rect); DrawText(Grid->Canvas->Handle, Grid->Cells[ACol][ARow].c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); }
-
Danke für die kurze und schmerzlose Version.