2012-10-23 19 views
6

Delphi 2010'u ve bir TStringGrid bileşenini kullanarak, şu anda bir veritabanı sorgusundan beş dosya görüntülüyorum. İşte Bir StringGrid sütununa grafik çubuğu ekleyin

i // ızgara

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; 

// ızgara // not verileri görüntülemek kurmak

yapıyorum bir simplied örnektir, benim oluşturulmasını gösteren değilim , yürütme ya da sorgunun sütunları ("Beş") olarak

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; 

bir col lacivert yatay çubuğu görüntülemek için ihtiyacı içinde yok. Ayrıca, çubukta ortalanmış bir metni de dipleyecektir. Özel çizimi kullanmanın bir yararı yok. Yalnızca bir sütunu özel olarak çizmek ve diğer sütunlar için varsayılan çizimi kullanmak için hangi mülkleri yapıyorum?

+0

Ian Boyd tarafından [this comment] (http://stackoverflow.com/questions/7044125/delphi-draw-own-progress-bar-in-list-view/7048062#comment8445655_7048062) adresine bakın! – NGLN

cevap

9

Metni, normalde yaptığınız gibi hücrelere ekleyin. Ama bu çubukları OnDrawCell etkinliğinde çekmelisiniz. (Varsayılan olarak True) olduğu gibi DefaultDrawing bırakın ve peşin doldurarak bu sütunlarda zaten çizilmiş hücre metni silmek: Daha fazla seçenek için, this DrawStatus routine düşünebilirsiniz

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

.

4

Burada, bir TStringGrid hücresinde çubuk çizmek için bir örneği (Draw percentage in a cell in a Grid) görüntüleyebilirsiniz. Açıklama ispanyolcadır, ancak kodu indirebilirsin, bu çok basit. Ayrıca sayfanın sağ tarafında otomatik çeviri kullanabilirsiniz.

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; 

Saygılar

.

+5

Lütfen cevabınızı düzenleyin ve sadece site dışı bir yere bağlanmak yerine kodu buraya ekleyin. Dış site herhangi bir nedenle kullanılamıyorsa, cevabınız anlamsızlaşır. Ayrıca sitenin gelecekteki okuyucuları için aranabilir değil. Teşekkürler. –

+0

@KenWhite: Kodun ilgili kısmını buraya postalama özgürlüğünü aldım ve daha kolay okunabilmesi için bazı basit basitleştirmeler yaptım. –

+0

Kodu buraya yapıştırdığınız için teşekkürler, @Wouter van Nifterick. –

İlgili konular