2012-02-27 13 views
5

Khi bạn có TDBGrid, lựa chọn hàng đầy đủ và luôn hiển thị lựa chọn, ngay cả khi không tập trung và bạn muốn chủ sở hữu hoàn toàn vẽ, bạn có thể chọn sự kiện không được chấp nhận OnDrawDataCell và sự kiện mới DrawColumnCell. sau này và cố gắng này:Làm thế nào để làm một chủ sở hữu thích hợp rút của Full Row chọn TDBGrid khi TDBGrid.DefaultDrawing là sai?

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; 

và những gì đang lái xe cho tôi điên là dấu hiệu cho thấy tập trung (màu sắc nổi bật và tập trung hình chữ nhật) không được rút ra bởi mã DefaultDrawColumnCell, và tôi chắc chắn rằng tôi nên gọi DrawCellHighlight thay làm FillRect hack tôi đang làm ở trên.

Nếu tôi bật DefaultDrawing, tôi nhận được một bộ ổn định (các vấn đề về vẽ phông chữ lẻ) và nếu tắt nó, tôi sẽ nhận được một bộ ổn định khác (không đánh dấu ngay cả khi gdSelected).

Mã trong DBGrids.pas DefaultDrawColumnCell không có gì khác ngoài việc vẽ văn bản. Vì vậy, rõ ràng, bạn phải làm nhiều hơn, nếu bạn tiếp quản tất cả các mã vẽ mình. Tuy nhiên, mã bản vẽ nổi bật được xây dựng thành Grids.pas, dựa vào đó DBGrids.pas phụ thuộc, không được thiết kế để được gọi từ ngữ cảnh này. Tôi không thể tìm ra nếu tôi nên gọi trực tiếp DrawCellHighlight (hiển thị nhận xét ở trên), và tìm ra giá trị Col và Row, hoặc nếu tôi nên viết phiên bản phức tạp của riêng tôi của TCustomGrid.DrawCellHighlight xử lý tất cả các trường hợp khác nhau theo cách thủ công.

Chắc chắn điều này thật đơn giản và rõ ràng, và tôi chỉ nhìn nó. NOte mà tôi phải rời khỏi DefaultDrawing, và vì vậy tôi phải vẽ hoàn toàn từ bên trong sự kiện vẽ chủ sở hữu của mình và tôi phải có thể chạy khi dịch vụ chủ đề không khả dụng và tôi phải sử dụng các dịch vụ chủ đề khi có sẵn. Vì vậy, tôi cần phải gọi TCustomGrid.DrawCellHighlight trực tiếp (và tôi không biết làm thế nào để), hoặc tôi cần phải reimplement nó hoàn toàn.

Trả lời

4

Bạn nên gọi DrawCellHighlight do hỗ trợ chủ đề mà bạn cần thực hiện chính mình. Mặc dù số lượng hàng không được cung cấp cho OnDrawColumnCell nó không giống như nó thậm chí còn được sử dụng bởi mã DefaultDrawColumnCell vì vậy bạn không cần phải cố gắng tính toán nó trong nội bộ:

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

Điều đó có vẻ đủ hợp lý. –

+0

@Mike W, làm cách nào tôi có thể thay đổi màu nền của hàng? – Ganesh

+0

tHackGrid (mygrid) .Canvas.Brush.Color: = clRed; // Không làm việc !! – 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;