2012-01-10 28 views
14

FillRect no pinta la celda completa TStringGrid en Delphi XE2. Hay un espacio de 3 píxeles en el lado izquierdo en el color predeterminado (con BiDiMode establecido en bdLeftToRight). Este problema no existe en Delphi 6 que utilicé antes.FillRect no pinta la celda completa de TStringGrid en Delphi XE2

procedure TShapeline.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
begin 
    Stringgrid1.Canvas.Brush.Color:=$00FF80FF; 
    StringGrid1.Canvas.FillRect(Rect); 
end; 

He intentado cambiar todas las propiedades (incluyendo la) y diferentes estilos de pincel, el rectángulo pintado no llena la célula completa.

Respuesta

0

Apague las 4 primeras opciones en TStringGrid:

  • goFixedVertLine
  • goFixedHorizLine
  • goVertLine
  • goHorizLine

entonces no va a pintar las líneas de la cuadrícula, y su las celdas de la cuadrícula se pintarán directamente en los bordes. Lo intenté con XE.

+2

¿Qué sucede si OP quiere las líneas de la cuadrícula? –

+0

Entonces mi respuesta probablemente no ayude, pero simplemente apagar las líneas fijas parece ayudar. –

+0

@Bruce, su solución es correcta para XE pero no para XE2. Literalmente hay código en TStringGrid.DrawCell que hace ARect.Left: = ARect.Left + 4 si DefaultDrawing es verdadero y StyleServices está habilitado. –

18

Este es el comportamiento esperado en XE2 cuando se habilitan DefaultDrawing = true y los temas (No voy a discutir sobre buenas o malas aquí - como se podría haber dado cuenta, el comportamiento es diferente para el modo RigthToLeft ...).

Una solución consiste en comprobar esta condición y disminuir Rect.Left en 4 píxeles antes de llamar al FillRect.

+1

¿No hay una manera de averiguar cuántos píxeles se disminuyen? Realmente no me gustan los valores codificados para estas situaciones. Se romperá a medida que muchos códigos se rompen al pasar de XP a Vista y los nuevos grosores de los bordes. –

+2

@Marjan - Es un '4' codificado en la fuente de VCL (TStringGrid.DrawCell). No es propiedad de un estilo, no es una constante, solo '4'. –

+2

@SertacAkyuz: ¡sí! (y gracias por la respuesta) –

3

Puede usar el StringGrid1.CellRect(ACol, ARow) que devuelve el valor real de la celda en lugar de usar el parámetro Rect.

+1

Vaya, esa es una rutina pesada dentro de un controlador de eventos OnDrawCell. – NGLN

0

Como usted mismo está dibujando la celda de la cuadrícula, simplemente apague la propiedad de la grilla DefaultDrawing, configúrelo en falso.

+1

El código que se muestra no dibuja la celda de la grilla; dibuja el * contenido * de la celda de la cuadrícula. Si desactivas DefaultDrawing, también deberás generar el texto y las líneas de la cuadrícula, que es mucho más código. Es más fácil simplemente ajustar el rect en unos pocos píxeles para ajustar el relleno agregado por el dibujo temático, como se menciona en [Respuesta de Uwe] (http://stackoverflow.com/a/8807002/62576) arriba. –

Cuestiones relacionadas