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]给单元格赋值
拖一个 公式栏dxSpreadSheetFormulaBar1到界面上
设置dxSpreadSheetFormulaBar1的Align为alTop
dxSpreadSheet1的Align为alClient
拖一个dxSaveFileDialog1到界面
procedure TForm10.dxBarLargeButton74Click(Sender: TObject); begin dxSaveFileDialog1.FileName:='aaaa.xlsx'; //默认 文件名 //保存 if dxSaveFileDialog1.Execute then dxSpreadSheet1.SaveToFile(dxSaveFileDialog1.FileName); end;
设置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;
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 作用和上一条相同.
dxSpreadSheetSetLandscapePageOrientation1
dxSpreadSheetSetPortraitPageOrientation1
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;
// 读取值,都要首先判断单元格是否为空,如果为空的话,读会出问题. if dxSpreadSheet1.ActiveSheetAsTable.Cells[1, 1] <> nil then // 获取B2单元格的值. ( A1坐标为 [0,0] ),和取数据库数据一样,要注意数据类型. showmessage(dxSpreadSheet1.ActiveSheetAsTable.Cells[1, 1].AsString);
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); //这里要添加 参数 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); |
5 |
如此,你就可以在表格中,可直接插入使用公式. |
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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具