转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
StringGrid使用全书( 一)         ★★★★

StringGrid使用全书( 一)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1717 更新时间:2009/4/23 18:30:18

(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学习记录 (一)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台