DevExpress21中dxSpreadSheet控件学习全功能展示及完全汉化效果

链接:https://pan.baidu.com/s/1Nrw02Od4wyuAAghRdOhunw
提取码:ao7l


 源文件DevExpress21中dxSpreadSheet控件学习全功能展示及完全汉化效果

链接:https://pan.baidu.com/s/1GnxpzbX6cErrsxbs3hFSkA
提取码:asma

 


 基本操作与  dxRichEditControl控件学习(02) 类似,新功能如下:

01]添加公式栏
02]添加 保存 按钮
03]添加退出时保存
04]总体介绍
05] 两个隐藏 事件,不知道有什么用
06]转到工作表
07]最大行列数
08]读单元格
09]给单元格赋值

10]自定义函数

11]状态栏显示 求和 计数 平均


01]添加公式栏

  

拖一个 公式栏dxSpreadSheetFormulaBar1到界面上

设置dxSpreadSheetFormulaBar1的Align为alTop

       dxSpreadSheet1的Align为alClient


02]添加 保存  按钮

拖一个dxSaveFileDialog1到界面

procedure TForm10.dxBarLargeButton74Click(Sender: TObject);
begin
     dxSaveFileDialog1.FileName:='aaaa.xlsx'; //默认 文件名
         //保存
         if dxSaveFileDialog1.Execute then
         dxSpreadSheet1.SaveToFile(dxSaveFileDialog1.FileName);
end;

03]添加退出时保存

设置Form的OnCloseQuery事件为

复制代码
procedure TForm10.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  case application.MessageBox('确定退出dxSpreadSheet1,是否保存?', '询问', 35) of
    6:      begin
        // 保存
        dxSaveFileDialog1.FileName := 'aaaa.xlsx';
        if dxSaveFileDialog1.Execute then
          dxSpreadSheet1.SaveToFile(dxSaveFileDialog1.FileName);
        // 退出
        CanClose := true;
      end;
    7:      begin
        // 不保存,退出
        CanClose := true;
      end;
    2:       begin
        // 取消 关闭  ,返回 dxSpreadSheet1
        CanClose := false;
      end;
  end;
end;
复制代码

 


04]总体介绍

TdxSpreadSheet基本上还原了EXCEL的基本功能,用户可以像EXCEL一样正常操作这个控件,比如控件下ctrl+1也能调出单元格属性设置.

另外,就算用户电脑上没有安装EXCEL,程序依然能够正常运行.

简单编辑时用着还行,代码操作的太复杂的话就算了,不建议使用.

dxSpreadSheet1.SheetCount : 工作表总数

dxSpreadSheet1.AddSheet('新工作表'): 插入新工作表,名称为'新工作表'

dxSpreadSheet1.Sheets[0].Caption: 第一个工作表的名称

dxSpreadSheet1.ActiveSheet.caption: 正在编辑(激活)的工作表的名称.

dxSpreadSheet1.Sheets[1].Active:=True 激活第二个工作表(前提是有第二个表,否则出错)

dxSpreadSheet1.ActiveSheetIndex:= 1 作用和上一条相同.


05] 两个隐藏 事件,不知道有什么用。 

dxSpreadSheetSetLandscapePageOrientation1

dxSpreadSheetSetPortraitPageOrientation1


06]转到工作表

 

 

procedure TForm10.dxBarEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin // 输入表名,再敲回车,  转到工作表
  if Key = VK_RETURN then
    dxSpreadSheet1.GetSheetByName(dxBarEdit1.Text).Active := true; //dxBarEdit1.Text表名要存在,否则会报错
end;

 07]最大行列数

 

 


08]读单元格

  // 读取值,都要首先判断单元格是否为空,如果为空的话,读会出问题.
  if dxSpreadSheet1.ActiveSheetAsTable.Cells[1, 1] <> nil then
    // 获取B2单元格的值. ( A1坐标为   [0,0]   ),和取数据库数据一样,要注意数据类型.
    showmessage(dxSpreadSheet1.ActiveSheetAsTable.Cells[1, 1].AsString);

