2010-09-01 09:39:39| 分类: LabWindows/CVI专 | 标签:int flextable void null 控件 |举报 |字号大中小 订阅
FlexCell控件另一个比较强的特点是支持多种文件格式,这节我们来正式开始使用该控件。
我做了个类似FlexCell控件自带演示程序的界面,使用CVI来使用实现该控件的所有操作。
1、添加菜单
从本节开始,我们将全面进行该控件的操作。菜单的制作方法我这里就不再说明,不知道的朋友可以参考我的视频教程,其中有菜单制作的所有过程。
2、格式说明
FlexCell控件支持自己格式的导入导出(.Cel)。XML文件的导入。EXCEL格式的导出,HTML格式的导出,XML格式的导出,CSV文件的导出。可以发现控件不能支持读取EXECL文件是一个比较遗憾的地方。所有的这些功能控件都已经为我们封装好了函数,无需我们CVI来操心。
//新建文件
void CVICALLBACK NewFile (int menuBar, int menuItem, void *callbackData,
int panel)
{
int Row,Colunm;
//得到当前行列数
FlexCell__GridGetRows (FlexTable, NULL, &Row);
FlexCell__GridGetCols (FlexTable, NULL, &Colunm);
FlexCell__GridNewFile (FlexTable, NULL, NULL);
//设置行列数
FlexCell__GridSetRows (FlexTable, NULL, Row);
FlexCell__GridSetCols (FlexTable, NULL, Colunm);
}
函数名称大家可以自己修改。这个函数比较有用,当你的控件已经进行了大量的读取和赋值后此时如果要清除所有单元格中的数据我们上一节使用过这种方法:
//设置为100行
FlexCell__GridSetRows (FlexTable, NULL, 101);
//选择处理的行列范围
FlexCell__GridRange (FlexTable, NULL, 1, 1, 100, 10, FlexTableRange);
//删除现有行
FlexCell__RangeDeleteByRow (FlexTableRange, NULL);
//添加新的100行
FlexCell__GridSetRows (FlexTable, NULL, 101);
我们先心中当前所有的单元格,将它们删除,然后再添加同样的行数。这个方法在行列数多时会极大影响速度。现在我们使用控件提供的新建文件的方法来实现。
FlexCell__GridNewFile (FlexTable, NULL, NULL);这个函数不需要任何其它参数,给出控件的CA对象句柄即可。此时大家可以看到控件马上恢复为添加控件时初始状态。但是这样做会自己恢复为控件默认的5列10行。这和我们在CVI定义的100行10列不一样。每个用户也都有自己的初始数量。因此,我们在使用该函数前先得到下目前控件的行列数量,在新建文件后马上设置回来。这里的新建文件和WORD中新建文件是一样的,它之所以就像清除所有单元格是因为该控件是一个单文档界面,所以新建文件就等于清除了现在的内容直接显示为一个新的表格。在多文档形式中这样新建会出现一个新的窗口,当前的窗口内容没有变化。
//打开文件
void CVICALLBACK OpenedFile (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridOpenFile (FlexTable, NULL, "", NULL);
}
该控件给我们高度封装了很多函数,我们后面使用的函数都是如此,这个打开文件的函数也不给任何参数,给了一个空字符串,函数定义如果给的是空字符串函数会自己先调用API的打开文件对话框(CVI中函数为FileSelectPopup)电你选择好需要打开的文件后函数自己处理将你选中的文件打开。省去了我们CVI打开文件的很多代码。当然你可以直接给函数传递一个文件路径“c:\\1.txt"。注意该函数打开的文件只能是CEL文件(控件自己的格式)。且为十六进制加密文件。一般不能破解。
//保存文件
void CVICALLBACK SaveFile (int menuBar, int menuItem, void *callbackData,
int panel)
{
char *FileName;
//得到文件路径
FlexCell__GridGetFilename (FlexTable, NULL, &FileName);
if (strlen(FileName)==0)//如果是新文件
{
FlexCell__GridSaveFile (FlexTable, NULL, "",NULL );
}
else//如果是打开的文件
{
FlexCell__GridSaveFile (FlexTable, NULL, FileName,NULL );
}
}
保存文件也可以直接使用一个函数,传递空字符串,函数会先打开一文件保存对话框。这里我们不能这样使用,因为我们有两种情况:一个新文件、一个打开的文件。所以要分别对待。对于新文件我们可以直接使用FlexCell__GridSaveFile (FlexTable, NULL, "",NULL );对于已经打开的文件我们应该直接保存在该文件中。
FlexCell__GridSaveFile (FlexTable, NULL, FileName,NULL );控件为我们提供了一个函数来得到上次打开或保存的文件路径FlexCell__GridGetFilename (FlexTable, NULL, &FileName);如果我们打开了一个"c:\1.txt"这个字符串会保存到GridGetFilename中。如果新建的文件,就返回空字符串。
//另存为文件
void CVICALLBACK SaveAsFile (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridSaveFile (FlexTable, NULL, "",NULL );
}
//导入XML文件
void CVICALLBACK ImportFile (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridLoadFromXML (FlexTable, NULL, "", NULL);
}
//导出EXCEL文件
void CVICALLBACK ExportXLS (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridExportToExcel (FlexTable, NULL, "", VTRUE, VTRUE, NULL);
}
//导出CSV文件
void CVICALLBACK ExportCSV (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridExportToCSV (FlexTable, NULL, "", VFALSE, VFALSE, NULL);
}
//导出XML文件
void CVICALLBACK ExportXML (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridExportToXML (FlexTable, NULL, "", NULL);
}
//导出HTML文件
void CVICALLBACK ExportHTML (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridExportToHTML (FlexTable, NULL, "", NULL);
}
这些函数同样不需要给任何其它参数,传递空字符串,函数自己打开一个对话框选择文件。
//打印设置
void CVICALLBACK PageSet (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridPrintDialog (FlexTable, NULL, NULL);
}
//打印预览
void CVICALLBACK PrintView (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridPrintPreview (FlexTable, NULL, CA_DEFAULT_VAL);
}
//打印
void CVICALLBACK PrintOut (int menuBar, int menuItem, void *callbackData,
int panel)
{
FlexCell__GridDirectPrint (FlexTable, NULL, CA_DEFAULT_VAL, NULL);
}
我们WORD中常用的打印功能也这样使用,大家知道在CVI中实现这样的功能不是一行函数就能完成的。现在大家就可以编译程序,来使用下我们只写了十几行代码就完成的Windows主要文件菜单功能。
结论:控件提供的文件操作函数十分强大,都不用我们关心实现流程。唯一遗憾的是不能直接打开XLS文件。不然完全可以写个基础版EXCEL程序。
摘自http://du520xi.blog.163.com/blog/static/8471920320108193939401/
附上VS2010/mfc 个人研究成果:
int Row,Colunm; //行/列
FLEX.put_Rows(20);
FLEX.put_Cols(8);
Row = FLEX.get_Rows();
Colunm = FLEX.get_Cols();
//打开文件
FLEX.OpenFile("F://wtlamfile//VS.file//flex//Debug//file.cel");
//设置单元格内容
CCell(FLEX.Cell(5,1)).put_Text("world");
CCell(FLEX.Cell(5,1)).put_
//保存文件
FLEX.SaveFile("file.cel");
//打印设置
FLEX.PrintDialog();
//打印
FLEX.DirectPrint((_variant_t)1);
//导出为excel表格
FLEX.ExportToExcel("F://wtlamfile//VS.file//flex//Debug//0001.xls",NULL,NULL);