2012-01-10 16 views
14

FillRect non dipinge la cella TStringGrid completa in Delphi XE2. C'è una distanza di 3 pixel sul lato sinistro nel colore predefinito (con BiDiMode impostato su bdLeftToRight). Questo problema non esiste in Delphi 6 che ho usato prima.FillRect non dipinge la cella TStringGrid completa in 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; 

Ho provato a cambiare tutte le proprietà (compreso il) e diversi stili di pennello, il rettangolo dipinto non riempie la cellula completa.

risposta

0

Spegnere le prime 4 opzioni in TStringGrid:

  • goFixedVertLine
  • goFixedHorizLine
  • goVertLine
  • goHorizLine

allora non dipingere le linee della griglia, e la vostra le celle della griglia dipingono fino ai bordi. Ho appena provato con XE.

+2

Cosa succede se OP desidera le linee della griglia? –

+0

Quindi la mia risposta probabilmente non aiuterà, ma il semplice spegnimento delle linee fisse sembra essere d'aiuto. –

+0

@Bruce, la correzione è corretta per XE ma non XE2. C'è letteralmente il codice in TStringGrid.DrawCell che fa ARect.Left: = ARect.Left + 4 se DefaultDrawing è true e StyleServices sono abilitati. –

18

Questo è il comportamento previsto in XE2 quando DefaultDrawing = true e temi sono abilitati (io non ho intenzione di discutere bene o male qui - come si potrebbe aver notato, il comportamento è diverso per la modalità RigthToLeft ...).

Una soluzione alternativa è verificare questa condizione e diminuire di Rect.Left di 4 pixel prima di chiamare FillRect.

+1

Non c'è un modo per scoprire quanti pixel diminuire? Non mi piacciono molto i valori codificati per queste situazioni. Si romperà man mano che il codice si sposterà da XP a Vista e ai nuovi spessori del bordo. –

+2

@ Majan - Si tratta di un "4" hardcoded nell'origine VCL (TStringGrid.DrawCell). Non è una proprietà di uno stile, non una costante, .. solo '4'. –

+2

@SertacAkyuz: yikes! (e grazie per la risposta) –

3

È possibile utilizzare StringGrid1.CellRect(ACol, ARow) che restituisce il TRICE effettivo della cella anziché utilizzare il parametro Rect.

+1

Oops, è una routine pesante all'interno di un gestore di eventi OnDrawCell! – NGLN

0

Dato che si sta disegnando la cella della griglia, è sufficiente disattivare la proprietà della griglia DefaultDrawing, impostandola su false.

+1

Il codice mostrato non disegna la cella della griglia; disegna il * contenuto * della cella della griglia. Se disattivi DefaultDrawing, devi anche stampare il testo e le linee della griglia, che è molto più codice. È più semplice regolare il rettangolo di pochi pixel per adattarlo al riempimento aggiunto dal disegno a tema, come indicato in [Risposta di Uwe] (http://stackoverflow.com/a/8807002/62576) sopra. –