09]给单元格赋值

复制代码
procedure TForm10.dxBarEdit4KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  newCell: TdxSpreadSheetCell;
begin
  if Key = VK_RETURN then
  begin
    newCell := dxSpreadSheet1.ActiveSheetAsTable.Cells[1, 1];
    // 写入值时,都要首先判断单元格是否为空,如果为空的话,先新建
    if newCell = nil then
      newCell := dxSpreadSheet1.ActiveSheetAsTable.CreateCell(1, 1);
    newCell.AsString := '新单元格内容';
  end;
end;
复制代码

10]自定义函数  参考 https://www.cnblogs.com/usegear/p/15414686.html

三大步:

1 resourcestring
  sTriangleArea = 'TriangleArea';  //新函数名

implementation

{$R *.dfm}

uses
  dxSpreadSheetCoreFormulasTokens
2

//声明有三个参数,及类型

procedure fpiTriangleArea(var AParamCount: Integer; var AParamKind: TdxSpreadSheetFunctionParamKindInfo);
begin  
  AParamCount := 3 //这里改
  SetLength(AParamKind, AParamCount);
  AParamKind[0] := fpkValue;
  AParamKind[1] := fpkValue;
  AParamKind[2] := fpkValue; 

  //这里要添加 参数

end;

3 procedure fnTriangleArea(Sender: TdxSpreadSheetFormulaResult; const AParams: TdxSpreadSheetFormulaToken);
var
  P1, P2, P3: Variant;
begin
  if Sender.GetParamsCount(AParams) <> 3 then  //这里改 参数
    Sender.SetError(ecValue)
  else
    if Sender.ExtractNumericParameter(P1, AParams,0) then
      if Sender.ExtractNumericParameter(P2, AParams, 1) then
        if Sender.ExtractNumericParameter(P3, AParams, 2) then  //这里要添加 参数
          Sender.AddValue(0.5 * P1 * P2 * SIN(P3 * Pi / 180));  //公式在 这里
end;
4

注册:

procedure TForm10.FormCreate(Sender: TObject);
begin
    dxSpreadSheetFunctionsRepository.Add(@sTriangleArea, fnTriangleArea, fpiTriangleArea, frkValue, 2048, ftMath);
end;

5

如此,你就可以在表格中,可直接插入使用公式.

添加一个 函数参数


11]状态栏显示 求和 计数 平均

dxSpreadSheet1添加dxSpreadSheet1MouseUp事件

  

复制代码
procedure TForm1.dxSpreadSheet1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  SumResult,CountResult,numCount: Integer;
  aAvg: double;
  iSelect,m,n:integer;
begin
  SumResult := 0;
  numCount:=0;
  CountResult:=0;
  aAvg:=0;
for iSelect := 0 to dxSpreadSheet1.ActiveSheetAsTable.Selection.Count -1 do begin     //多个选择区域
  for m:= dxSpreadSheet1.ActiveSheetAsTable.Selection[iSelect].Top    to   dxSpreadSheet1.ActiveSheetAsTable.Selection[iSelect].Bottom   do
    for n := dxSpreadSheet1.ActiveSheetAsTable.Selection[iSelect].left to dxSpreadSheet1.ActiveSheetAsTable.Selection[iSelect].Right do
  begin
    if (dxSpreadSheet1.ActiveSheetAsTable.Cells[m, n] <> nil)   then begin
       CountResult:=CountResult+1;
       if (dxSpreadSheet1.ActiveSheetAsTable.Cells[m, n].IsNumericValue)     then  begin
         SumResult := SumResult + dxSpreadSheet1.ActiveSheetAsTable.Cells[m, n].AsInteger;
         numCount:=numCount+1;
       end;
     end;
  end;
 end;

 if numCount>0 then    aAvg:= SumResult / numCount;
 dxRibbonStatusBar1.Panels[0].Text:=
'求和:'+inttostr( SumResult)+'  计数:'+inttostr( CountResult)+'  平均:'+ floattostr(aAvg);

end;
复制代码