使用Delphi 2010和TStringGrid组件,我目前显示数据库查询中的五个fild.
这是我正在做的一个简单的例子
//设置网格
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;
其中一列(“五”)需要在col中显示海军蓝色水平条.它还应该显示一些以栏为中心的文本.我没有使用自定义绘图的经验.我设置的哪些属性只能自定义绘制一列并使用其他列的默认绘图?
解决方法
像往常一样将文本添加到单元格中.但是你必须在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.Bottom); Canvas.Font.Color := clWindowText; DrawText(Canvas.Handle,0); end; end;
有关更多选项,您可以考虑this DrawStatus
routine.