2012-01-10 26 views
14

FillRect không sơn ô hoàn chỉnh TStringGrid trong Delphi XE2. Có khoảng cách 3 pixel ở phía bên trái màu mặc định (với BiDiMode được đặt thành bdLeftToRight). Vấn đề này không tồn tại trong Delphi 6 mà tôi đã sử dụng trước đây.FillRect không vẽ ô TStringGrid hoàn chỉnh trong 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; 

Tôi cố gắng để thay đổi tất cả tài sản (bao gồm cả) và phong cách bàn chải khác nhau, hình chữ nhật sơn không điền vào các tế bào hoàn chỉnh.

Trả lời

0

Tắt 4 lựa chọn đầu tiên trong TStringGrid:

  • goFixedVertLine
  • goFixedHorizLine
  • goVertLine
  • goHorizLine

Sau đó, nó sẽ không vẽ đường lưới, và bạn ô lưới sẽ vẽ ngay cạnh các cạnh. Chỉ cần thử nó với XE.

+2

Điều gì xảy ra nếu OP không muốn các đường lưới? –

+0

Sau đó, câu trả lời của tôi có lẽ sẽ không giúp đỡ, nhưng chỉ cần tắt các dòng cố định dường như giúp đỡ. –

+0

@Bruce, sửa chữa của bạn là chính xác cho XE nhưng không phải XE2. Có nghĩa là mã trong TStringGrid.DrawCell mà ARect.Left: = ARect.Left + 4 nếu DefaultDrawing là đúng và StyleServices được kích hoạt. –

18

này dự kiến ​​hành vi trong XE2 khi DefaultDrawing = true và chủ đề được kích hoạt (Tôi sẽ không để tranh luận về tốt hay xấu ở đây - như bạn có thể nhận thấy, hành vi này là khác nhau cho chế độ RigthToLeft ...).

Giải pháp thay thế là kiểm tra điều kiện này và giảm Rect.Left xuống 4 pixel trước khi gọi FillRect.

+1

Không có cách nào để tìm ra số lượng điểm ảnh cần giảm? Tôi thực sự không thích các giá trị mã hóa cứng cho những tình huống này. Nó sẽ phá vỡ như soo nhiều mã đã phá vỡ đi từ XP đến Vista và độ dày biên giới mới. –

+2

@Marjan - Đó là mã hardcoded '4' trong nguồn VCL (TStringGrid.DrawCell). Nó không phải là một tài sản của một phong cách, không phải là một hằng số, .. chỉ '4'. –

+2

@SertacAkyuz: yikes! (và cảm ơn cho câu trả lời) –

3

Bạn có thể sử dụng StringGrid1.CellRect(ACol, ARow) trả về TRect thực tế của ô thay vì sử dụng tham số Rect.

+1

Rất tiếc, đó là một thói quen nặng trong trình xử lý sự kiện OnDrawCell! – NGLN

0

Vì bạn đang tự vẽ ô lưới rồi chỉ cần tắt thuộc tính lưới DefaultDrawing, đặt thành false.

+1

Mã được hiển thị không vẽ ô lưới; nó vẽ * nội dung * của ô lưới. Nếu bạn tắt DefaultDrawing, bạn cũng phải xuất các dòng văn bản và đường lưới, đó là nhiều mã hơn. Nó dễ dàng hơn để chỉ điều chỉnh rect bởi một vài điểm ảnh để điều chỉnh cho padding thêm bằng cách vẽ theo chủ đề, như đã đề cập trong [Uwe's answer] (http://stackoverflow.com/a/8807002/62576) ở trên. –

Các vấn đề liên quan