C++Builder 程序员博客
3 Aug
我想做个WORD写入SQL的程序,指定目录搜索到新文件(.doc)后,把WORD写入MSSQL数据库的表中。我用了FindFirst查找目录,用了TFileStream写入流文件,但是发现在打开流文件时,报文件打开错误,查了后发现是需要打开的文件被自己的程序占用,所以TFileStream(updateFolder,fmOpenRead)出错。
不用FindFirst我也不清楚还有什么可以查找文件方法,流文件我也第一次使用,应该有什么解决方法吧,跪求~
具体程序:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSearchRec StrRecord;
int iAttributes;
AnsiString folder,FileName,productname,FindFolder;
int iFileHandle,iFileDate,intitial;
TDateTime DATE;
folder="D:\新\";
intitial=0;
iAttributes=faAnyFile;
FindFolder=folder+"*.doc" ;
if(FindFirst(FindFolder,iAttributes,StrRecord)==0)
{
do
{
productname=StrRecord.Name;
FileName=folder+productname ;
iFileHandle=FileOpen( FileName, fmOpenRead);
iFileDate=FileGetDate(iFileHandle);
DATE=FileDateToDateTime(iFileDate);
if(iFileDate>intitial)
{
update(FileName,productname,"department",DATE);
}
}
while(FindNext(StrRecord)==0);
FindClose(StrRecord);
}
}
//—————————————————————————
void __fastcall TForm1::update(AnsiString updateFolder,AnsiString updatefile,AnsiString department,TDateTime updatetime)
{
ADOQuery->Close();
ADOQuery->SQL->Clear();
AnsiString sql = "select * from product";
ADOQuery->SQL->Add(sql) ;
ADOQuery->Open();
TFileStream* ComposedFile = new TFileStream(updateFolder,fmOpenRead); //此行报错,郁闷中
ADOQuery->Last();
ADOQuery->Append();
ADOQuery->Edit();
((TBlobField*)(ADOQuery->FieldByName("note")))->LoadFromStream(ComposedFile);
ADOQuery->FieldByName("productname")->AsString=updatefile;
ADOQuery->FieldByName("department")->AsString=department;
ADOQuery->FieldByName("updatetime")->AsString=updatetime;
ADOQuery->Post();
delete ComposedFile;
}
另外还有一个问题,在Button1Click函数中,你用FileOpen打开的文件句柄,没有关闭。这样会造成资源泄露。
在以下代码
iFileDate=FileGetDate(iFileHandle);
的后面加一句:
FileClose(iFileHandle);
真是太感谢了,好人呐,给分给分
19 Jul
使用如下对<table id="list">已经插入2行数据
CComPtr<IHTMLDocument3> doc;
frmweb->webBrowser->Document->QueryInterface(IID_IHTMLDocument3,(void**)&doc);
CComPtr<IHTMLElement> ele;
HRESULT ret=doc->getElementById(L"list",&ele);
CComPtr<IHTMLTable> table;
ele->QueryInterface(IID_IHTMLTable,(void**)&table);
CComPtr<IHTMLTableRow> row;
table->insertRow(-1,(IDispatch**)&row);
IHTMLTableCell* cell;
IHTMLElement* tdele;
row->insertCell(-1,(IDispatch**)&cell);
cell->QueryInterface(IID_IHTMLElement,(void**)&tdele);
tdele->put_innerText(L"Unkown");
tdele->Release();
cell->Release();
row->insertCell(-1,(IDispatch**)&cell);
cell->QueryInterface(IID_IHTMLElement,(void**)&tdele);
tdele->put_innerText(L"Good Postion");
tdele->Release();
cell->Release();
如何实现鼠标移动到数据行上,突出效果显示? 和htm中的onMouseover、onMouseout的效果一样.
或者其他方法?
写CSS呗,呵呵
19 Jul
使用如下对<table id="list">已经插入2行数据
CComPtr<IHTMLDocument3> doc;
frmweb->webBrowser->Document->QueryInterface(IID_IHTMLDocument3,(void**)&doc);
CComPtr<IHTMLElement> ele;
HRESULT ret=doc->getElementById(L"list",&ele);
CComPtr<IHTMLTable> table;
ele->QueryInterface(IID_IHTMLTable,(void**)&table);
CComPtr<IHTMLTableRow> row;
table->insertRow(-1,(IDispatch**)&row);
IHTMLTableCell* cell;
IHTMLElement* tdele;
row->insertCell(-1,(IDispatch**)&cell);
cell->QueryInterface(IID_IHTMLElement,(void**)&tdele);
tdele->put_innerText(L"Unkown");
tdele->Release();
cell->Release();
row->insertCell(-1,(IDispatch**)&cell);
cell->QueryInterface(IID_IHTMLElement,(void**)&tdele);
tdele->put_innerText(L"Good Postion");
tdele->Release();
cell->Release();
如何实现鼠标移动到数据行上,突出效果显示? 和htm中的onMouseover、onMouseout的效果一样.
或者其他方法?
16 Jul
如何用CB操作Word插入一段,并在该段写入一段文字,再插入一段,然后在该段插入一个图片?
强势围观OLE专业户
围观ole专业户
打开文档的位置如何控制呢?也就是说在什么地方插入
ole牛人啊
26 Feb
用OLE方法如何删除一个sheet. 我用wk.OlePropertyGet("Sheets",3).OleFunction("delete")删除不了, 不知道delete应该怎么用。
wk.OlePropertyGet("Sheets",3).OleProcedure("delete")
也试过用OleProcedure了,是不行的, 用EXCEL的宏来记录得出是ActiveWindow.SelectedSheets.Delete
不知道怎么转换,试了用:
wk.OlePropertyGet("Sheets",3).OleProcedure("Select");
ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleFunction("Delete");
也不行。
问题找到了,但还没解决,用wk.OlePropertyGet("Sheets",2).OleProcedure("Delete");或ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleProcedure("Delete");都可以删除一个指定的SHEET。
但条件是要设置wk.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",true);
EXCEL会弹出确定删除的对话框,只有确定删除了才会执行成功。
但我不想将EXCEL显示出来,这样怎么可以删除成功呢?
收藏,慢慢看,
留个名,马上就要用到的,回头细读
我也来学习了
sh.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",false);//关闭Excel的警告提示
<
哈哈,,在学习一下,好久没有用了
收藏一下。为何要长内容呢。。。
收藏一下,呵呵呵~~~~~~~~~~~~~~~~~~~~~~~~
23 Feb
用OLE方法如何删除一个sheet. 我用wk.OlePropertyGet("Sheets",3).OleFunction("delete")删除不了, 不知道delete应该怎么用。
wk.OlePropertyGet("Sheets",3).OleProcedure("delete")
也试过用OleProcedure了,是不行的, 用EXCEL的宏来记录得出是ActiveWindow.SelectedSheets.Delete
不知道怎么转换,试了用:
wk.OlePropertyGet("Sheets",3).OleProcedure("Select");
ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleFunction("Delete");
也不行。
问题找到了,但还没解决,用wk.OlePropertyGet("Sheets",2).OleProcedure("Delete");或ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleProcedure("Delete");都可以删除一个指定的SHEET。
但条件是要设置wk.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",true);
EXCEL会弹出确定删除的对话框,只有确定删除了才会执行成功。
但我不想将EXCEL显示出来,这样怎么可以删除成功呢?
收藏,慢慢看,
留个名,马上就要用到的,回头细读
我也来学习了
sh.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",false);//关闭Excel的警告提示
<
哈哈,,在学习一下,好久没有用了
收藏一下。为何要长内容呢。。。
23 Feb
用OLE方法如何删除一个sheet. 我用wk.OlePropertyGet("Sheets",3).OleFunction("delete")删除不了, 不知道delete应该怎么用。
wk.OlePropertyGet("Sheets",3).OleProcedure("delete")
也试过用OleProcedure了,是不行的, 用EXCEL的宏来记录得出是ActiveWindow.SelectedSheets.Delete
不知道怎么转换,试了用:
wk.OlePropertyGet("Sheets",3).OleProcedure("Select");
ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleFunction("Delete");
也不行。
问题找到了,但还没解决,用wk.OlePropertyGet("Sheets",2).OleProcedure("Delete");或ex.OlePropertyGet("ActiveWindow").OlePropertyGet("SelectedSheets").OleProcedure("Delete");都可以删除一个指定的SHEET。
但条件是要设置wk.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",true);
EXCEL会弹出确定删除的对话框,只有确定删除了才会执行成功。
但我不想将EXCEL显示出来,这样怎么可以删除成功呢?
收藏,慢慢看,
留个名,马上就要用到的,回头细读
我也来学习了
sh.OlePropertyGet("Application").OlePropertySet("DisplayAlerts",false);//关闭Excel的警告提示
<
哈哈,,在学习一下,好久没有用了
2 Feb
我在表A中有两组数列1是125,列2是225,列3是255,列4是325,列5是115
问题1、如何把列一的各个数相加,比如1+2+5=?显示在该表的另一列
问题2、如何把列1与列2的尾数相加,或把列1首位与列2尾位相加,再显示在该表的别一列
请问各位高手可以做到吗,如果办不到,能有什么办法解决吗?
2个题的方法实际都是一样的。
只需要在将数列从int专程字符型,用sprintf();就可以完成。
然后把单个字符取出后在转为int就可以,函数可以用atoi();
先转换成String类型 然后直接截取你想要的字符 再转换回int
这个你直接可以在sql语句里边处理的啊
用string流,比较方便,可以把数自动分离出来—资料书这么说的,我也没用过,可以试一试。
问题1、如何把列一的各个数相加,比如1+2+5=?显示在该表的另一列
问题2、如何把列1与列2的尾数相加,或把列1首位与列2尾位相加,再显示在该表的别一列
问题1:
table->open();
table->edit();
//如果表中所有数据相加,循环下面一句
table->fieldbyname("列6")->integer=table->fieldbyname("列1")->integer+table->fieldbyname("列2")->integer+table->fieldbyname("列5")->integer;
//循环结束
table->post
用SQL语句实现…
我也想用SQL语句实现,不过我刚学,不知道用什么函数,怎么的设计法,所以请各位大侠们帮帮忙,可以不
问题1、如何把列一的各个数相加,比如1+2+5=?显示在该表的另一列
x/100+x/10%10+x%10
问题2、如何把列1与列2的尾数相加,或把列1首位与列2尾位相加,再显示在该表的别一列
X%10+Y%10
先将各个数读出来,然后分解得到每个数位上的数字,再进行运算就可以了。一个三位数a,x、y、z为个十百位
int a,x,y,z;
x=a%10;
y=(a/10)%10;
z=a/100
你可能是搞不清楚转换SQL中的函数,给你写一个简单的语句,你自己替换多实验几次。
select cast (substring(FieldName,1,1) as int )+cast (substring(FieldName,2,1) as int )as c from TableName
取字段的第1个字节转换为INT + 取了字段的第二位转换为INT
substring 转换为字符串截位
cast 转换为int型再计算。
其他的功能你参照这个思路自己 组合一下。
11 Jan
http://http://ylmf.org/snapshot.html
我也是在CSDN上才看到的,以前不想用Linux很大的原因跟他的界面不太方便有关!
一直都不是很喜欢雨林木风的说,但这会搞出来的东西,至少带来了一个新的理念。不过完全照搬也很可能被微软打得很惨~
如果用linux,强烈推荐ubuntu,至于ylmf这种包装行为,不方便作评论.
补充一下:推荐原版Ubuntu,也就是说:从官方网站下载原版的程序进行安装.
个人不建议安装这种山寨式包装.
雨林木风这种包装对用户根本没用,我们又不是看UI才使用一款操作系统的
总觉得红旗、Ubuntu和界面不是很友好,可能是windows用习惯了~
<
雨林木风用修改版XP赚了几个亿。只是蕃茄倒霉罢了
不过我还是喜欢ylmf的XP
<
Linux 我现在都是使用 CentOS 的
每天回帖即可获得10分可用分!
唉,Linux,为啥这么多版本?
支持centos
10 Jan
http://http://ylmf.org/snapshot.html
我也是在CSDN上才看到的,以前不想用Linux很大的原因跟他的界面不太方便有关!
一直都不是很喜欢雨林木风的说,但这会搞出来的东西,至少带来了一个新的理念。不过完全照搬也很可能被微软打得很惨~
如果用linux,强烈推荐ubuntu,至于ylmf这种包装行为,不方便作评论.
补充一下:推荐原版Ubuntu,也就是说:从官方网站下载原版的程序进行安装.
个人不建议安装这种山寨式包装.
雨林木风这种包装对用户根本没用,我们又不是看UI才使用一款操作系统的
总觉得红旗、Ubuntu和界面不是很友好,可能是windows用习惯了~
<
雨林木风用修改版XP赚了几个亿。只是蕃茄倒霉罢了
不过我还是喜欢ylmf的XP
<
Linux 我现在都是使用 CentOS 的
每天回帖即可获得10分可用分!
唉,Linux,为啥这么多版本?
支持centos