2012-10-23 20 views
6

Używając Delphi 2010 i komponentu TStringGrid, aktualnie wyświetlam pięć fild z kwerendy bazy danych.Dodaj pasek graficzny do StringGrid col

Oto simplied przykładem tego, co robię

// skonfigurować siatkę

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; 

// wyświetlenie danych w siatce // uwaga, nie pokazuję moje tworzenie , wykonanie, lub zniszczyć zapytania

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; 

jednej z kolumn („piątka”) wymaga, aby wyświetlić granatowy poziomy pasek w kol. Powinien także wyświetlać tekst wyśrodkowany na pasku. Nie mam doświadczenia przy korzystaniu z niestandardowego rysunku. Jakie właściwości ustawiam tylko na niestandardowe narysuj jedną kolumnę i użyj domyślnego rysunku dla pozostałych kolumn?

+0

Zobacz [ten komentarz] (http://stackoverflow.com/questions/7044125/delphi-draw-own-progress-bar-in-list-view/7048062#comment8445655_7048062) autorstwa Iana Boyda! – NGLN

Odpowiedz

9

Dodaj tekst do komórek tak jak zwykle. Ale musisz narysować te paski w wydarzeniu OnDrawCell. Zostaw DefaultDrawing jak jest (True domyślnie) i usunąć już sporządzony tekst komórek w tych kolumnach, wypełniając go z góry:

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

Aby uzyskać więcej opcji, można rozważyć this DrawStatus routine.

4

Tutaj można wyświetlić próbkę (Draw percentage in a cell in a Grid), aby narysować pasek w komórce TStringGrid. Wyjaśnienie jest w języku hiszpańskim, ale można pobrać kod, który jest bardzo prosty. Możesz również użyć tłumaczenia authomatic na prawo od strony.

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; 

Pozdrawiam.

+5

Edytuj odpowiedź i dodaj tutaj kod, zamiast po prostu połączyć się z lokalizacją poza nią. Jeśli strona zewnętrzna nie jest dostępna z jakiegoś powodu, twoja odpowiedź staje się bez znaczenia. Nie można jej również wyszukać dla przyszłych czytelników strony. Dzięki. –

+0

@KenWhite: Pozwoliłem sobie umieścić odpowiednią część kodu tutaj i zrobiłem kilka uproszczeń, aby uczynić ją bardziej czytelną. –

+0

Dzięki za wklejenie kodu tutaj, @Wouter van Nifterick. –