我爱builder

C++Builder 程序员博客

我想做个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);真是太感谢了,好人呐,给分给分

  • Filed under: C++ Builder
  • 使用如下对<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呗,呵呵

  • Filed under: C++ Builder
  • 使用如下对<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的效果一样.
    或者其他方法?

  • Filed under: C++ Builder
  • 如何用CB操作Word插入一段,并在该段写入一段文字,再插入一段,然后在该段插入一个图片?

    强势围观OLE专业户围观ole专业户
    打开文档的位置如何控制呢?也就是说在什么地方插入ole牛人啊

  • Filed under: C++ Builder
  • 用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的警告提示<
    哈哈,,在学习一下,好久没有用了收藏一下。为何要长内容呢。。。收藏一下,呵呵呵~~~~~~~~~~~~~~~~~~~~~~~~

  • Filed under: C++ Builder
  • 用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的警告提示<
    哈哈,,在学习一下,好久没有用了收藏一下。为何要长内容呢。。。

  • Filed under: C++ Builder
  • 用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的警告提示<
    哈哈,,在学习一下,好久没有用了

  • Filed under: C++ Builder
  • 我在表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型再计算。

    其他的功能你参照这个思路自己 组合一下。

  • Filed under: C++ Builder
  • http://http://ylmf.org/snapshot.html

    我也是在CSDN上才看到的,以前不想用Linux很大的原因跟他的界面不太方便有关!
    一直都不是很喜欢雨林木风的说,但这会搞出来的东西,至少带来了一个新的理念。不过完全照搬也很可能被微软打得很惨~如果用linux,强烈推荐ubuntu,至于ylmf这种包装行为,不方便作评论.补充一下:推荐原版Ubuntu,也就是说:从官方网站下载原版的程序进行安装.

    个人不建议安装这种山寨式包装.雨林木风这种包装对用户根本没用,我们又不是看UI才使用一款操作系统的总觉得红旗、Ubuntu和界面不是很友好,可能是windows用习惯了~<
    雨林木风用修改版XP赚了几个亿。只是蕃茄倒霉罢了不过我还是喜欢ylmf的XP<
    Linux 我现在都是使用 CentOS 的每天回帖即可获得10分可用分!唉,Linux,为啥这么多版本?支持centos

  • Filed under: C++ Builder
  • http://http://ylmf.org/snapshot.html

    我也是在CSDN上才看到的,以前不想用Linux很大的原因跟他的界面不太方便有关!
    一直都不是很喜欢雨林木风的说,但这会搞出来的东西,至少带来了一个新的理念。不过完全照搬也很可能被微软打得很惨~如果用linux,强烈推荐ubuntu,至于ylmf这种包装行为,不方便作评论.补充一下:推荐原版Ubuntu,也就是说:从官方网站下载原版的程序进行安装.

    个人不建议安装这种山寨式包装.雨林木风这种包装对用户根本没用,我们又不是看UI才使用一款操作系统的总觉得红旗、Ubuntu和界面不是很友好,可能是windows用习惯了~<
    雨林木风用修改版XP赚了几个亿。只是蕃茄倒霉罢了不过我还是喜欢ylmf的XP<
    Linux 我现在都是使用 CentOS 的每天回帖即可获得10分可用分!唉,Linux,为啥这么多版本?支持centos

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档