2012-10-23 38 views
6

पर ग्राफिकल बार जोड़ें डेल्फी 2010 और एक TStringGrid घटक का उपयोग करके, मैं वर्तमान में डेटाबेस क्वेरी से पांच फ़ील्ड प्रदर्शित करता हूं।स्ट्रिंगग्रिड कॉल

यहाँ मैं क्या कर रहा हूँ

// ग्रिड

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; 

// ग्रिड // नोट में डेटा प्रदर्शित की स्थापना का एक सरलीकृत उदाहरण है, मैं अपने सृजन दिखा नहीं कर रहा हूँ , निष्पादन, या क्वेरी

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; 

कॉलम ("पांच") में से एक स्तंभ में एक गहरे नीले रंग का क्षैतिज बार प्रदर्शित करने के लिए की जरूरत है की नष्ट कर। इसे बार में केंद्रित कुछ पाठ भी डालना चाहिए। कस्टम ड्राइंग का उपयोग कर मेरे पास कोई expereince नहीं है। मैं केवल एक कॉलम को कस्टम बनाने के लिए सेट करता हूं और अन्य कॉलम के लिए डिफ़ॉल्ट ड्राइंग का उपयोग करता हूं?

+0

इयान बॉयड द्वारा [इस टिप्पणी] [http://stackoverflow.com/questions/7044125/delphi-draw-own-progress-bar-in-list-view/7048062#comment8445655_7048062) देखें! – NGLN

उत्तर

9

सामान्य रूप से आपके जैसे कक्षों में टेक्स्ट जोड़ें। लेकिन आपको उन बारों को OnDrawCell ईवेंट में आकर्षित करना होगा। DefaultDrawing है के रूप में (True डिफ़ॉल्ट रूप से) छोड़ दो, और अग्रिम में यह भरने तक वे कॉलम में पहले से ही तैयार की सेल लेख को मिटाने:

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

अधिक विकल्पों के लिए, आप this DrawStatus routine सोच सकते हैं।

4

यहां आप एक TStringGrid के सेल में एक बार खींचने के लिए नमूना (Draw percentage in a cell in a Grid) देख सकते हैं। स्पष्टीकरण स्पैनिश में है, लेकिन आप कोड डाउनलोड कर सकते हैं, यह बहुत आसान है। इसके अलावा आप पृष्ठ के दाईं ओर स्वचालित अनुवाद का उपयोग कर सकते हैं।

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; 

सादर।

+5

कृपया अपना उत्तर संपादित करें और यहां ऑफ़-साइट स्थान से लिंक करने के बजाय, कोड जोड़ें। यदि बाहरी साइट किसी कारण से उपलब्ध नहीं है, तो आपका उत्तर व्यर्थ हो जाता है। यह साइट के भावी पाठकों के लिए भी खोज योग्य नहीं है। धन्यवाद। –

+0

@ केनहाइट: मैंने यहां कोड के प्रासंगिक भाग को पोस्ट करने की स्वतंत्रता ली, और इसे और अधिक पठनीय बनाने के लिए कुछ मामूली सरलीकरण किए। –

+0

यहां कोड पेस्ट करने के लिए धन्यवाद, @ वाउटर वैन निफ्टेरिक। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^