`

StringGrid操作大全

 
阅读更多

(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点列头进行排序procedure GridQuickSort(Grid: TStringGrid; ACol: Integer; Order: Boolean ; NumOrStr: Boolean);
(******************************************************************************)
(* 函数名称:GridQuickSort *)
(* 函数功能:给 StringGrid 的 ACol 列快速法排序 _/_/ _/_/ _/_/_/_/_/ *)
(* 参数说明: _/ _/ _/ *)
(* Order: True 从小到大 _/ _/ *)
(* : False 从大到小 _/ _/ *)
(* NumOrStr : true 值的类型是Integer _/_/ _/_/ *)
(* : False 值的类型是String *)
(* 函数说明:对于日期,时间等类型数据均可按字符方式排序, *)
(* *)
(* *)(******************************************************************************)
procedure MoveStringGridData(Grid: TStringGrid; Sou,Des :Integer );
var
TmpStrList: TStringList ;
K : Integer ;
begin
try
TmpStrList :=TStringList.Create() ;
TmpStrList.Clear ;
for K := Grid.FixedCols to Grid.ColCount -1 do
TmpStrList.Add(Grid.Cells[K,Sou]) ;
Grid.Rows [Sou] := Grid.Rows [Des] ;
for K := Grid.FixedCols to Grid.ColCount -1 do
Grid.Cells [K,Des]:= TmpStrList.Strings[K] ;
finally
TmpStrList.Free ;
end;
end;

procedure QuickSort(Grid: TStringGrid; iLo, iHi: Integer);
var
Lo, Hi : Integer;
Mid: String ;
begin
Lo := iLo ;
Hi := iHi ;
Mid := Grid.Cells[ACol,(Lo + Hi) div 2];
repeat
if Order and not NumOrStr then //按正序、字符排
begin
while Grid.Cells[ACol,Lo] < Mid do Inc(Lo);
while Grid.Cells[ACol,Hi] > Mid do Dec(Hi);
end ;
if not Order and not NumOrStr then //按反序、字符排
begin
while Grid.Cells[ACol,Lo] > Mid do Inc(Lo);
while Grid.Cells[ACol,Hi] < Mid do Dec(Hi);
end;

if NumOrStr then
begin
if Grid.Cells[ACol,Lo] = '' then Grid.Cells[ACol,Lo] := '0' ;
if Grid.Cells[ACol,Hi] = '' then Grid.Cells[ACol,Hi] := '0' ;
if Mid = '' then Mid := '0' ;
if Order then
begin //按正序、数字排
while StrToFloat(Grid.Cells[ACol,Lo]) < StrToFloat(Mid) do Inc(Lo);
while StrToFloat(Grid.Cells[ACol,Hi]) > StrToFloat(Mid) do Dec(Hi);
end else
begin //按反序、数字排
while StrToFloat(Grid.Cells[ACol,Lo]) > StrToFloat(Mid) do Inc(Lo);
while StrToFloat(Grid.Cells[ACol,Hi]) < StrToFloat(Mid) do Dec(Hi);
end;
end ;
if Lo <= Hi then
begin
MoveStringGridData(Grid, Lo, Hi) ;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(Grid, iLo, Hi);
if Lo < iHi then QuickSort(Grid, Lo, iHi);
end;

begin
try
QuickSort(Grid, Grid.FixedRows, Grid.RowCount - 1 ) ;
except
on E: Exception do
Application.MessageBox(Pchar('系统在排序数据的时候遇到异常:'#13+E.message+#13'请重试,如果该问题依然存在请与程序供应商联系!'),'系统错误',MB_OK+MB_ICONERROR) ;
end;
end;

procedure StringGridTitleDown(Sender: TObject;
Button: TMouseButton; X, Y: Integer);
(******************************************************************************)
(* 函数名称:StringGridTitleDown *)
(* 函数功能:取鼠标点StringGrid 的列 _/_/ _/_/ _/_/_/_/_/ *)
(* 参数说明: _/ _/ _/ *)
(* Sender _/ _/ *)
(*(*
(******************************************************************************)
var
I: Integer ;
begin
if (Y > 0 ) and (y < TStringGrid(Sender).DefaultRowHeight * TStringGrid(Sender).FixedRows ) then
begin
if Button = mbLeft then
begin
I := X div TStringGrid(Sender).DefaultColWidth ;
//这个i 就是要排序得行了
// 下面调用上面的排序函数就可以了,
GridQuickSort(TStringGrid(Sender), I, False, True) ;
end;
end;
end;

用上面的两个函数就能解决你的问题了。在TStringGrid 的MouseDown事件中调用StringGridTitleDown 函数就可以。你可能要修改一下StringGridTitleDown函数来修改排序得方式及其字符类型。
提醒你一下对于日期、时间、布尔等类型数据均可按字符方式排序。
例如:

procedure TForm_Main.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGridTitleDown(Sender,Button,X,Y);
end;

分享到:
评论

相关推荐

    delphi_StringGrid使用全书

    一、StringGrid基本操作:增加与删除行列 在Delphi中,StringGrid是一种非常强大的表格组件,它能够处理大量的数据,并且提供了丰富的自定义选项。掌握如何增加和删除StringGrid的行列是基本而重要的技能。 ```...

    delphi StringGrid功能程序

    4. **代码示例**:程序可能包含了如何创建和操作StringGrid的示例代码,例如如何动态添加列、设置单元格的值、响应用户交互事件等。开发者可以通过阅读这些示例来学习如何在自己的应用程序中实现类似的功能。 5. **...

    delphi stringGrid小示列

    通过运行这个程序,开发者可以了解StringGrid的基本操作,并为自己的项目提供参考。 总之,Delphi中的StringGrid是一个强大且灵活的控件,适合于显示和编辑结构化数据。理解并熟练运用它的特性和事件,可以极大地...

    stringgrid

    标题中的“stringgrid”指的是StringGrid组件,这是在Delphi或FreePascal等基于VCL(Visual Component Library)的开发环境中常用的一种控件。StringGrid通常用于显示和编辑表格数据,类似于电子表格,但功能相对...

    stringgrid多选拖拽换行

    3. **拖拽操作**:实现拖拽功能需要覆写或扩展StringGrid的默认行为。这通常涉及监听`OnMouseDown`、`OnMouseMove`和`OnMouseUp`事件。在`OnMouseDown`事件中记录起始行号,在`OnMouseMove`中检查是否达到拖拽阈值,...

    StringGrid例子

    "TStringGrid"是该组件的类名,它是TCustomGrid的子类,提供了表格数据的显示和操作功能,如单元格的读写、行和列的增删等。"八皇后"则指出了这个示例程序的主题,它是一个典型的回溯算法应用,通过编程来寻找所有...

    Delphi Checkbox in StringGrid 使用

    在 Delphi 开发环境中,StringGrid 是一个非常实用的组件,它允许开发者创建二维表格来显示和编辑数据。而将 Checkbox(复选框)集成到 StringGrid 中,则为用户提供了一种直观的方式来选择或标记特定行或列的数据。...

    StringGrid部分行按列排序

    它支持灵活的数据操作和展示方式,常用于数据显示、编辑等场景。 ### 实现部分行按列排序功能 #### 排序逻辑解析 排序功能主要由`SortGrid`函数完成,该函数接受以下参数: - `Grid`: 指向StringGrid实例的指针...

    C# datagridview实现Delphi stringgrid功能

    在本教程中,我们将探讨如何使用C#的DataGridView来实现类似Delphi中的StringGrid的功能。 Delphi是一款流行的面向对象的编程环境,它的StringGrid控件是一个二维表格,可以用于显示和编辑文本数据。它允许开发者...

    c++builder stringgrid类

    在C++Builder中,StringGrid类是一个非常实用且强大的组件,用于展示和操作表格数据。StringGrid通过结合列和行来表示数据,提供了一个直观的数据可视化方式。它不仅能够显示一系列按类别排列的值,还能作为时间表或...

    给StringGrid添加复选框

    通过以上步骤,你就能在StringGrid中成功添加复选框功能,使用户能够方便地进行多选操作。这个功能在数据筛选、任务管理等场景下非常实用。记得在实际应用中,根据具体需求调整代码,确保其适应你的项目。

    Delphi StringGrid文字居中,Titile字体变大,Cell添加CheckBox

    在这个主题中,我们将探讨如何实现StringGrid中的文字居中、调整Title的文字大小和颜色,以及在单元格中添加并操作CheckBox控件。 首先,让我们关注StringGrid的文字居中。在Delphi中,可以通过设置StringGrid的`...

    stringgrid拖动换行泛型

    在Delphi中,StringGrid(TStringGrid)是来自VCL(Visual Component Library)库的TGridPanel的子类,提供了一个方便的方式来显示和操作字符串数组。默认情况下,StringGrid的单元格内的文本如果太长会自动截断,而...

    delphi 在stringGrid控件中嵌入ComboBox

    在Delphi编程环境中,StringGrid控件是一种常用的用于显示二维数据的组件,它允许用户编辑、查看和操作表格数据。而ComboBox控件则提供了一个下拉列表,供用户从中选择一个选项。在某些情况下,我们可能希望在...

    Delphi在stringGrid控件中嵌入Combobox下拉框

    本教程将详细介绍如何在StringGrid中嵌入Combobox控件,以增强用户界面的可操作性和用户体验。 首先,我们需要了解StringGrid的基本使用。StringGrid是TStringGrid组件的实例,它继承自TDrawGrid,提供了文本编辑、...

    StringGrid DBGrid全书

    `StringGrid` 基本操作:删除、插入与排序 #### 2.1 删除操作 在 `TStringGrid` 中实现删除操作通常涉及到行或列的移除。 ##### 2.1.1 实现代码示例 ```pascal Procedure GridRemoveColumn(StrGrid: TStringGrid;...

    获得选中的StringGrid标题头

    - **键盘导航支持**:除了鼠标操作外,还应该支持键盘导航,例如使用箭头键移动焦点,并通过Enter键确认选择。 #### 总结 本文介绍了如何在Delphi或类似环境下使用`StringGrid`控件获取用户选择的标题列。通过对`...

    关于stringgrid

    在编程领域,StringGrid是...`.dcu`、`.dfm`和`.ddp`文件则是项目开发过程中的中间产物和配置文件,它们共同构成了这个StringGrid操作小程序的全部内容。通过这些文件,开发者可以进一步了解和分析程序的具体实现细节。

    stringgrid拖动换行

    首先,让我们了解一下StringGrid的基本操作。StringGrid是TGridPanel或TStringGrid组件,它继承自TDrawGrid,提供了网格布局,每个单元格可以包含文本或图像。默认情况下,StringGrid的单元格是不可编辑的,但可以...

    delphi7 stringgrid保存数据为csv格式,以及读取

    在Delphi7编程环境中,StringGrid控件是一个常用的表格显示组件,它允许开发者方便地处理二维数据。在一些场景下,我们可能需要将StringGrid中的数据保存为CSV(逗号分隔值)格式,或者从CSV文件中读取数据到...

Global site tag (gtag.js) - Google Analytics