C++Builder 程序员博客
31 Aug
iResult = FindFirst(OPDialog->ST->SelectedPathName + "\\*.*",faAnyFile,SearchRec); while(iResult == 0) { CapitalChar = SearchRec.Name.UpperCase().SubString( (SearchRec.Name.Length() - 2), 3); if ( CapitalChar == "JPG" || CapitalChar == "BMP" ) { Count++; } iResult = FindNext(SearchRec); }
如何保存查找到的文件名?
动态数组还是Tlist,那个效率更高点,或者还有更好的方法?
iResult->SaveToFile("*.txt");
嗯 TStringList保存字符串到文本比较方便
不是保存到文件,而是保存在内存里,以便接下来的函数使用
问题是怎么顺序读出?我看了一下,只能给每个字符串加一个names,然后才能用names作为索引读出,很麻烦。
不加names时可用
TStringList->operator [](i)
以顺序数字为索引读出字符串….
给分吧……..
26 Aug
为什么保存的文本文件第一行自动是“Memo1”啊
这行能不能去掉?
另,SaveDialog1的Filter怎么限定为txt文本文件
SaveDialog1->Filter="Text files (*.txt) ¦*.txt";
上面这种写法貌似不行
因为Memo一拖上去就自动会有“Memo1”的文本在里面,你需要先把它从Memo里清除;
SaveDialog1->Filter="Text files (*.txt) ⦪.txt"; 应该是行的啊
或者直接设定 SaveDialog1->DefaultExt="txt"; 也是可以的
感谢2位
20 Aug
我本来打开Acess建立了一个数据库,里面包含3张表。通过ADOquery,datasource,以及DBEdit等控件,可以实现对数据库里面表格的各种操作。但是,我现在需要点击新建按钮,新建我已建立好的3张空白表格模板,然后对表格进行操作后保存该表格。下次可以通过打开控件,打开该已经更改后的表格。同时也可以按新建按钮,生成另外一个空白数据库。
请问如何实现数据库的新建、保存和打开的相关功能呢?
请各位告诉帮忙,谢谢
我试试,谢谢
Access数据库本来就是一个文件,你可以手工建立好后放在应用的某个目录下,新建的时候可以只是简单的复制那个mdb文件为另一个文件就可以了,打开的时候可以用一个“打开对话框”去选择文件或者保存在配置文件里面的,更好些的是可以另外建立一个用户数据库(只有用户表,含用户名、密码,数据库文件路径)来管理
上面是BCB5。0时的程序,在6。0下,AnsiString要改成WIdeString,
否则显示变量类型不对!
void CreateAccess(String mdb,String psw)
{
if (!FileExists(mdb))
{
WideString s="Provider=Microsoft Jet 4.0 OLE DB Provider";
WideString s2="Jet OLEDB:Database Password="+psw;
Variant AdoObj=Variant::CreateObject("ADOX.Catalog");
AdoObj.OleProcedure("Create",
s+";"+"Data Source="+mdb+";"+s2);
AdoObj.Clear();
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CreateAccess("d:\\test.mdb","");
}
谢谢
4LZJ
上面是BCB5。0时的程序,在6。0下,AnsiString要改成WIdeString, 否则显示变量类型不对! void CreateAccess(String mdb,String psw) { if (!FileExists(mdb)) { WideString s="Provider=Microsoft Jet 4.0 OLE DB Provider"; WideString s2="Jet OLEDB:Database Password="+psw; Variant AdoObj=Variant::CreateObject("ADOX.Catalog"); AdoObj.OleProcedure("Create", s+";"+"Data Source="+mdb+";"+s2); AdoObj.Clear(); } } void __fastcall TForm1::Button1Click(TObject *Sender) { CreateAccess("d:\\test.mdb",""); }
4LZJ
上面是BCB5。0时的程序,在6。0下,AnsiString要改成WIdeString,
否则显示变量类型不对!
void CreateAccess(String mdb,String psw)
{
if (!FileExists(mdb))
{
WideString s="Provider=Microsoft Jet 4.0 OLE DB Provider";
WideString s2="Jet OLEDB:Database Password="+psw;
Variant AdoObj=Variant::CreateObject("ADOX.Catalog");
AdoObj.OleProcedure("Create",
s+";"+"Data Source="+mdb+";"+s2);
AdoObj.Clear();
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CreateAccess("d:\\test.mdb","");
}
18 Aug
在网上找到了GB2312转化为utf-8的算法:
void CChineseCodeLib::UTF_8ToUnicode(WCHAR* pOut,char *pText) { char* uchar = (char *)pOut; uchar[1] = ((pText[0] & 0×0F) << 4) + ((pText[1] >> 2) & 0×0F); uchar[0] = ((pText[1] & 0×03) << 6) + (pText[2] & 0×3F); return; } void CChineseCodeLib::UnicodeToGB2312(char* pOut,WCHAR *uData) { WideCharToMultiByte(CP_ACP,NULL,uData,1,pOut,sizeof(WCHAR),NULL,NULL); return; } void CChineseCodeLib::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer) { ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1); return; } void CChineseCodeLib::UnicodeToUTF_8(char* pOut,WCHAR* pText) { // 注意 WCHAR高低字的顺序,低字节在前,高字节在后 char* pchar = (char *)pText; pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); pOut[1] = (0×80 | ((pchar[1] & 0×0F) << 2)) + ((pchar[1] & 0xC0) >> 6); pOut[2] = (0×80 | (pchar[0] & 0×3F)); return; } void CChineseCodeLib::GB2312ToUTF_8(char *pOut,char *pText, int pLen) { char buf[4]; char* rst = new char[pLen + (pLen >> 2) + 2]; memset(buf,0,4); memset(rst,0,pLen + (pLen >> 2) + 2); int i = 0; int j = 0; while(i < pLen) { //如果是英文直接复制就可以 if( *(pText + i) >= 0) { rst[j++] = pText[i++]; } else { WCHAR pbuffer; Gb2312ToUnicode(&pbuffer,pText+i); UnicodeToUTF_8(buf,&pbuffer); unsigned short int tmp = 0; tmp = rst[j] = buf[0]; tmp = rst[j+1] = buf[1]; tmp = rst[j+2] = buf[2]; j += 3; i += 2; } } rst[j] = ‘\0‘; //返回结果 strcpy(pOut,rst); delete []rst; return; } void CChineseCodeLib::UTF_8ToGB2312(string &pOut, char *pText, int pLen) { char * newBuf = new char[pLen]; char Ctemp[4]; memset(Ctemp,0,4); int i =0; int j = 0; while(i < pLen) { if(pText[i] > 0) { newBuf[j++] = pText[i++]; } else { WCHAR Wtemp; UTF_8ToUnicode(&Wtemp,pText + i); UnicodeToGB2312(Ctemp,&Wtemp); newBuf[j] = Ctemp[0]; newBuf[j + 1] = Ctemp[1]; i += 3; j += 2; } } newBuf[j] = ‘\0‘; pOut = newBuf; delete []newBuf; return; }
用下面的代码段调用
AnsiString srcStr = "中国加油,奥运加油"; int len = srcStr.Length(); char *dest = new char[len]; CChineseCodeLib *codeLib = new CChineseCodeLib(); codeLib->GB2312ToUTF_8(dest,srcStr.c_str(),len); TStringList *tSqlList = new TStringList(); tSqlList->Add(dest); tSqlList->SaveToFile("e:/test.txt"); delete []dest; delete codeLib; delete tSqlList;
最后得到的结果为乱码:
涔櫧鍓犳惫锟屽ゥ杈愬墵姹\xB9
是怎么回事呢?是调用不正确还是算法本身有问题?
小弟刚刚学C++,请高手们指点!!
你应该用ansi转UTF-8,不是GB
mark
BCB 有直接的API使用。
Unit
System
Category
character set conversions
extern PACKAGE UTF8String __fastcall AnsiToUtf8(const AnsiString S);
Description
AnsiToUtf8 converts the string specified by S, which uses the ANSI encoding system, to UTF-8.
LZ的做法是错误的;
utf8是针对unicode的另外一种存储方法;
我有现成的代码,已经经过实际使用了,绝对没有问题;
大体的方法是:
GB2312转到unicode,unicode再转utf8;
GB2312转unicode的办法,在CB里面,简单的要死:
AnsiString gb_str = "xxxx";
WideString un_str = gb_str;
wchar_t * pwstr = un_str.b_cstr();//pwstr就是unicode的字串了,每个字符占用2字,0结尾的;
unicode转到utf8,我是借用的linux的NLS_UTF8的内核代码,高效可靠;
如果你需要,我可以发一份给你;
7 Aug
使用Query DBImages
[code=c/c++]
TStream *myStream;
DBImage1->Picture->Graphic->SaveToStream(&(*myStream));
Query1->ParamByName("img")->LoadFromStream(&(*myStream),ftBlob);
Query1->Post()
[/code]
String file="D:\\jpg\\aaa.bmp";
if(FileExists(file))
{
ADOQuery1->Insert();
TADOBlobStream *tStream;
TMemoryStream *temp=new TMemoryStream();
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromFile(file);
pBitmap->SaveToStream(temp);
((TBlobField *)ADOQuery1->FieldByName("picture"))->LoadFromStream(temp);
}
String file="D:\\jpg\\aaa.bmp";
if(FileExists(file))
{
ADOQuery1->Insert();
TADOBlobStream *tStream;
TMemoryStream *temp=new TMemoryStream();
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromFile(file);
pBitmap->SaveToStream(temp);
((TBlobField *)ADOQuery1->FieldByName("picture"))->LoadFromStream(temp);
}
21 Jul
c++ builder中如何将一个算出来的矩阵保存到tct文件中?
比如我在一个程序中算得矩阵M[255],我如何将这个矩阵完全保存在电脑硬盘中的一个txt的文件中?谢谢
为了兼容性,也可以写成CSV格式(逗号分隔)
假设你的255=17行㗱5列
ofstream out("out.txt");
for (int i=0;i <=255;i++){
if(i%15==0&&i!=0)
out < <M[i] < <",";
else
out < <M[i] < <endl;
}
18 Jul
#include <comobj.hpp>
Variant test;
test=CreateOleObject("Word.Basic");
test.Exec(Procedure("AppShow"));
test.Exec(Procedure("FileNew") < <"Normal");
test.Exec(Procedure("Insert") < <Memo1->Text);
/*
…
*/
//test.Exec(Procedure("FileClose"));
test.Exec(Procedure("FileExit"));
执行什么命令使word不保存文件而退出?
设置 Saved 属性为 true
Excel 的例子:
MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertySet("Saved",true);
我要的是[不保存]退出啊,如Behard这例我加了句
ko.OlePropertyGet("ActiveWorkBook").OlePropertySet("Saved", false);
或
ko.OlePropertyGet("ActiveWorkBook").OlePropertySet("Saved", true);
退出时都要提示输入保存文件名.
//www.g.cn找不到确切的答案
Variant ko;
ko=CreateOleObject("Word.Basic");//创建WORD实例
ko.Exec(Procedure("AppShow"));
ko.Exec(Procedure("FileNew") < <"Normal");//创建一个普通的新文件
ko.Exec(Procedure("Insert") < <Str);//插入Str,这里的Str是您想打印的文件内容,
ko.Exec(Procedure("FilePrint"));//开始打印,只要把FilePrint改为FilePrintPreview,就可以实现打印浏览了
ko.OlePropertyGet("ActiveWorkBook").OlePropertySet("Saved", true);
ko.Exec(Procedure("FileClose"));
ko.Exec(Procedure("FileExit"));
//可以了,前发的贴末经详细测试(不能编辑),感谢Behard
16 Jul
如题.
这个时候好象一些服务已经退出了.
log文件根本写不进去.
可以在服务结束函数,写日志吧
程序都退出了,当然就写不到日志了
25 Jun
自己按照网上的一些资料做一个文本编辑器。用的工具是c++builder6.0。在保存的时候写入
if(frmChild->SaveDialog1->Execute())
{
frmChild->RichEdit1->Clear();
frmChild->RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);
frmChild->RichEdit1->Modified=false;
}
运行后输入“hello”,保存在桌面2.txt里面
打开2.txt里面的文本却是
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 Fixedsys;}}
\viewkind4\uc1\pard\lang2052\f0\fs24
\par }
这个是怎么回事?刚刚接触C++,还请指点!我的font->Charset->GB23212_CHARSET;
你保存的是带有格式信息的那种。
嗯,有颜色,字体样式等一些控制字符
那我要保存为txt文件还需要做些什么呢?
if(frmChild->SaveDialog1->Execute())
{
// 调clear的那一行不能要,要不然就被清除了
frmChild->RichEdit1->PlainText=true;
frmChild->RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);
frmChild->RichEdit1->Modified=false;
}
哦,谢谢。
22 Jun
通过查询语句把查询到的内容显示在DBGrid里,现在我想把DBGrid里的内容保存到EXCEL文件里,请问该怎么做呢?由于我是刚接触这个,网上一些资料调试不过,哪位能提供一个例子的,或者提示一下该如何做?
我再把函数贴出来:
// 测试代码
DBGrid2Excel(DBGrid1, "C:\\ccrun\\123.xls");
void __fastcall DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
return;
Variant vExcelApp, vSheet;
try
{
vExcelApp = Variant::CreateObject("Excel.Application");
}
catch(…)
{
MessageBox(0, "启动 Excel 出错, 可能是没有安装Excel.",
"DBGrid2Excel", MB_OK ¦ MB_ICONERROR);
return;
}
// 隐藏Excel界面
vExcelApp.OlePropertySet("Visible", false);
// 新建一个工作表
vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); // 工作表
// 操作这个工作表
vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
.OlePropertyGet("Sheets", 1);
// 设置Excel文档的字体
vSheet.OleProcedure("Select");
vSheet.OlePropertyGet("Cells").OleProcedure("Select");
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("Size", dbg->Font->Size);
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("Name", dbg->Font->Name.c_str());
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("FontStyle", "常规");
vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
// 表格的行数
int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
nRowCount = nRowCount < 2? 2: nRowCount;
// 表格的列数
int nColCount(dbg->Columns->Count);
nColCount = nColCount < 1? 1: nColCount;
// 设置单元格的宽度
for(int i=0; i <nColCount; i++)
{
int nColWidth = dbg->Columns->Items[i]->Width;
vExcelApp.OlePropertyGet("Columns", i + 1)
.OlePropertySet("ColumnWidth", nColWidth / 7);
}
//—————————————————————————-
// 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。
// 作者:ccrun(老妖) info@ccrun.com
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=635&d=g75jbn
//—————————————————————————-
// 先将列名写入Excel表格
for(int j=0; j <dbg->Columns->Count; j++)
{
// 标题行的行高
vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
//
vSheet.OlePropertyGet("Cells", 1, j + 1)
.OlePropertySet("Value",
dbg->Columns->Items[j]->FieldName.c_str());
// 设置列名单元格的背景色
Variant vInter = vSheet.OlePropertyGet(
"Cells", 1, j + 1).OlePropertyGet("Interior");
vInter.OlePropertySet("ColorIndex", 15); // 灰色
vInter.OlePropertySet("Pattern", 1); // xlSolid
vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
}
// 将DBGrid中的数据写入Excel表格
dbg->DataSource->DataSet->First();
for(int i=0; i <nRowCount; i++)
{
// 普通数据行的行高16
vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
// 63 63 72 75 6E 2E 63 6F 6D
for(int j=0; j <dbg->Columns->Count; j++)
{
vSheet.OlePropertyGet("Cells", i + 2, j + 1)
.OlePropertySet("Value",
dbg->DataSource->DataSet->FieldByName(
dbg->Columns->Items[j]->FieldName)->AsString.c_str());
}
dbg->DataSource->DataSet->Next();
}
// 保存Excel文档并退出
vExcelApp.OlePropertyGet("ActiveWorkbook")
.OleFunction("SaveAs", strXlsFile.c_str());
vExcelApp.OleFunction("Quit");
vSheet = Unassigned;
vExcelApp = Unassigned;
// 工作结束
MessageBox(0, "DBGrid2Excel 转换结束!",
"DBGrid2Excel", MB_OK ¦ MB_ICONINFORMATION);
}
不过数据量大,很慢地
在导出时,有一个字段是数字类型的,由于数字过大,有18位,导成EXCEL文件后,里面的字段以科学计算法表示,后四位都变成0,请问这个问题该如何解决,或者如何把该字段导出时设置为字符串(非数字类型)。
谢谢上面各位的提示
vSheet.OlePropertyGet("Cells", i + 2, j + 1)
.OlePropertySet("Value",
dbg->DataSource->DataSet->FieldByName(
dbg->Columns->Items[j]->FieldName)->AsString.c_str());
已经设置成了字符串了,怎么还会出现导出到EXCEL里变成数字值呢
如何做可以选择保存路径?
关注!
使用Ole很难成功的
能不能导出到txt文档内??
// 将DBGrid中的数据导出到Excel文档
//—————————————————————————
void __fastcall TlogQueryfrm::DBGrid2Excel(TDBGrid *dbg, String strXlsFile)
{
if(!dbg->DataSource->DataSet->Active) // 数据集没有打开就返回
return;
Variant vExcelApp, vSheet;
try
{
vExcelApp = Variant::CreateObject("Excel.Application");
}
catch(Exception &E)
{
String e = E.ClassName();
MessageBox(e.c_str(), "启动 Excel 出错, 可能是没有安装Excel.",
"DBGrid2Excel", MB_OK ¦ MB_ICONERROR);
return;
}
// 隐藏Excel界面
vExcelApp.OlePropertySet("Visible", false);
// 新建一个工作表
vExcelApp.OlePropertyGet("Workbooks").OleFunction("Add", 1); //工作表
// 操作这个工作表
vSheet = vExcelApp.OlePropertyGet("ActiveWorkbook")
.OlePropertyGet("Sheets", 1);
// 设置Excel文档的字体
vSheet.OleProcedure("Select");
vSheet.OlePropertyGet("Cells").OleProcedure("Select");
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("Size", dbg->Font->Size);
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("Name", dbg->Font->Name.c_str());
vExcelApp.OlePropertyGet("Selection").OlePropertyGet("Font")
.OlePropertySet("FontStyle", "常规");
vSheet.OlePropertyGet("Cells", 1, 1).OleProcedure("Select");
// 表格的行数
int nRowCount(dbg->DataSource->DataSet->RecordCount + 1);
nRowCount = nRowCount < 2? 2: nRowCount;
// 表格的列数
int nColCount(dbg->Columns->Count);
nColCount = nColCount < 1? 1: nColCount;
// 设置单元格的宽度
for(int i=0; i <nColCount; i++)
{
int nColWidth = dbg->Columns->Items[i]->Width;
vExcelApp.OlePropertyGet("Columns", i + 1)
.OlePropertySet("ColumnWidth", nColWidth / 7);
}
// 先将列名写入Excel表格
for(int j=0; j <dbg->Columns->Count; j++)
{
// 标题行的行高
vExcelApp.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 20);
//
vSheet.OlePropertyGet("Cells", 1, j + 1)
.OlePropertySet("Value",
dbg->Columns->Items[j]->FieldName.c_str());
// 设置列名单元格的背景色
Variant vInter = vSheet.OlePropertyGet(
"Cells", 1, j + 1).OlePropertyGet("Interior");
vInter.OlePropertySet("ColorIndex", 15); // 灰色
vInter.OlePropertySet("Pattern", 1); // xlSolid
vInter.OlePropertySet("PatternColorIndex", -4105); // xlAutomatic
}
//将DBGrid中的数据写入Excel表格
dbg->DataSource->DataSet->First();
for(int i=0; i <nRowCount; i++)
{
// 普通数据行的行高16
vExcelApp.OlePropertyGet("Rows", i + 2).OlePropertySet("RowHeight", 16);
// 63 63 72 75 6E 2E 63 6F 6D
for(int j=0; j <dbg->Columns->Count; j++)
{
vSheet.OlePropertyGet("Cells", i + 2, j + 1)
.OlePropertySet("Value",
dbg->DataSource->DataSet->FieldByName(
dbg->Columns->Items[j]->FieldName)->AsString.c_str());
}
dbg->DataSource->DataSet->Next();
}
// 保存Excel文档并退出
vExcelApp.OlePropertyGet("ActiveWorkbook")
.OleFunction("SaveAs", strXlsFile.c_str());
vExcelApp.OleFunction("Quit");
vSheet = Unassigned;
vExcelApp = Unassigned;
// 导出成功
MessageBox(0, "导出成功!","DBGrid2Excel", MB_OK);
}
可以用SaveDialog控件
if(SaveDialog1->Execute())
{
AnsiString name;
int len=SaveDialog1->FileName.Length();
name=SaveDialog1->FileName.SubString(len-3,4);
if(name.LowerCase()!=".xls")
{
name=SaveDialog1->FileName+".xls";
}
else
{
name=SaveDialog1->FileName;
}
///调用上面的函数
DBGrid2Excel(DBGrid1, name);
}
可以使用ehlib控件,使用比较简单,还可以轻易使用打印的功能.