Delphi的StringGrid使用技巧代码

本文介绍了Delphi中TStringGrid的扩展类TExCell,提供了插入和删除行列的方法。此外,还展示了如何实现StringGrid中某一列的复选框效果,并详细描述了StringGrid的单元格内容分行显示、只读列的创建、从文件加载和保存数据,以及自定义单元格对齐和选中行颜色的方法。最后,文章提及了删除选定行和将数据保存为HTML文件的实用代码。
摘要由CSDN通过智能技术生成

StringGrid行列的增加和删除

type
  TExCell = class(TStringGrid)

public
  procedure DeleteRow(ARow: Longint);
  procedure DeleteColumn(ACol: Longint);
  procedure InsertRow(ARow: LongInt);
  procedure InsertColumn(ACol: LongInt);
end;

procedure TExCell.InsertColumn(ACol: Integer);
begin
  ColCount :=ColCount +1;
  MoveColumn(ColCount-1, ACol);
end;

procedure TExCell.InsertRow(ARow: Integer);
begin
  RowCount :=RowCount +1;
  MoveRow(RowCount-1, ARow);
end;

procedure TExCell.DeleteColumn(ACol: Longint);
begin
  MoveColumn(ACol, ColCount -1);
  ColCount := ColCount - 1;
end;

procedure TExCell.DeleteRow(ARow: Longint);
begin
  MoveRow(ARow, RowCount - 1);
  RowCount := RowCount - 1;
end;

==================================================================================

何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids;

type
  TForm1 = class(TForm)
  grid: TStringGrid;
  procedure FormCreate(Sender: TObject);
  procedure gridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  procedure gridClick(Sender: TObject);

  private
{ Private declarations }

  public
{ Public declarations }

end;

var
  Form1: TForm1;
  fcheck,fnocheck:tbitmap;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i:SmallInt;
  bmp:TBitmap;
begin
  FCheck:= TBitmap.Create;
  FNoCheck:= TBitmap.Create;
  bmp:= TBitmap.create;
  try
    bmp.handle := LoadBitmap( 0, PChar(OBM_CHECKBOXES ));
    With FNoCheck Do Begin
      width := bmp.width div 4;
      height := bmp.height div 3;
      canvas.copyrect( canvas.cliprect, bmp.canvas, canvas.cliprect );
    End;
  With FCheck Do Begin
    width := bmp.width div 4;
    height := bmp.height div 3;
    canvas.copyrect(canvas.cliprect, bmp.canvas, rect( width, 0, 2*width, height ));
  End;
  finally
    bmp.free
  end;
end;

procedure TForm1.gridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then
    with TStringGrid(Sender).Canvas do
  begin
    brush.Color:=clWindow;
    FillRect(Rect);
    if Grid.Cells[ACol,ARow]='yes' then
      Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FCheck )
    else
      Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FNoCheck );
  end;
end;

procedure TForm1.gridClick(Sender: TObject);
begin
  if grid.Cells[grid.col,grid.row]='yes' then
    grid.Cells[grid.col,grid.row]:='no'
  else
    grid.Cells[grid.col,grid.row]:='yes';
end;

end.
===============================================================================


StringGrid组件Cells内容分行显示

在Tstringgrid.ondrawcell事件中:

  DrawText(StringGrid1.Canvas.Handle,pchar(StringGrid1.Cells[Acol,Arow]),Length(StringGrid1.Cells[Acol,Arow]),Rect,DT_WORDBREAK or DT_LEFT);

可以实现文字换行!
================================================================================


在StringGrid怎样制作只读的列

在 OnSelectCell事件处理程序中,加入: (所有的列均设成可修改的)

  if Col mod 2 = 0 then
    grd.Options := grd.Options + [goEditing]
  else
    grd.Options := grd.Options - [goEditing];


stringgrid从文本读入的问题(Save/Load a TStringGrid to/from a file?)

stringgrid从文本读入的问题(Save/Load a TStringGrid to/from a file?)

// Save a TStringGrid to a file
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f: TextFile;
  i, k: Integer;
begin
  AssignFile(f, FileName);
  Rewrite(f);
  with StringGrid do
  begin
    // Write number of Columns/Rows
    Writeln(f, ColCount);
    Writeln(f, RowCount);
    // loop through cells
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
        Writeln(F, Cells[i, k]);
  end;
  CloseFile(F);
end;

