2012-10-23 25 views
6

Sử dụng Delphi 2010 và một thành phần TStringGrid, tôi hiện đang hiển thị năm fild từ một truy vấn cơ sở dữ liệu.Thêm thanh đồ họa vào một StringGrid col

Dưới đây là một ví dụ Giản thể về những gì tôi đang làm

// thiết lập lưới

procedure TGriddata.FormCreate(Sender: TObject); 
begin 
grdMain.Rows[0].commatext:='"One","Two","Three","Four","Five"'; 
grdMain.ColWidths[0]:= 50; 
grdMain.ColWidths[1]:= 175; 
grdMain.ColWidths[2]:= 175; 
grdMain.ColWidths[3]:= 100; 
grdMain.ColWidths[4]:= 300; 
end; 

// hiển thị dữ liệu trong lưới // lưu ý, tôi không thể hiện sự sáng tạo của tôi , thực hiện hoặc hủy truy vấn

procedure TGriddata.load; 
begin 
... 
grdMain.Cells[0,row]:= FieldByName('one').AsString; 
grdMain.Cells[1,row]:= FieldByName('two').AsString; 
grdMain.Cells[2,row]:= FieldByName('three').AsString; 
grdMain.Cells[3,row]:= FieldByName('four').AsString; 
//draw progress bar here 
... 
end; 

Một trong các cột ("Năm") cần hiển thị thanh ngang màu xanh hải quân trong cột. Nó cũng nên viết một số văn bản ở giữa thanh. Tôi không có expereince bằng cách sử dụng bản vẽ tùy chỉnh. Những thuộc tính nào tôi thiết lập để chỉ vẽ tùy chỉnh một cột và sử dụng bản vẽ mặc định cho các cột khác?

+0

