advstringgrid 使用

来源:互联网 发布:酷屏软件 编辑:程序博客网 时间:2024/05/22 13:36
  1. 把AdvStringGrid第1行,1-10列合并为一个单元格
  2. 在这合并的单元格里放置一个panel1,并把panel1设置为AdvStringGird1的CellControl
    AdvStringGrid1.CellControls[10,1]:=Panel1;
    这时的效果为:

TAdvStringGrid是Delphi编程中常用的控件,经常用于统计数据和设计比较复杂的表格。控件功能很强大,但相应的使用也很复杂!
  以下是我整理出的常用技巧,有一部分是我自己的经验,有一部分是网上搜的别人的总结,有一部分整理了,有一部分没有整理;有一部分测试了,有一部分没有经过测试~呵呵,但都是我手工编辑的啊。(部分示例过程是用于创建和设置动态Cells的过程,如果不理解请参考我总结的另一篇文章<完美动态TAdvStringGrid(cells)一例>)
  常用属性设置
  — 
Options—goEditing:是否可以编辑
Options—goTabs:控制是否可用TAB键将光标移到下一CELL
Option—goColSizing/RowSizing=true:设置列宽/行高可调整
Navigation—AlwaysEdi=true:进入单元格时自动变成编辑状态
Navigation—AdvanceOnEnter=true:回车时自动移到下一个CELL
Navigation—AdvancelInsert:控制当光标在最后一个CELL时是否可以按回车插入新行
Navigation—AllowDeleteRow:控制是否按DELETE键删除当前行
Navigation—AppendOnArrowDown:控制按下箭头是否可以新增一行(未找到这个属性)
MouseActions—RowSelect/ColSelect=true :选择整行/选择整列
Navigation—AutoComboDropSize=true组合框下拉框展开宽度自动设置
MouseActions—DirectComboDrop=True组合框进入时自动展开
(点击鼠标时直接进入编辑,或允许、不允许改变行或列宽等特性,都可以在MouseActions中设置。)
AutoNumAlign:=True则数字类型数据在CELL里会自动右对齐
AutoNumberCol(n);自动在第n列按顺序显示数字,即1,2,3……
AutoSize:=true :自动设置列宽,不推荐使用,自动调整后,真的很难看。
EnableWheel:=true :一次滚动多行,EnableWheel:=False时,一次滚动一行。
SearchFooter—Visible:=TRUE时,会在ADVStringGrid的底部显示出搜索框(未找到属性)
FloatingFooter—Visible:为TRUE时,即在ADVStringGrid底部显示求和列,要想让求和列显示小数,还需要将FloatFormat属性设置为:%g(未找到属性)
(自动换行到新追回行:必须在onCellValidate过程中执行strGrid.AddRow;可以同时加一些赋值语句。)
(当合并行后,如果想使文字垂直居中,可以先设置ADVStringGrid的 MultilineCells 设置为 True,然后在文字前面加 #13 换行来实行)
(改变固定列的显示样式:ControlLook——FixedGradientFrom(起始色)——FixedGradientFrom(结束色)
  +++
  用过程设置相关属性
  —
1,设定单元表各列是否可以编辑: 首先在设置属性:Options—goEditing=true;然后,在CanEditCell事件中设定。
procedure TForm50.stgPartListCanEditCell(Sender: TObject; ARow, ACol: Integer; var CanEdit: Boolean);
Var
I:integer;
begin
if (stgPartList.cells[cC1Data_Flag,ARow]=”) or (stgPartList.cells[cC1Data_Flag,ARow]=’C’) then begin
canEdit:=false;
exit;
end else begin
for I:=0 to cColQty1 do begin
if ACol=I then begin
if stgPartList.cells[cC1Data_Flag,aRow]=’C’ then CanEdit:=false
else begin
if cColProp1[I,1]=’Y’ then CanEdit:=true; //cColProp1:列属性数组,下同
if cColProp1[I,1]=’N’ then CanEdit:=False;
end;
end;
end;
end;
end;
2,设定单元表各列对齐方式: 在GetAlignment事件中设定。
procedure TForm1.strGrid1GetAlignment(Sender: TObject; ARow, ACol: Integer; var AAlignment: TAlignment);
Var
I:integer;
begin
//直接定义
{if ARow=0 then AAlignment:=tacenter
else begin
case ACol of
0: AAlignment:=taRightJustify;
1: AAlignment:=taCenter;
//2: AAlignment:=taCenter;
3: AAlignment:=taRightJustify;
4: AAlignment:=taCenter;
6: AAlignment:=taCenter;
8: AAlignment:=taCenter;
9: AAlignment:=taCenter;
else AAlignment:=taLeftJustify;
end;
end; }
//用属性数组定义
if ARow=0 then AAlignment:=taCenter
else begin
for I:=0 to xpColQty1-1 do begin
if ACol=I then begin
//case strToInt(xaColProp1[I,4])
if xaColProp1[I,4]=’C’ then AAlignment:=taCenter;
if xaColProp1[I,4]=’L’ then AAlignment:=taLeftJustify;
if xaColProp1[I,4]=’R’ then AAlignment:=taRightJustify;
end;
end;
end;
{//以下代码不明,此过程没有HAlign,VAlign
HAlign := taCenter;
VAlign := vtaCenter;}
end;
  3,改变单元格的背景色,可在OnGetCellColor事件中写代码实行(前提需将FLAT设置为TRUE)/设定Grid颜色:在GetCellColor事件中设定:
procedure TForm50.stgPartListGetCellColor(Sender: TObject; ARow,
ACol: Integer; AState: TGridDrawState; ABrush: TBrush; AFont: TFont);
Var
I:integer;
begin
{if stgPList.Cells[cNCols1[3]-2,ARow]=’1’ then
abrush.Color:=clScrollBar
else begin
if (ARow=0) or (ACol=0) then
abrush.Color:=clBtnFace
else begin
if ACol=cNCols1[2]-2 then
abrush.Color:=clwindow
else
abrush.Color:=clinfoBK;
end;
end;}
if ARow=0 then
abrush.Color:=clBtnFace
else begin
for I:=0 to cColQty1 do begin
if ACol=I then abrush.Color:=StringToColor(cColProp1[I,5]);
end;
end;
{if ARow=0 then begin //如果不加这一句,则是以下对应的整列,我这里是只改变固列,所以要把ARow设为0
Case ACol of
1: ABrush.Color:=RGB(227,249,248);
2: ABrush.Color:=RGB(250,232,193);
3: ABrush.Color:=RGB(227,249,248);
4: ABrush.Color:=RGB(250,232,193);
12: ABrush.Color:=RGB(227,249,248);
14: ABrush.Color:=RGB(250,232,193);
24: ABrush.Color:=RGB(227,249,248);
48: ABrush.Color:=RGB(250,232,193);
51: ABrush.Color:=RGB(227,249,248);
End;
END;}
end;
  4,设置Grid中列特殊类型,某一列的数据格式,预定义的格式有:
  enum TEditorType { edNormal, edSpinEdit, edComboEdit, edComboList, edEditBtn, edCheckBox, edDateEdit, edDateEditUpDown, edTimeEdit, edButton, edDataCheckBox, edNumeric, edPositiveNumeric, edFloat, edCapital, edMixedCase, edPassword, edUnitEditBtn, edLowerCase, edUpperCase, edFloatSpinEdit, edTimeSpinEdit, edDateSpinEdit, edNumericEditBtn, edFloatEditBtn, edCustom, edRichEdit, edNone, edUniEdit, edUniComboEdit, edUniComboList };
  通过OnGetEditorType()事件进行设置,例如:
procedure TForm1.strGrid1GetEditorType(Sender: TObject; ACol, ARow: Integer; var AEditor: TEditorType);
  switch (aCol)
    case 1:aEditor=edComboList; break;  //设置第一列为ComboBox类型输入
    case 2:aEditor=edEditBtn; break;  //设置第二列为EditBtn类型输入,弹出一个选择框
    case 3:aEditor=edSpinEdit; break;  //设置第三列为SpinEdit类型输入
    case 4:aEditor=edDateEdit; break;  //设置第四列为日期型输入,弹出DatetimePicker。
end;
5,增加edComboEdit和edComboList的下拉列表:
方法:
TAdvStringGrid:: ClearComboString(void); //清除已有了下拉列表
TAdvStringGrid:: AddComboString(AnsiString S);
TAdvStringGrid::Combobox->Sorted = true;
通过Combobox可以访问内置的Combo类型的控件的属性和方法。
如果列为组合框时,在此处同时设置下拉列表内容,以下为设置多个组合框时代码:
{procedure TForm1.strGrid1GetEditorType(Sender: TObject; ACol,
ARow: Integer; var AEditor: TEditorType);
Var
I,J:integer;
begin
for I:=0 to xpColQty1-1 do begin
if ACol=I then begin
if Copy(xaColProp1[I,5],1,1)=’C’ then begin
AEditor:=edComBoEdit;
if ACol=xpC1STATUS then begin //如果为状态列(xp1XXXX:声明的 列号,下同)
strGrid1.ClearComboString;
for J:=0 to xpQMS_Status-1 do begin
if copy(xaRMS_Status[J],1,1)<>’C’ then //xaRMS_XXX:各项组合框选项值数组,下同
strGrid1.AddComboString(xaRMS_Status[J]);
end;
end;
if ACol=xpC1Operation_MODE then begin
strGrid1.ClearComboString;
for J:=0 to xpQMS_OpMode-1 do begin
strGrid1.AddComboString(xaRMS_OpMode[J]);
end;
end;
if ACol=xpC1FROM_DEPT then begin
strGrid1.ClearComboString;
for J:=0 to xpQMS_WH-1 do begin
strGrid1.AddComboString(xaRMS_WH[J]);
end;
end;
end;
end;
end;
end;}
  6.增加edCheckBox界面处理/AdvStringGrid插入checkbox列
设置:advstringgrid–>option–>goEditing=true
advstringgrid–>enableGraphics=true
在from create事件中加入
for i:=1 to advstringgrid.rowcount-1 do
advstringgrid.AddCheckBox(1,i,false,false); //其中1表示所在列数
使用时要声明变量bCheck
var bCheck:boolean;
读取状态:
for I:=1 to stgPartList.RowCount-1 do begin
stgPartList.GetCheckBoxState(cC1Issue_Flag,I,bCheck); //取得状态,赋给变量bCheck
if (bCheck=true) then begin
end;
end;
设定状态:
for I:=1 to stgPartList.RowCount-1 do begin
if pFlag=true then begin
stgPartList.SetCheckBoxState(cC1Issue_Flag,I,true); //设为选中状态
end else begin
stgPartList.SetCheckBoxState(cC1Issue_Flag,I,false); //设为清空状态
end;
end;  
  {在Grid中数据载入之后,使用:
TAdvStringGrid:: void __fastcall AddCheckBox(int ACol, int ARow, bool State, bool Data)方法来添加CheckBox界面处理.
例如:
for(i=1;iRowCount;i++)
editgrid->AddCheckBox(5,i,FALSE,FALSE);}
+++以下未测试
7、如果在录入的过程中,要对某列做格式化,比如保留几位小数,可用ADVStringGrid的GetFloatFormat事件中操作。比如:
procedure Tfrm_dingdan.strgridGetFloatFormat(Sender: TObject; ACol,
ARow: Integer; var IsFloat: Boolean; var FloatFormat: String);
begin
case ACol of
4: floatformat:=’%.0f’; //第4列保留0位小数
5: floatformat:=’%.3f’; //第5列保留3位小数
6: floatformat:=’%.6f’; //第6列保留6位小数
7: floatformat:=’%.5f’; //第7列保留5位小数
end;
end;
8,怎样实现AdvStringGrid的列宽自动按内容调整?怎样实现AdvStringGrid的列宽自动按列标题宽度调整?autosize属性的作用是什么?
autosize,可以根据内容调整列宽。
自动按标题列调整,自己在其RESIZE事件里对COLWIDTHS[I]赋值就行了。
procedure AutoSizeColumns(const DoFixedCols: Boolean; const Padding: Integer);
例:AdvStringGrid1.AutoSizeColumns(False,16);
AdvStringGrid1.AutoSizeColumns(False,16);
第一参数:是否为固定列;第二个参数,文字后面留的空格数
所有单元格自动调整,由第一个参数设置是否含固定单元,
如要固定行折行显示应将其行高设为自动调整即:
AdvStringGrid1.AutoSizeRow(0);
9、如何在AdvStringGrid中为每个单元格内的字体定制颜色
在OnDrawCell事件(看名字这个控件应该有这个事件把,呵呵!)写如下代码:
(Sender as TAdvStringGrid).Canvas.Font.Color:=clNavy;
十五、Options—goRangeSelect:控制是否可以选择多行,goRowSelect控制选中整行、AdvStringGrid做多表头,在onIsFixedCell事件中返回true的就是表头
4、stringGrid中的行或列和并
grdList.MergeCells(0,0,2,2);
grdList.Cells[0,0]:=’123456’;
advstringgrid.mergecol(3,4);
advstringgrid..MergeCells(0,0,2,2);
5、
with advStringGrid1 do //引用单元格时, 列数在前,行数在后.
MergeCells(0,0,1,3);
//合并单元格.前两参数为列数行数. 后两参数分别为要合并的列数和行数
Cells[1,0] := Format(‘分度线( %s )’,[m_sMeasureRangeUnit]);;
MergeCells(3,JieDianStart - 1,1,1);
Cells[3,JieDianStart - 1] := ‘动作方式’;
ColWidths[3] := ColWidths[3] + 10;
Colors[3,JieDianStart - 1] := FixedColor;
FontNames[3,JieDianStart - 1] := FixedFont.Name;
FontSizes[3,JieDianStart - 1] := FixedFont.Size;
FontStyles[3,JieDianStart - 1] := FixedFont.Style;
+++以下未整理
  7.TAdvStringGrid中每一种格式的输入与输出都要对应,否则载入时不能识别(因为各种类型的文件之间存储格式是不一样的)。例如:
  如果保存时使用TAdvStringGrid::SaveToFile(),那么载入时就要相应的使用TAdvStringGrid::LoadFromFile();其它对应如下:
TAdvStringGrid:: LoadFromBinFile();??TAdvStringGrid:: SaveToBinFile();TAdvStringGrid:: LoadFromCSV ();??TAdvStringGrid:: SaveToCSV();等等。
  8.通过TAdvStringGrid:: SpinEdit对象,可以访问内置的SpinEdit类的特性;
  同样的道理,通过其它一些内置的对象,可以访问这些类的属性,执行这些类的方法。
  9.TAdvStringGrid中的排序问题:
  首先设置排序参数:通过TAdvStringGrid:: SortSettings属性(发布TSortSettings类为一个属性),通过这个属性设置
然后调用TAdvStringGrid::QSort()方法应用SortSettings。
排序方向: SortSettings-> Direction=enum {sdAscending, sdDescending};
排序列:SortSettings->Column = 3;
  10.多行显示
  bool TAdvStringGrid:: Multilinecells属性,是否支持多行显示,如果支持的话,可以用”#13”作为分隔符插入多行字符串,用多行显示。
折中的方法,可以用WordWrap来支持多行显示
  一般在设置和取消多行显示时,同时,对TAdvStringGrid::DefaultRowHeight进行设置,将有良好的效果。
  11.欲设置某些行或列为Fixed风格的显示,使用OnIsFixedCell()事件句柄来处理,调用TAdvStringGrid:: Repaint()方法来使设置生效。
例如:
If(colfix->Checked) { //colfix为一个TCheckBox
AdvStringGrid1->Repaint();
}
//事件处理句柄
void __fastcall TForm1::AdvStringGrid1IsFixedCell(TObject *Sender,
int Arow, int Acol, bool &isfixed)
{
if ((Acol==3) && (colfix->Checked))
isfixed=TRUE; else isfixed=FALSE;
}
  12.处理显示风格,如添加货币前缀和物理量单位
  在TAdvStringGrid::OnGetFormat()事件处理句柄中处理。
aPrefix参数设置显示前缀;
aSuffix参数设置显示后缀;
AStyle参数enum TSortStyle { ssAutomatic, ssAlphabetic, ssNumeric, ssDate, ssAlphaNoCase, ssAlphaCase, ssShortDateEU, ssShortDateUS, ssCustom, ssFinancial, ssAnsiAlphaCase, ssAnsiAlphaNoCase, ssRaw, ssHTML, ssImages, ssCheckBox, ssUnicode };设置排序风格;
  13.是否能对特定的单元格进行编辑
用TAdvStringGrid::OnCanEit()事件句柄来处理,
设置bool &canedit参数来达到能否编辑某些单元格的效果
  14.隐藏和显示某些单元格
TAdvStringGrid:: UnHideColumn(int ACol)
TAdvStringGrid::HideColumn(int ACol);
  15.查找的实现:
TAdvStringGrid::Find()
TAdvStringGrid::FindNext();
两个方法返回TPoint类型,
Find()需要一个TFindParams类型的参数,enum TFindParameters { fnMatchCase, fnMatchFull, fnMatchRegular, fnDirectionLeftRight, fnMatchStart, fnFindInCurrentRow, fnFindInCurrentCol, fnIncludeFixed, fnAutoGoto, fnIgnoreHTMLTags, fnBackward, fnIncludeHiddenColumns };可通过自己设计一个查找窗体来实现。
例如:
//———-findfirst———-
void __fastcall TForm1::Findfirst1Click(TObject *Sender)
{
TFind *Find;
TFindParams findparams;
TPoint res;
Find = new TFind(Form1);
if (Find->ShowModal()==mrOk)
{
if (Find->chkcase->Checked) findparams << fnMatchCase;
if (Find->chkfull->Checked) findparams << fnMatchFull;
if (Find->chkregular->Checked) findparams << fnMatchRegular;
if (Find->dir->ItemIndex==1) findparams << fnDirectionLeftRight;
if (Find->where->ItemIndex==1) findparams << fnFindInCurrentCol;
if (Find->where->ItemIndex==2) findparams << fnFindInCurrentRow;
res = AdvStringGrid1->FindFirst(Find->findtext->Text,findparams);
if (res.x>=0)
{
AdvStringGrid1->Col=res.x;
AdvStringGrid1->Row=res.y;
}
else
ShowMessage(“Text not found”);
}
delete Find;
}
//———-findnext———-
void __fastcall TForm1::Findnext1Click(TObject *Sender)
{
TPoint res;
res = AdvStringGrid1->FindNext();
if ((res.x>=0) && (res.y>=0))
{
AdvStringGrid1->Col=res.x;
AdvStringGrid1->Row=res.y;
}
else
ShowMessage(“Text not found”);
}
//———-
  16.TAdvStringGrid:: Ints[int ACol][int ARow]以Integer类型的值来访问单元格,如果读取失败,会触发异常.
  18.
  (1).添加图标:TAdvStringGrid::AddIcon();
原型:void __fastcall AddIcon(int ACol, int ARow, Graphics::TIcon *aicon, TCellHAlign hal, TCellVAlign val)
  (2).添加旋转字体:TAdvStringGrid:: AddRotated;
原型:void __fastcall AddRotated(int ACol, int ARow, short AAngle, AnsiString s);
  (3).从ImageList中取出图象添加到单元格中:TAdvStringGrid:: AddImageIdx;
原型:void __fastcall AddImageIdx(int ACol, int ARow, int Aidx, TCellHAlign hal, TCellVAlign val);
参数Aidx为图片在ImageList中的索引.
  (4).向单元格中添加位图:TAdvStringGrid:: AddBitmap;
原型:void __fastcall AddBitmap(int ACol, int ARow, Graphics::TBitmap *ABmp, bool Transparent, TCellHAlign hal, TCellVAlign val);
参数bool Transparent设置是否显示透明.
  (5).自动添加编号:AutoNumberCol
TAdvStringGrid:: AutoNumberCol(int ACol)方法,对指定的列从1进行编号,不对Fixed行中的列编号;
用途:用于产生首列的自动编号。
  (6).向单元格中添加多个图象:TAdvStringGrid::AddMultiImage
  原型:void __fastcall AddMultiImage(int ACol, int ARow, int Dir, TCellHAlignhal, TCellVAlign val);
  事实上只是向系统声明一下,这个单元格将放置多个图象,图象的添加通过GridImages来添加。例如:
AdvStringGrid2->AddMultiImage(5,1,0,haBeforeText,vaCenter);
AdvStringGrid2->CellImages[5][1]->Add(0);
AdvStringGrid2->CellImages[5][1]->Add(1);
  (7).如果TAdvStringGrid:: EnableHTML属性启用,那么,单元格中输入HTML源代码,它将以HTML格式显示出来,例如:
AdvStringGrid2->Cells[7][1]=”Easy HTML
formatting”;
AdvStringGrid2->Cells[7][2]=”Including

0 0