(1)正确地设置StringGrid列宽而不截断任何一个文字方法是在对StringGrid填充完文本串后调用SetOptimalGridCellWidth过程 -----------程序片断------------------------------------------------- (* $Header$ Module Name : General\BSGrids.pas Main Program : Several. Description : StringGrid support functions. 03/21/2000 enhanced by William Sorensen *)
unit BSGrids;
interface
uses Grids;
type TExcludeColumns = set of 0..255; procedure SetOptimalGridCellWidth(sg: TStringGrid; ExcludeColumns: TExcludeColumns); // Sets column widths of a StringGrid to avoid truncation of text. // Fill grid with desired text strings first. // If a column contains no text, DefaultColWidth will be used. // Pass [] for ExcludeColumns to process all columns, including Fixed. // Columns whose numbers (0-based) are specified in ExcludeColumns will not // have their widths adjusted.
implementation
uses Math; // we need the Max function procedure SetOptimalGridCellWidth(sg: TStringGrid; ExcludeColumns: TExcludeColumns);
var i : Integer; j : Integer; max_width : Integer; begin with sg do begin // If the grid''''s Paint method hasn''''t been called yet, // the grid''''s canvas won''''t use the right font for TextWidth. // (TCustomGrid.Paint normally sets this, under DrawCells.) Canvas.Font.Assign(Font); for i := 0 to (ColCount - 1) do begin if i in ExcludeColumns then Continue; max_width := 0; // Search for the maximal Text width of the current column. for j := 0 to (RowCount - 1) do max_width := Math.Max(max_width,Canvas.TextWidth(Cells[i,j])); // The hardcode of 4 is based on twice the offset from the left // margin in TStringGrid.DrawCell. GridLineWidth is not relevant. if max_width > 0 then ColWidths[i] := max_width + 4 else ColWidths[i] := DefaultColWidth; end; { for } end; end;
end. (2)实现StringGrid的删除,插入,排序行操作(基本操作啦)//实现删除操作 Procedure GridRemoveColumn(StrGrid: TStringGrid; DelColumn: Integer); Var Column: Integer; begin If DelColumn <= StrGrid.ColCount then Begin For Column := DelColumn To StrGrid.ColCount-1 do StrGrid.Cols[Column-1].Assign(StrGrid.Cols[Column]); StrGrid.ColCount := StrGrid.ColCount-1; End; end;
//实现添加插入操作 Procedure GridAddColumn(StrGrid: TStringGrid; NewColumn: Integer); Var Column: Integer; begin StrGrid.ColCount := StrGrid.ColCount+1; For Column := StrGrid.ColCount-1 downto NewColumn do StrGrid.Cols[Column].Assign(StrGrid.Cols[Column-1]); StrGrid.Cols[NewColumn-1].Text := ''''''''; end;
//实现排序操作 Procedure GridSort(StrGrid: TStringGrid; NoColumn: Integer); Var Line, PosActual: Integer; Row: TStrings; begin Renglon := TStringList.Create; For Line := 1 to StrGrid.RowCount-1 do Begin PosActual := Line; Row.Assign(TStringlist(StrGrid.Rows[PosActual])); While True do Begin If (PosActual = 0) Or (StrToInt(Row.Strings[NoColumn-1]) >= StrToInt(StrGrid.Cells[NoColumn-1,PosActual-1])) then Break; StrGrid.Rows[PosActual] := StrGrid.Rows[PosActual-1]; Dec(PosActual); End; If StrToInt(Row.Strings[NoColumn-1]) < StrToInt(StrGrid.Cells[NoColumn-1,PosActual]) then StrGrid.Rows[PosActual] := Row; End; Renglon.Free; end; (3) TstringGrid 的行列合并研究 unit Unit1;
//建立一工程, //粘贴本单元代码即可看 STringGrid 行列合并效果 //但发现非固定行非固定列的合并效果不好 interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Db, ADODB, DBTables, Grids;//注意这里要引用
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure SGTopLeftChanged(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
// 以下 StringGrid 为固定行,固定列的合并所必须进行的处理 // 非固定行,非固定列的合并效果不好 var sg:TStringGrid; procedure TForm1.FormCreate(Sender: TObject); var i,j:integer ; begin Sg:=TStringGrid.Create(self);
with SG do begin parent:=self; align:=alclient; DefaultDrawing:=false; FixedColor:=clYellow; RowCount:=30; ColCount:=20; FixedCols:=1; FixedRows:=1; GridLineWidth:=0; Options:=Options+[goEditing]-[goVertLine,goHorzLine,goRangeSelect]; OnDrawCell:=SGDrawCell; OnTopLeftChanged:=SGTopLeftChanged; Canvas.Font.name:=''''宋体''''; Canvas.Font.Size:=10;
for i:=0 to colCount-1 do for j:=0 to RowCount-1 do cells[i,j]:=Format(''''%d行%d列'''',[j,i]);
for i:=0 to colCount-1 do cells[i,0]:=Format(''''第%d列'''',[i]); for i:=0 to RowCount-1 do cells[0,i]:=Format(''''第%d行'''',[i]);
Cells[0,0]:='''' 左上角''''; Cells[1,0]:=''''AA这是列合并BB''''; Cells[0,1]:=''''A这是行''''#10''''合并BB''''; Cells[1,1]:=''''1111111''''; Cells[1,2]:=''''1111222''''; Cells[2,1]:=''''2222111''''; Cells[2,2]:=''''2222222''''; end; end;
//重载 OnDrawCell 事件 procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var r:TRect; d:TStringGrid; s:string; ts:TStrings; i,n:integer; fixed:Boolean; begin d:=TStringGrid(sender); if (Acol=2) and (ARow=0) then begin r.left:=Rect.left-1-d.colwidths[ACol-1]; r.top:=rect.top-1; r.right:=rect.right; r.bottom:=rect.bottom; s:=d.cells[ACol-1,ARow]; end else if (Acol=1) and (ARow=0) then begin r.left:=Rect.left-1; r.top:=rect.top-1; r.right:=rect.right+d.colwidths[ACol+1]; r.bottom:=rect.bottom; s:=d.cells[ACol,ARow]; end //////////以上列合并 else if (Acol=0) and (ARow=2) then begin r.left:=Rect.left-1; r.top:=rect.top-1-d.RowHeights[ARow-1]; r.right:=rect.right; r.bottom:=rect.bottom; s:=d.cells[ACol,ARow-1]; end else if (Acol=1) and (ARow=0) then begin r.left:=Rect.left-1; r.top:=rect.top-1; r.right:=rect.right; r.bottom:=rect.bottom+d.RowHeights[ARow+1]; s:=d.cells[ACol,ARow]; end ////////以上为行合并 else begin r.left:=Rect.left-1; r.top:=rect.top-1; r.right:=rect.right; r.bottom:=rect.bottom; s:=d.cells[ACol,ARow]; end;
d.Canvas.brush.color:=d.color; d.canvas.Font.color:=$ff0000;
Fixed:=false; if (Arow<d.FixedRows) or (ACol<d.Fixedcols) then begin d.Canvas.brush.color:=d.FixedColor; d.Canvas.Font.color:=$ff00ff; Fixed:=True; //d.Canvas.Font.style:=d.Canvas.Font.style+[fsBold]; end; if gdfocused in state then begin d.canvas.Brush.color:=$00ff00; end; if fixed then begin d.Canvas.Pen.color:=$0; d.canvas.Rectangle(r);
d.Canvas.Pen.color:=$f0f0f0; d.Canvas.Pen.Width:=2; d.canvas.Moveto(r.left+1,r.top+2); d.canvas.Lineto(r.left+r.right,r.top+2);
d.Canvas.Pen.color:=$808080; d.Canvas.Pen.Width:=1; d.canvas.Moveto(r.Left+1,r.bottom-1); d.canvas.Lineto(r.left+r.right,r.bottom-1);
end else begin d.Canvas.Pen.color:=$0; d.Canvas.Pen.Width:=1; d.canvas.Rectangle(r); end; n:=r.top+4; ts:=TStringList.Create; ts.CommaText:=s; for i:=0 to ts.Count-1 do begin d.canvas.Textout(r.left+4,n,ts[i]); inc(n,d.RowHeights[ARow]); end; end;
//重载 OnTopLeftChange事件,特别是行的合并 procedure TForm1.SGTopLeftChanged(Sender: TObject); var d:TStringGrid; begin d:=TStringGrid(Sender); d.Cells[0,1]:=d.Cells[0,1]; d.Cells[0,2]:=d.Cells[0,2]; end;
end. (4)让stringgrid点列头进行 [1] [2] 下一页 [常用软件]评测:Gmail Beta(一) [VB.NET程序]把握VB.NET中的流(Stream) (一) [VB.NET程序]从Csharp走到VB.Net(一):MyClass保留字 [Delphi程序]一 个 实 用 的Delphi 屏 幕 拷 贝 程 序 的 设 [Delphi程序]Multi-Tier结构程序开发基础教程 (一) [Delphi程序]游戏脚本管理 (一) [Delphi程序]Integer GUID和Comb做主键的效率测试(Delphi+acce… [网页制作]DreamwaverMX与ASP.NET(一) [Web开发]XPDL学习与分享 一 [Web开发]ADO.net学习记录 (一)
|