Xem [nhận xét này] (http://stackoverflow.com/questions/7044125/delphi-draw-own-progress-bar-in-list-view/7048062#comment8445655_7048062) bởi Ian Boyd! – NGLN

Trả lời

9

Thêm văn bản vào các ô như bình thường. Nhưng bạn phải vẽ những thanh đó trong sự kiện OnDrawCell. Rời khỏi DefaultDrawing như là (True theo mặc định), và xóa văn bản được tế bào đã rút ra trong các cột bằng cách điền vào nó trước:

procedure TForm1.grdMainDrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    Progress: Single; 
    R: TRect; 
    Txt: String; 
begin 
    with TStringGrid(Sender) do 
    if (ACol = 4) and (ARow >= FixedRows) then 
    begin 
     Progress := StrToFloatDef(Cells[ACol, ARow], 0)/100; 
     Canvas.FillRect(Rect); 
     R := Rect; 
     R.Right := R.Left + Trunc((R.Right - R.Left) * Progress); 
     Canvas.Brush.Color := clNavy; 
     Canvas.Rectangle(R); 
     Txt := Cells[ACol, ARow] + '%'; 
     Canvas.Brush.Style := bsClear; 
     IntersectClipRect(Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom); 
     Canvas.Font.Color := clHighlightText; 
     DrawText(Canvas.Handle, PChar(Txt), -1, Rect, DT_SINGLELINE or 
     DT_CENTER or DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX); 
     SelectClipRgn(Canvas.Handle, 0); 
     ExcludeClipRect(Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom); 
     Canvas.Font.Color := clWindowText; 
     DrawText(Canvas.Handle, PChar(Txt), -1, Rect, DT_SINGLELINE or 
     DT_CENTER or DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX); 
     SelectClipRgn(Canvas.Handle, 0); 
    end; 
end; 

Custom drawn bars in StringGrid

Đối với tùy chọn hơn, bạn có thể xem xét this DrawStatus routine.

4

Tại đây bạn có thể xem mẫu (Draw percentage in a cell in a Grid) để vẽ một thanh trong ô của TStringGrid. Giải thích bằng tiếng Tây Ban Nha, nhưng bạn có thể tải xuống mã, điều này rất đơn giản. Ngoài ra, bạn có thể sử dụng dịch tự động ở bên phải trang.

enter image description here

procedure TFormDrawCell.DBGrid1DrawColumnCell(Sender: TObject; 
    const Rect: TRect; DataCol: Integer; Column: TColumn; 
    State: TGridDrawState); 
const 
    STR_EMPTY = ''; 
    CHAR_PERCENT = '%'; 
    SPACE_TO_CENTER_CELLTEXT = 0; 
var 
    fValue: Integer; 
    ActualPenColor, ActualBrushColor: TColor; 
    EmptyDS: Boolean; 
    DrawRect: TRect; 
    fWidth1, fLeft2: Integer; 
    StrValue: string; 
begin 
    if not (Column.FieldName = 'Precent') then 
    Exit; 

    if not (cbdraw.Checked) then 
    Exit; 

    EmptyDS := ((TDBGrid(Sender).DataSource.DataSet.EoF) and 
       (TDBGrid(Sender).DataSource.DataSet.Bof)); 

    if (Column.Field.IsNull) then begin 
    fValue := -1; 
    StrValue := STR_EMPTY; 
    end 
    else begin 
    fValue := Column.Field.AsInteger; 
    StrValue := IntToStr(fValue) + CHAR_PERCENT; 
    end; 

    DrawRect := Rect; 
    InflateRect(DrawRect, -1, -1); 

    fWidth1 := (((DrawRect.Right - DrawRect.Left) * fValue) DIV 100); 

    ActualPenColor := TDBGrid(Sender).Canvas.Pen.Color; 
    ActualBrushColor := TDBGrid(Sender).Canvas.Brush.Color; 
    TDBGrid(Sender).Canvas.Pen.Color := clHighlight; 
    TDBGrid(Sender).Canvas.Brush.Color := clWhite; 
    TDBGrid(Sender).Canvas.Rectangle(DrawRect); 

    if (fValue > 0) then begin 
    TDBGrid(Sender).Canvas.Pen.Color := clSkyBlue; 
    TDBGrid(Sender).Canvas.Brush.Color := clSkyBlue; 
    DrawRect.Right := DrawRect.Left + fWidth1; 
    InflateRect(DrawRect, -1, -1); 
    TDBGrid(Sender).Canvas.Rectangle(DrawRect); 
    end; 

    if not (EmptyDS) then begin 
    DrawRect := Rect; 
    InflateRect(DrawRect, -2, -2); 
    TDBGrid(Sender).Canvas.Brush.Style := bsClear; 
    fLeft2 := DrawRect.Left + (DrawRect.Right - DrawRect.Left) shr 1 - 
       (TDBGrid(Sender).Canvas.TextWidth(StrValue) shr 1); 
    TDBGrid(Sender).Canvas.TextRect(DrawRect, fLeft2, 
            DrawRect.Top + SPACE_TO_CENTER_CELLTEXT, StrValue); 
    end; 

    TDBGrid(Sender).Canvas.Pen.Color := ActualPenColor; 
    TDBGrid(Sender).Canvas.Brush.Color := ActualBrushColor; 
end; 

trọng.

+5

Vui lòng chỉnh sửa câu trả lời của bạn và thêm mã ở đây, thay vì chỉ liên kết đến một vị trí bên ngoài trang web. Nếu trang web bên ngoài không có sẵn vì lý do nào đó, câu trả lời của bạn trở nên vô nghĩa. Nó cũng không thể tìm kiếm được cho độc giả tương lai của trang web. Cảm ơn. –

+0

@KenWhite: Tôi đã tự do đăng phần có liên quan của mã ở đây và thực hiện một số đơn giản hóa nhẹ để làm cho nó dễ đọc hơn. –

+0

Cảm ơn bạn đã dán mã ở đây, @Wouter van Nifterick. –

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