2012-02-27 8 views
5

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ć.

Odpowiedz

4

Lepiej powoływać się na DrawCellHighlight ze względu na obsługę motywów, które sam musisz zaimplementować. Mimo, że liczba wierszy nie jest przewidziany do OnDrawColumnCell to nie wygląda to nawet używany przez kod DefaultDrawColumnCell więc nie trzeba starać się go obliczyć wewnętrznie:

type 
    tHackGrid = class(tDBGrid); 

procedure TTDbGridTestForm.myGridDrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    if gdSelected in State then begin 
    tHackGrid(mygrid).DrawCellHighlight(Rect, State, Column.Index, 0); 
    end; 
    mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end; 
+1

który wygląda dość rozsądne. –

+0

@Mike W, jak mogę zmienić kolor tła wiersza? – Ganesh

+0

tHackGrid (mygrid) .Canvas.Brush.Color: = clRed; // Nie działa !! – Ganesh

0
type 
    tHackGrid = class(tDBGrid); 

procedure MyForm.MyDbGridDrawColumnCell(Sender: TObject; 
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var ImageIndex: integer; 
begin 
    if gdSelected in State 
    then tHackGrid(Sender).DrawCellHighlight(Rect, State, Column.Index, 0) 
    else tHackGrid(Sender).DrawCellBackground(Rect, Column.Color, State, Column.Index, 0); 
    TDbGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end; 
Powiązane problemy