Gdy masz TDBGrid, pełny wybór wierszy i zawsze pokazuje zaznaczenie, nawet gdy nie jest on skupiony, i chcesz go w pełni narysować, możesz wybrać zdarzenie wycofane OnDrawDataCell
, i nowe wydarzenie DrawColumnCell
, wybrałem ten ostatni i spróbuj tego:Jak zrobić prawidłowy właściciel-wyciąg z zaznaczonego wiersza pełnego wiersza TDBGrid, gdy TDBGrid.DefaultDrawing ma wartość false?
procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
a co doprowadza mnie do szaleństwa jest to, że wskazanie ostrości (kolor podświetlenia i skupić prostokąt) nie są rysowane przez kod DefaultDrawColumnCell, i jestem pewien, że należy powołując DrawCellHighlight zamiast robienia haka FillRect, który robię powyżej.
Po włączeniu funkcji DefaultDrawing otrzymuję jeden zestaw usterki (problemy z czcionką nieparzystą), a po wyłączeniu otrzymuję kolejny zestaw usterki (brak podświetlenia, nawet gdy wybrano opcję gdSelected).
Kod w DBGrids.pas DefaultDrawColumnCell
nie robi nic poza pomalowaniem tekstu. Jasne, powinieneś zrobić więcej, jeśli sam przejmiesz cały kod rysunku. Jednak kod rysowania wyróżniający wbudowany w Grids.pas, od którego zależy DBGrids.pas, nie został zaprojektowany do wywołania z tego kontekstu. Nie mogę się dowiedzieć, czy powinienem wywoływać bezpośrednio (pokazany powyżej komentarz), i wymyślić wartości Col i Row, czy też powinienem napisać własną złożoną wersję TCustomGrid.DrawCellHighlight, która obsługuje wszystkie różne sprawy ręcznie.
Z pewnością jest to takie proste i oczywiste, a ja po prostu nie mogę tego przegapić. NOte, że muszę opuścić DefaultDrawing, a więc muszę całkowicie pomalować z mojego zdarzenia losowania właściciela, i muszę być w stanie uruchomić, gdy usługi tematyczne nie są dostępne, i muszę korzystać z usług tematycznych, gdy są one dostępne. Muszę więc bezpośrednio wywołać TCustomGrid.DrawCellHighlight (i nie wiem, jak to zrobić) lub potrzebuję go całkowicie zaimplementować.
który wygląda dość rozsądne. –
@Mike W, jak mogę zmienić kolor tła wiersza? – Ganesh
tHackGrid (mygrid) .Canvas.Brush.Color: = clRed; // Nie działa !! – Ganesh