2012-02-27 10 views
5

Cuando tiene TDBGrid, selección de fila completa y muestra siempre la selección, incluso cuando no está enfocado, y quiere dibujarlo completamente por el propietario, tiene la opción de un evento obsoleto OnDrawDataCell, y un nuevo evento DrawColumnCell, elegí este último y probar este:¿Cómo hago un dibujo apropiado del propietario de Full Row Selected TDBGrid cuando TDBGrid.DefaultDrawing es falso?

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; 

y lo que me está volviendo loco es que la indicación de enfoque (el color de resalte y se centran rectángulo) no se sienten atraídos por el código DefaultDrawColumnCell, y estoy seguro de que debería estar invocando DrawCellHighlight vez de hacer el hack FillRect que estoy haciendo arriba.

Si enciendo DefaultDrawing, obtengo un conjunto de problemas técnicos (problemas con la pintura de fuentes impares) y si lo desactivo, aparece otro conjunto de fallas (sin resaltar incluso cuando gdSelected).

El código en DBGrids.pas DefaultDrawColumnCell no hace más que pintar el texto. Entonces, claramente, se supone que debes hacer más, si tomas todo el código de dibujo por ti mismo. Sin embargo, el código de dibujo destacado incorporado en Grids.pas, del que depende DBGrids.pas, no está diseñado para ser invocado desde este contexto. No puedo entender si debería invocar directamente el DrawCellHighlight (que se muestra como comentado anteriormente), y calcular los valores de Col y Row, o si debería escribir mi propia versión compleja de TCustomGrid.DrawCellHighlight que maneja todos los casos de forma manual.

Seguramente esto es tan simple, y obvio, y simplemente lo estoy pasando por alto. NO tengo que dejar DefaultDrawing desactivado, por lo que debo pintar completamente desde dentro de mi evento de dibujo de propietario, y que debo poder ejecutar cuando los servicios de tema no estén disponibles, y debo usar los servicios de tema cuando estén disponibles. Entonces, necesito invocar TCustomGrid.DrawCellHighlight directamente (y no sé cómo hacerlo), o necesito volver a implementarlo por completo.

Respuesta

4

Será mejor que invoque DrawCellHighlight debido a la compatibilidad con temas que deberá implementar usted mismo. A pesar de que el número de fila no se proporciona a OnDrawColumnCell no se ve como si estuviera aún utilizado por el código DefaultDrawColumnCell por lo que no tiene que tratar de calcular internamente:

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

Eso parece bastante razonable. –

+0

@Mike W, ¿cómo puedo cambiar el color de fondo de la fila? – Ganesh

+0

tHackGrid (mygrid) .Canvas.Brush.Color: = clRed; // No funciona !! – 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; 
Cuestiones relacionadas