// Load a TStringGrid from a file
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  f: TextFile;
  iTmp, i, k: Integer;
  strTemp: String;
begin
  AssignFile(f, FileName);
  Reset(f);
  with StringGrid do
  begin
    // Get number of columns
    Readln(f, iTmp);
    ColCount := iTmp;
    // Get number of rows
    Readln(f, iTmp);
    RowCount := iTmp;
    // loop through cells & fill in values
    for i := 0 to ColCount - 1 do
      for k := 0 to RowCount - 1 do
      begin
        Readln(f, strTemp);
        Cells[i, k] := strTemp;
      end;
    end;
  CloseFile(f);
end;

// Save StringGrid1 to 'c:.txt':
procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveStringGrid(StringGrid1, 'c:.txt');
end;

// Load StringGrid1 from 'c:.txt':
procedure TForm1.Button2Click(Sender: TObject);
begin
  LoadStringGrid(StringGrid1, 'c:.txt');
end;

*******************************************

打开一个已有的文本文件,并将内容放到stringgrid中,文本行与stringgrid行一致;
在文本中遇到空格则放入下一cells.
搞定!注意,我只写了一个空格间隔的,你自己修改一下splitstring可以用多个空格分隔!

procedure TForm1.Button1Click(Sender: TObject);
var
  aa,bb:tstringlist;
  i:integer;
begin
  aa:=tstringlist.Create;
  bb:=tstringlist.Create;
  aa.LoadFromFile('c:.txt');
  for i:=0 to aa.Count-1 do
  begin
    bb:=SplitString(aa.Strings[i],' ');
    stringgrid1.Rows[i]:=bb;
  end;
  aa.Free;
  bb.Free;
end;

其中splitstring为:

function SplitString(const source,ch:string):tstringlist;
var
  temp:string;
  i:integer;
begin
  result:=tstringlist.Create;
  temp:=source;
  i:=pos(ch,source);
  while i<>0 do
  begin
    result.Add(copy(temp,0,i-1));
    delete(temp,1,i);
    i:=pos(ch,temp);
  end;
  result.Add(temp);
end;
 



StringGrid组件Cells内容对齐

在StringGrid的DrawCell事件中添加类似的代码就可以了:

VAR
  vCol, vRow : LongInt;
begin
  vCol := ACol; vRow := ARow;
  WITH Sender AS TStringGrid, Canvas DO
    IF vCol = 2 THEN BEGIN ///对于第2列设置为右对齐
      SetTextAlign(Handle, TA_RIGHT);
      FillRect(Rect);
      TextRect(Rect, Rect.RIGHT-2, Rect.Top+2, Cells[vCol, vRow]);
    END;
end;
===============================================================================

 当我将StringGird的options属性中包含goRowSelect项时每当我选中StringGrid中一行, 则选中行用深蓝色显示,我想将深蓝色改为其他颜色应怎样该?

当我将StringGird的options属性中包含goRowSelect项时每当我选中StringGrid中一行, 则选中行用深蓝色显示,我想将深蓝色改为其他颜色应怎样该?

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
  With StringGrid1 do
  begin
    If  (ARow= Krow) and not (acol = 0) then
    begin
       Canvas.Brush.Color :=clYellow;// ClBlue;
       Canvas.FillRect(Rect);
       Canvas.font.color:=ClBlack;
       Canvas.TextOut(rect.left , rect.top, cells[acol, arow]);
    end;
  end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  krow := Arow;  //*
  kcol := Acol;
end;  

注意:必须把变量KROW的值初始为1或其他不为0的值,否则如果锁定第一行的话,第一行的颜色将被自设颜色取代,而锁定行不会被重画。
=================================================================================

怎么改变StringGrid控件某一列的背景和某一列的只读属性,StringGrid控件标题栏的对齐.

怎么改变StringGrid控件某一列的背景和某一列的只读属性,StringGrid控件标题栏的对齐.
请参考以下代码:
  在OnDrawCell事件中处理背景色。程序如下:
//将第二列背景变为红色。
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if not((acol=1) and (arow>=stringgrid1.fixedrows)) then exit;
  with stringgrid1 do
  begin
    canvas.Brush.color:=clRed;
    canvas.FillRect(Rect);
    canvas.TextOut(rect.left+2,rect.top+2,cells[acol,arow])
  end;
end;

//加入如下代码,那么StringGrid的第四列就只读了.其他列非只读
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值