﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-semovy-文章分类-C++ Builder相关</title><link>http://www.blogjava.net/WshmAndLily/category/10980.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 24 Apr 2007 23:12:15 GMT</lastBuildDate><pubDate>Tue, 24 Apr 2007 23:12:15 GMT</pubDate><ttl>60</ttl><item><title>ACCESS中的分页解决方案</title><link>http://www.blogjava.net/WshmAndLily/articles/113165.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 24 Apr 2007 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/113165.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/113165.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/113165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/113165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/113165.html</trackback:ping><description><![CDATA[String TUtilForm::getSQL(int recordCount ,int pageCount, int pageSize,int pageIndex,String tableName,String queryFields,String primaryKey,String ascending,String condition)<br>{<br>&nbsp;&nbsp;&nbsp; int middleIndex = pageCount/2;<br>&nbsp;&nbsp;&nbsp; int firstIndex = 0;<br>&nbsp;&nbsp;&nbsp; int lastIndex = pageCount - 1;<br>&nbsp;&nbsp;&nbsp; String SQLStr = "";<br>&nbsp;&nbsp;&nbsp; if( pageIndex &lt;= firstIndex )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr = "select top " + IntToStr(pageSize) + " " + queryFields + " from " + tableName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " where " + condition ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " " + ascending;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if( pageIndex &gt; firstIndex &amp;&amp; pageIndex &lt;= middleIndex )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr = "select top " + IntToStr(pageSize) + " " + queryFields + " from " + tableName + " where " + primaryKey ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ascending == "asc" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr +=&nbsp; "&gt;(select max(";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += "&lt;(select min(";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += primaryKey + ") from (select top " + IntToStr(pageSize*pageIndex) + " " + primaryKey + " from " + tableName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " where " + condition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " " + ascending + ") TableA )";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " and " + condition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " " + ascending;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if( pageIndex &gt; middleIndex &amp;&amp; pageIndex &lt; lastIndex)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr = "select " + queryFields + " from (select top " + IntToStr(pageSize) + " " + queryFields + " from " + tableName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " where " + primaryKey ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ascending == "asc" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " &lt; ( select min(";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " &gt; ( select max(";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += primaryKey + ") from (select top " +&nbsp; IntToStr( recordCount - pageSize * (pageIndex + 1)) + " " + primaryKey + " from " + tableName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " where " + condition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " desc) TableA)" ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " and " + condition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " desc) TableB order by )" + primaryKey + " " + ascending ;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr = "select " + queryFields + " from (select top " + IntToStr(recordCount - pageSize*lastIndex) + " " + queryFields + " from " + tableName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( condition != "" )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " where " + condition;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLStr += " order by " + primaryKey + " desc " + " )TableA order by " + primaryKey + " " + ascending;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return SQLStr;<br>}
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/113165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-04-24 14:11 <a href="http://www.blogjava.net/WshmAndLily/articles/113165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>输出jpg是来自TImage控件的图形</title><link>http://www.blogjava.net/WshmAndLily/articles/112647.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 22 Apr 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/112647.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/112647.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/112647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/112647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/112647.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics::TBitmap *bmp = new Graphics::TBitmap;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmp-&gt;Width = (int)newWidth;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmp-&gt;Height = (int)newHeight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmp-&gt;Canvas-&gt;StretchDraw(Rect(0,0,bmp-&gt;Width,bmp-&gt;Height),Image1-&gt;Picture-&gt;Graphic);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TJPEGImage *MyJPEG = new TJPEGImage;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyJPEG-&gt;Assign(bmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyJPEG-&gt;SaveToFile("c:\\newbmp.jpg");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete MyJPEG;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete bmp;
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/112647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-04-22 17:46 <a href="http://www.blogjava.net/WshmAndLily/articles/112647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bcb jpeg转成bmp</title><link>http://www.blogjava.net/WshmAndLily/articles/59654.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 23 Jul 2006 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/59654.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/59654.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/59654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/59654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/59654.html</trackback:ping><description><![CDATA[//改为：#include  &lt;jpeg.hpp&gt;<br /><br />  Graphics::TBitmap  *b=  new  Graphics::TBitmap();<br />  TJPEGImage  *j=new  TJPEGImage();<br />   j-&gt;JPEGNeeded();<br />   if(OpenDialog1-&gt;Execute())<br />   j-&gt;LoadFromFile(OpenDialog1-&gt;FileName);<br /><br />  b-&gt;Assign(j);<br /><br /><br />  if(SaveDialog1-&gt;Execute())<br />  b-&gt;SaveToFile(SaveDialog1-&gt;FileName);<br />  delete  b;<br />  delete  j;<br /><img src ="http://www.blogjava.net/WshmAndLily/aggbug/59654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-07-23 15:35 <a href="http://www.blogjava.net/WshmAndLily/articles/59654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BCB杂记</title><link>http://www.blogjava.net/WshmAndLily/articles/50096.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 03 Jun 2006 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/50096.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/50096.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/50096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/50096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/50096.html</trackback:ping><description><![CDATA[
		<p>1.调用Windows的计算器<br />WinExec("CALC.EXE",0); <br />2.调用Windows记事本<br />ShellExecute(Application-&gt;Handle,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL);</p>
		<p>3.BarTender条形码设计软件<br />4.调用*.chm帮助文件:<br />String sHelpFilePath = GetCurrentDir() + "<a href="file://\\help\\help.CHM&quot;;  //">\\help\\help.CHM";  //</a>文件路径<br />    if(FileExists(sHelpFilePath))<br />    {<br />      ShellExecute(<br />      Handle,<br />      "open",<br />      sHelpFilePath.c_str(),<br />      NULL,<br />      NULL,<br />      SW_SHOWNORMAL<br />      );<br />    }<br /></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/50096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-06-03 09:11 <a href="http://www.blogjava.net/WshmAndLily/articles/50096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用C++Builder存取Excel文件[转载]</title><link>http://www.blogjava.net/WshmAndLily/articles/45844.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 May 2006 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45844.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45844.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45844.html</trackback:ping><description><![CDATA[文档标题：用C++Builder存取Excel文件　　作者： 佚名<br /><br />关 键 字：Excel,OLE技术,Variant,ODBC,CreateObject,Cells<br /><br />本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=20&amp;d=8d0grf<br />---- C++Builder是Borland公司继Delphi之后又一成功的产品,她集VB、VC++ 及 Delphi 的优点于一体而深得C语言爱好者的青睐。由于多数操作者爱用 MicroSoft公司的Excel组织数据，为此本文介绍了用C++Builder存取Excel 文件的两种方法。 <br /><br />---- 一.用OLE技术操纵Excel <br /><br />---- OLE(对象链接与嵌入)是微软提出的标准，是应用程序间交换数据、相互操作的一种方式，MS OFFICE 提供了很强的 OLE 服务功能，VB、Delphi 及C++Builder等语言都可以以客户方式向Excel提交命令,以存取其数据,其中VB和Delphi最为简单，在语法上就采用类VBA的语句,本报九九年第48期的《在Delphi中操作Excel》一文曾介绍了Delphi的做法。我们原以为C++Builder照搬Delphi，结果语法编译都未能通过，查不到这方面具体介绍的资料。经反复试验方知：原来C++Builder采用间接的办法，利用变体类Variant所提供的四个“方法”向OLE服务程序提交操纵命令： <br /><br /> Variant Variant::OlePropertyGet(属性名,参数….);<br />// 取对象属性<br /> Void  Variant::OlePropertySet(属性名,参数….);<br />// 设置对象属性 <br /> Variant Variant::OleFunction(函数名，参数….);<br />// 运行对象的函数<br /> void  Variant::OleProcedure(过程名，参数….);<br /> // 运行对象的过程<br /><br />其头文件“vcl\\\\utilcls.h”必须嵌在用户程序中，<br />对于这四个长长的方法名可在程序中用宏语句重新定义一下： <br /> #define  PG  OlePropertyGet<br /> #define  PS  OlePropertySet<br /> #define  FN  OleFunction<br /> #define  PR  OleProcedure<br /><br />例如对于VB的提交语句: <br />Ex.ActiveWorkBook.ActiveSheet.Cells(1,2).Value=3<br />为便于理解在C++Builder对应的语句可分解为如下四句：<br />Variant t1=Ex.OlePropertyGet(\\\"ActiveWorkBook\\\");<br />Variant t2=t1.OlePropertyGet(\\\"ActiveSheet\\\");<br />Variant t3=t2.OlePropertyGet(\\\"Cells,1,2);<br /> t3.OlePropertySet(\\\"Value\\\",3);<br />可去掉中间变量将这四句合为一句，就是:<br /> Ex.PG(\\\"ActiveWorkBook\\\").PG(\\\"ActiveSheet\\\").<br />PG(\\\"Cells\\\",1,2).PS(\\\"Value\\\",3); <br />我们将下面的VB程序片段改成对应的C++Builder程序以供参考:<br />Private Sub Command1_Click()  \\\' Visual Basic程序片段<br />Dim Ex As Object,Wb As Object, Sh1 As Object<br />Set Ex = CreateObject(\\\"Excel.Application\\\")<br />Ex.WorkBooks.Open(\\\"c:\\\\book1.xls\\\")<br />Set Wb = Ex.Activeworkbook<br />Set Sh1 = Wb.ActiveSheet<br />Text1.Text = Sh1.Cells(1, 1).Value<br />For i = 1 To 10: For j = 1 To 10<br />Sh1.Cells(i, j).Value = i * 100 + j<br />Next j: Next i<br />Wb.save: Wb.Close: Ex.Quit<br />End Sub \\\' - - - - - -- - - - - - - - - - - <br /><br />#include \\\"Unit1.h\\\" // C++Builder程序片段<br />#include \\\"vcl\\\\utilcls.h\\\" // util classes实用类说明<br />// …省写此处原一段代码<br />// 请在此处插入上面提及的四个宏定义语句<br />void __fastcall TForm1::Button1Click(TObject *Sender)<br />{ Variant Ex,Wb,Sh1;<br /> Ex=Variant::CreateObject(\\\"Excel.Application\\\");<br /> Ex.PG(\\\"WorkBooks\\\").PR(\\\"Open\\\",\\\"c:\\\\\\\\book1.xls\\\");<br /> Wb=Ex.PG(\\\"ActiveWorkBook\\\"); Sh1=Wb.PG(\\\"ActiveSheet\\\");<br /> Edit1-&gt;Text=Sh1.PG(\\\"Cells\\\",1,1).PG(\\\"Value\\\");<br /> for (int i=1;i&lt;=10;i++)<br />for (int j=1;j&lt;=10;j++)<br /> Sh1.PG(\\\"Cells\\\",i,j).PS(\\\"Value\\\",i*100+j);<br /> Wb.PR(\\\"Save\\\"); Wb.PR(\\\"Close\\\");<br />}<br /><br />---- 使用这种方法的程序运行时，必须保证系统中同时有MS OFFICE；下面我们再介绍另一种脱离MS OFFICE也能存取Excel表格的方法。 <br />---- 二.用ODBC数据库技术存取Excel <br /><br />---- ODBC就是开放式数据库链接标准，不同种类的数据库只需提供各自的ODBC 驱动程序就可按相同的命令操纵，微软同样为Excel提供了ODBC驱动程序，我们可在程序中象数据库一样存取Excel表格。定义好ODBC数据源后，实际试验中并没有如想象的那样简单，在控件Table的属性TableName中总是检索不到表名，同样也没有相关的资料可供查阅。通过对Excel的分析，终于发现了问题的关键所在：ODBC的表名并不就是Excel的工作表名(如Sheet1),在Excel 表格中必须对要求操作的行列区域定义一个“名称”作为数据库的表名，该区域的首行各列必须是字段名(否则首行数据会当成字段名),可以定义多个表名。具体操作步骤如下： <br /><br />---- 1.在Excel上定义“表名”: <br /><br />---- 运行Excel程序，打开或新建一表格，按下鼠标左键选择一片区域（起始行先填上字段名），再将鼠标位置点到左上角的地址栏，输入一表名如ABC,或者在菜单上选:“插入(I)”-“名称(N)”-“定义(D)”，再输入表名（若已定义, 可在此处删除掉）,存盘退出（假定文件名取为c:\\\\Book.xls），若嫌字段名行多余，存盘前可隐藏掉； <br /><br />---- 2.定义ODBC数据源: <br /><br />---- 从Windows桌面“我的电脑\\\"进入“控制面板”，双击“32位ODBC”图标，运行“用户DSN”中的“添加(D)\\\"后选“Excel Driver(*.xls)\\\", 再点“完成”便弹出对话框，在“数据源名(N)\\\"右边填一名称，如：excel01,在“版本(V)\\\"上选“Excel97\\\", 点中“选项”取消“只读”，在“选定工作目录”中，选定Excel文件名(本例 c:\\\\Book1.xls)，再点“确定”直至退出； <br /><br />---- 3.设置Database控件避免登录检查： <br /><br />---- 运行C++Builder，在Form1中加上Data Access的三个控件：Database1、 DataSource1、Table1,加入Database1的目的是为了避免打开数据库时出现登录框，为此双击此控件弹出一对话框，在Alias name中选ODBC数据源名(本例为Excel01),在Name中填上一新的别名(本例取Excel02)，再点“Defaults” 出现一批参数缺省值，最后取消Options中的两项“Login prompt\\\"与\\\"Keep inactive connect”,点OK退出； <br /><br />---- 4.设置其它控件属性: <br /><br />---- 将Table1的属性DatabaseName选为步骤3中的新别名Excel02,再将另一属性TableName选为步骤1的表名(本例为ABC);将控件DataSource1的属性 DataSet选为Table1；双击Form1,在FormCreate事件子程序内加上一句 Table1- &gt;Open( )； <br /><br />---- 5．查看数据库内容： <br /><br />---- 为了直接看到Excel数据，在Form1中再加上Data Controls的控件DBGrid1 和DBNavigator1，将两者的属性DataSource都选为DataSource1,双击Table1 的属性Active将值改为true,等待数秒就可看到DBGrid1中出现数据,最后恢复Tabel1- &gt;Active为false； <br /><br />---- 注意：程序编译前,必须将刚打开的表关闭,即:使Table1- &gt;Active为false, 否则程序运行时报告出错，因为Excel表总是被ODBC以“独占”方式打开； <br /><br />---- 我们使用的是C++ Builder 4.0专业版，电子表格为Excel 97。 <br />---- 经老妖试验，在win2000,Excel 2000,C++ Builder 6.0中使用正常。<br /> <img src ="http://www.blogjava.net/WshmAndLily/aggbug/45844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-12 15:05 <a href="http://www.blogjava.net/WshmAndLily/articles/45844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用OLE操作Excel(目前最全的资料)</title><link>http://www.blogjava.net/WshmAndLily/articles/45843.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 May 2006 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45843.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45843.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45843.html</trackback:ping><description><![CDATA[文档标题：<font color="#0000ff"><strong>用OLE操作Excel(目前最全的资料)</strong></font>(04.2.19更新)　　作者： ccrun<br /><br />关 键 字：Office,Excel,Sheet,Cell,OLE,CreateObject,Merge,工作簿,工作表,单元格,合并,自动化<br /><br />本文转自 C++Builder 研究 - http://www.ccrun.com/article/go.asp?i=529&amp;d=0iezy5<br />用OLE操作Excel(目前最全的资料)(04.2.19更新)<br />本文档部分资料来自互联网,大部分是ccrun(老妖)在Excel中通过录制宏--&gt;察看宏代码--&gt;转为CB代码而来.本文档不断更新中.欢迎大家关注.<br /><br />要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp<br />#include \\\"Comobj.hpp\\\"<br /><br />C++ Builder把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。<br />设置对象属性:void OlePropertySet(属性名,参数……);<br />获得对象属性:Variant  OlePropertyGet(属性名,参数……);<br />调用对象方法:1) Variant OleFunction(函数名,参数……);<br /> 2) void  OleProcedure(过程名,参数……);<br /><br />在程序中可以用宏定义来节省时间：<br /><br />#define  PG  OlePropertyGet<br />#define  PS  OlePropertySet<br />#define  FN  OleFunction<br />#define  PR  OleProcedure<br /><br />举例：<br />ExcelApp.OlePropertyGet(\\\"workbooks\\\").OleFunction(\\\"Add\\\");<br />可写为<br />ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\");<br /><br />C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。<br />首先定义以下几个变量：<br />Variant ExcelApp,Workbook1,Sheet1,Range1;<br /><br />1、Excel中常用的对象是:Application,Workbooks,Worksheets等。<br /><br />★创建应用对象★<br /> Variant ExcelApp;<br /> ExcelApp = Variant::CreateObject (\\\"Excel.Application\\\");<br /> 或者<br /> ExcelApp = CreateOleObject (\\\"Excel.Application\\\");<br /><br />★创建工作簿对象★<br /> Variant WorkBook1;<br /> WorkBook1 = ExcelApp.PG(\\\"ActiveWorkBook\\\");<br /><br />★创建工作表对象★<br /> Variant Sheet1;<br /> Sheet1 = WorkBook1.PG(\\\"ActiveSheet\\\");<br /><br />★创建区域对象★<br /> Variant Range;<br /> Range = Sheet1.PG(\\\"Range\\\",\\\"A1:A10\\\"); <br /> 或者使用<br /> Excel.Exec(PropertyGet(\\\"Range\\\")&lt;&lt;\\\"A1:C1\\\").Exec(Procedure(\\\"Select\\\"));<br /><br />2、常用的属性操作:<br /><br />★使Excel程序不可见★<br /> ExcelApp.PS(\\\"Visible\\\", (Variant)false);<br /><br />★新建EXCEL文件★<br /><br />◎ 新建系统模板的工作簿<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\") //默认工作簿<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 1)  //单工作表<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 2)  //图表 <br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 3)  //宏表 <br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 4)  //国际通用宏表<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 5)  //与默认的相同<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 6)  //工作簿且只有一个表<br /> 或者使用ExcelApp的Exec方法<br /> Excel.Exec(PropertyGet(\\\"Workbooks\\\")).Exec(Procedure(\\\"Add\\\"));<br />◎ 新建自己创建的模板的工作簿<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", \\\"C:\\\\\\\\Temp\\\\\\\\result.xlt\\\");<br /><br />★打开工作簿★<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"open\\\", \\\"路径名.xls\\\") <br /><br />★保存工作簿★<br /> WorkBook1.FN(\\\"Save\\\"); //保存工作簿<br /> WorkBook1.FN(\\\"SaveAs\\\", \\\"文件名\\\");//工作簿保存为,路径注意用\\\"\\\\\\\\\\\"<br /><br />★退出EXCEL★<br /> ExcelApp.FN (\\\"Quit\\\");<br /> ExcelApp = Unassigned;<br /> 或者<br /> ExcelApp.Exec(Procedure(\\\"Quit\\\"));<br /><br />★操作工作表★<br /><br />◎ 选择选择工作表中第一个工作表<br /> Workbook1.PG(\\\"Sheets\\\", 1).PR(\\\"Select\\\");<br /> Sheet1 = Workbook1.PG(\\\"ActiveSheet\\\");<br /><br />◎ 重命名工作表<br /> Sheet1.PS(\\\"Name\\\", \\\"Sheet的新名字\\\");<br /><br />◎ 当前工作簿中的工作表总数<br /> int nSheetCount=Workbook1.PG(\\\"Sheets\\\").PG(\\\"Count\\\");  <br /><br />★操作行和列★<br /> <br />◎ 获取当前工作表中有多少行和多少列：<br /> Sheet1.PG(\\\"UsedRange\\\").PG(\\\"Columns\\\").PG(\\\"Count\\\"); //列数<br /> Sheet1.PG(\\\"UsedRange\\\").PG(\\\"Rows\\\").PG(\\\"Count\\\"); //行数<br /><br />◎ 设置列宽<br /> ExcelApp.PG(\\\"Columns\\\", 1).PS(\\\"ColumnWidth\\\", 22);<br /> 或者<br /> Range = ExcelApp.PG(\\\"Cells\\\", 1, 3);<br /> Range.PS(\\\"ColumnWidth\\\", 22); <br /><br />◎ 设置行高<br /> ExcelApp.PG(\\\"Rows\\\", 2).PS(\\\"RowHeight\\\", 25);<br /> 或者<br /> Range = ExcelApp.PG(\\\"Cells\\\", 2, 1); <br /> Range.PS(\\\"RowHeight\\\", 25);  <br /><br />◎ 在工作表最前面插入一行<br /> Sheet1.PG(\\\"Rows\\\", 1).PR(\\\"Insert\\\"); <br /><br />◎ 删除一行<br /> ExcelApp.PG(\\\"Rows\\\", 2).PR(\\\"Delete\\\"); //将第2行删除<br /><br /> // 本文作者：ccrun ，如转载请保证本文档的完整性，并注明出处。<br /> // 欢迎光临 C++ Builder 研究 www.ccrun.com<br /> // 摘自:http://www.ccrun.com/doc/go.asp?id=529<br /><br />★操作单元格★<br /><br />◎ 设置单元格字体<br />Sheet1.PG(\\\"Cells\\\", 1, 1).PG(\\\"Font\\\").PS(\\\"Name\\\", \\\"隶书\\\"); //字体<br />Sheet1.PG(\\\"Cells\\\", 2, 3).PG(\\\"Font\\\").PS(\\\"size\\\", 28);  //大小<br /><br />◎ 设置所选区域字体<br /> Range.PG(\\\"Cells\\\").PG(\\\"Font\\\").PS(\\\"Size\\\", 28);<br /> Range.PG(\\\"Cells\\\").PG(\\\"Font\\\").PS(\\\"Color\\\", RGB(0, 0, 255));<br /> 其中参数的设置:<br /> Font  Name : \\\"隶书\\\"  //字体名称<br />Size : 12  //字体大小<br /> Color : RGB(*,*,*)  //颜色<br /> Underline : true/false  //下划线<br /> Italic: true/false  //斜体<br /><br />◎ 设置单元格格式为小数百分比<br /> Sheet1.PG(\\\"Cells\\\", 1, 1).PS(\\\"NumberFormatLocal\\\", \\\"0.00%\\\");<br /><br />◎ 设定单元格的垂直对齐方式<br /> Range = ExcelApp.PG(\\\"Cells\\\", 3, 4);<br /> // 1=靠上 2=居中 3=靠下对齐 4=两端对齐 5=分散对齐<br /> Range.PS(\\\"VerticalAlignment\\\", 2);  <br /><br />◎ 设定单元格的文本为自动换行<br /> Range = ExcelApp.PG(\\\"Cells\\\", 3, 4);<br /> Range.PS(\\\"WrapText\\\", true);<br /> <br />★单元格的合并★<br /><br />◎ Range = Sheet1.PG(\\\"Range\\\", \\\"A1:A2\\\"); //A1和A2单元格合并<br /> String strRange = \\\"A\\\" + IntToStr(j) + \\\":\\\" + \\\"C\\\" + IntToStr(j); //比如：A1:C5<br /> Range1=Sheet1.PG(\\\"Range\\\", strRange.c_str()); //可以用变量控制单元格合并<br /> Range1.FN(\\\"Merge\\\", false);<br /><br />★读写单元格★<br /><br />◎ 指定单元格赋值<br /> String strValue = \\\"abcdefg\\\";<br /> Sheet1.PG(\\\"Cells\\\", 3, 6).PS(\\\"Value\\\", strValue.c_str()); <br /> Sheet1.PG(\\\"Cells\\\", j, 1).PS(\\\"Value\\\", \\\"总记录:\\\" + String(j-6));<br /> 或者使用<br /> Excel.Exec(PropertyGet(\\\"Cells\\\")&lt;&lt;1&lt;&lt;3).Exec(PropertySet(\\\"Value\\\")&lt;&lt;15);<br /><br />◎ 所选区域单元格赋值<br /> Range.PG(\\\"Cells\\\").PS(\\\"Value\\\", 10);  <br /><br />◎ 所选区域行赋值<br /> Range.PG(\\\"Rows\\\",1).PS(\\\"Value\\\", 1234); <br /><br />◎ 工作表列赋值<br /> Sheet1.PG(\\\"Columns\\\",1).PS(\\\"Value\\\", 1234); <br /><br />◎ 读取取值语句:<br /> String strValue = Sheet1.PG(\\\"Cells\\\", 3, 5).PG(\\\"Value\\\");<br /><br />★窗口属性★<br /><br />◎ 显示属性<br /> ExcelApp.PS(\\\"Windowstate\\\", 3);  //最大化显示<br />1---------xlNormal //正常显示<br />2---------xlMinimized  //最小化显示<br />3---------xlMaximized  //最大化显示<br /><br />◎ 状态栏属性<br /> ExcelApp.PS(\\\"StatusBar\\\", \\\"您好,请您稍等。正在查询！\\\");<br /> ExcelApp.PS(\\\"StatusBar\\\", false);  //还原成默认值<br /><br />◎ 标题属性:<br /> ExcelApp.PS(\\\"Caption\\\", \\\"查询系统\\\");<br /> <br />3、操作图表<br /><br />★添加图表<br /> <br /> Variant Chart; <br /> Chart = ExcelApp.Exec(PropertyGet(\\\"Charts\\\")).Exec(Function(\\\"Add\\\"));<br /> ExcelApp.Exec(PropertySet(\\\"Visible\\\") &lt;&lt; true);<br /> Chart.Exec(PropertySet(\\\"Type\\\") &lt;&lt; -4100);<br /><br />★滚动图表<br /><br /> for(int nRotate=5; nRotate &lt;= 180; nRotate += 5)<br /> {<br />Chart.Exec(PropertySet(\\\"Rotation\\\") &lt;&lt; nRotate);<br /> }<br /> for (int nRotate = 175; nRotate &gt;= 0; nRotate -= 5)<br /> {<br />Chart.Exec(PropertySet(\\\"Rotation\\\") &lt;&lt; nRotate);<br /> }<br /> <br />另外，为保证程序能正常运行，需要在程序中判断目标机器是否安装了Office;<br />try<br />{<br />ExcelApp = Variant::CreateObject (\\\"Excel.Application\\\");<br />}<br />catch(...)<br />{<br />ShowMessage(\\\"运行Excel出错,请确认安装了Office\\\");<br />return;<br />} <br /><br /><br />#include \\\"comobj.hpp\\\"<br />//---------------------------------------------------------------------------<br />// 对指定Excel文件中的指定列进行排序<br />// strExcelFileName : excel文件名<br />// nCol : 指定的列号<br />// nSortStyle : 1:升序，2:降序<br />void SortExcelColumn(String strExcelFileName, int nCol, int nSortStyle)<br />{<br />Variant vExcelApp, vWorkbook, vRange;<br />vExcelApp = Variant::CreateObject(\\\"Excel.Application\\\");<br />vExcelApp.OlePropertySet(\\\"Visible\\\", false);<br />vExcelApp.OlePropertyGet(\\\"WorkBooks\\\").OleProcedure(\\\"Open\\\", strExcelFileName.c_str());<br />vWorkbook = vExcelApp.OlePropertyGet(\\\"ActiveWorkbook\\\");<br />vExcelApp.OlePropertyGet(\\\"Columns\\\", nCol).OleProcedure(\\\"Select\\\");<br />vExcelApp.OlePropertyGet(\\\"ActiveSheet\\\").OlePropertyGet(\\\"Cells\\\", 1, nCol).OleProcedure(\\\"Select\\\");<br />vRange = vExcelApp.OlePropertyGet(\\\"Selection\\\");<br />vRange.Exec(Function(\\\"Sort\\\")&lt;&lt;vExcelApp.OlePropertyGet(\\\"Selection\\\")&lt;&lt;nSortStyle);<br />vWorkbook.OleProcedure(\\\"Save\\\");<br />vWorkbook.OleProcedure(\\\"Close\\\");<br />vExcelApp.OleFunction(\\\"Quit\\\");<br />vWorkbook = Unassigned;<br />vExcelApp = Unassigned;<br />ShowMessage(\\\"ok\\\");<br />}<br /><br />void __fastcall TForm1::Button1Click(TObject *Sender)<br />{<br />// 对C:\\\\123\\\\123.xls文件中第一个Sheet的第四列进行升序排序<br />SortExcelColumn(\\\"C:\\\\\\\\123\\\\\\\\123.xls\\\", 4, 1);<br />}<br />//---------------------------------------------------------------------------<br /><br /> <img src ="http://www.blogjava.net/WshmAndLily/aggbug/45843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-12 15:03 <a href="http://www.blogjava.net/WshmAndLily/articles/45843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BCB写文本文件</title><link>http://www.blogjava.net/WshmAndLily/articles/45842.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 May 2006 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45842.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45842.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45842.html</trackback:ping><description><![CDATA[void __fastcall TForm1::BitBtn2Click(TObject *Sender)<br />{<br /><br />int fileHandle = 0;<br />if(SaveDialog1-&gt;Execute())<br />{<br />if(FileExists(SaveDialog1-&gt;FileName))<br />{<br /> if(Application-&gt;MessageBoxA(\\\"该文件已经存在,是否替换？\\\",\\\"信息提示框\\\",MB_YESNO) == 6)<br /> {<br />fileHandle = FileCreate(SaveDialog1-&gt;FileName);<br />String str = \\\"第一列\\\\t\\\\t第二列\\\\t\\\\t第三列\\\\t\\\\t第四列\\\\t\\\\t第五列\\\\r\\\\n\\\";<br />FileWrite(fileHandle,str.c_str(), str.Length());<br />for(int i=0;i&lt;10;i++)<br />FileWrite(fileHandle,str.c_str(), str.Length());<br />FileClose(fileHandle);<br />ShowMessage(\\\"OK\\\");<br /> }<br />else<br />{<br /> return;<br />}<br /> }<br /> else<br /> {<br /> fileHandle = FileCreate(SaveDialog1-&gt;FileName);<br />String str = \\\"第一列\\\\t\\\\t第二列\\\\t\\\\t第三列\\\\t\\\\t第四列\\\\t\\\\t第五列\\\\r\\\\n\\\";<br />FileWrite(fileHandle,str.c_str(), str.Length());<br />for(int i=0;i&lt;10;i++)<br />FileWrite(fileHandle,str.c_str(), str.Length());<br />FileClose(fileHandle);<br />ShowMessage(\\\"OK\\\");<br /> }<br /><br />}<br /><br />} <img src ="http://www.blogjava.net/WshmAndLily/aggbug/45842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-12 15:02 <a href="http://www.blogjava.net/WshmAndLily/articles/45842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将数据到Excel文件</title><link>http://www.blogjava.net/WshmAndLily/articles/45841.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 May 2006 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45841.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45841.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45841.html</trackback:ping><description><![CDATA[#include &lt;vcl.h&gt;<br />#pragma hdrstop<br />#include \\\"Comobj.hpp\\\" //必须包含的头文件<br /><br />#include \\\"Unit1.h\\\"<br />//---------------------------------------------------------------------------<br />#pragma package(smart_init)<br />#pragma resource \\\"*.dfm\\\"<br />#define  PG  OlePropertyGet //主要用到的便于编写的四个宏定义<br />#define  PS  OlePropertySet<br />#define  FN  OleFunction<br />#define  PR  OleProcedure<br /><br />TForm1 *Form1;<br />//---------------------------------------------------------------------------<br />__fastcall TForm1::TForm1(TComponent* Owner)<br />: TForm(Owner)<br />{<br />}<br />//---------------------------------------------------------------------------<br /><br />void __fastcall TForm1::BitBtn1Click(TObject *Sender)<br />{<br /> Variant ExcelApp = CreateOleObject (\\\"Excel.Application\\\"); //创建一个工作簿对象<br /> SaveDialog1-&gt;Execute(); //执行保存对话框<br /> ExcelApp.PG(\\\"workbooks\\\").FN(\\\"Add\\\", 6);// 向工作簿对象添加一张工作表<br /> Variant WorkBook1;<br /> WorkBook1 = ExcelApp.PG(\\\"ActiveWorkBook\\\");//获取活动工作薄<br />Variant Sheet1;<br /> Sheet1 = WorkBook1.PG(\\\"ActiveSheet\\\");//获取活动的工作表<br /> for (int i=1;i&lt;=10;i++)<br />for (int j=1;j&lt;=10;j++)<br /> Sheet1.PG(\\\"Cells\\\",i,j).PS(\\\"Value\\\",i*100+j);//循环向工作表中添加数据<br /> Sheet1.PS(\\\"Name\\\", \\\"Sheet的新名字\\\"); //工作簿重命名<br /> WorkBook1.PR(\\\"SaveAs\\\", SaveDialog1-&gt;FileName.c_str());//存储在指定的保存对话框文件名的文件上<br /> WorkBook1.PR(\\\"Close\\\");//关闭工作簿<br /> ExcelApp.FN(\\\"Quit\\\");//关闭Excel程序<br />}<br />//--------------------------------------------------------------------------- <img src ="http://www.blogjava.net/WshmAndLily/aggbug/45841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-12 15:00 <a href="http://www.blogjava.net/WshmAndLily/articles/45841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi BCB提示信息框（MessageBox）的应用</title><link>http://www.blogjava.net/WshmAndLily/articles/45839.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 May 2006 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45839.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45839.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45839.html</trackback:ping><description><![CDATA[提示信息框（MessageBox）的应用<br />作者：<br /> <br /><br />　应用程序中的提示信息处理程序是非常出重要的部分，用户要知道他输入的资料到底正不正确<br /><br />，或者是应用程序有一些提示信息要告诉用户，都必须通过提示信息处理程序来显示适当的信息，<br /><br />让用户了解下一步该如何配置。提示信息有很多种类，包括警告，错误，提示，确认，重试等。不<br /><br />同种类的提示信息框适合用在各种不同的情况。<br /><br />　　在C++Builder中开发提示信息框只须调用MessageBox这个信息提示框函数就行，下面就是这个<br /><br />函数说明：<br /><br />int __fastcall MessageBox(const char * Text,//提示信息框的内容<br /><br />const char * Caption, //提示信息框的标题<br /><br />int Flags); //提示信息框的类别<br /><br />　　参数Flags的值是用来标志提示信息框的类别的，下面是一些常用的类别：<br /><br />参数值 样式 意义<br />MB_ICONWARNING 含图标、固定按钮 警告信息框<br />MB_ICONQUESTION 含图标、固定按钮 疑问信息框<br />MB_IConERROR 含图标、固定按钮 错误信息框<br />MB_ICONASTERISK 含图标、固定按钮 提示信息框<br />MB_HELP 不含图标、可改变按钮 说明信息框<br />MB_OK 不含图标、可改变按钮 提示信息框<br />MB_OKCANCEL 不含图标、可改变按钮 确认信息框<br />MB_RETRYCANCEL 不含图标、可改变按钮 重试信息框<br />MB_YESNO 不含图标、可改变按钮 是否信息框<br />MB_YESNOCANCEL 不含图标、可改变按钮 是否取消信息框<br /><br />　　从上表可以看出来，提示信息框的类别可以分成含图标和不含图标，含图标的意思就是指提示<br /><br />信息框上会有代表意义的图形，不过这类型的提示信息框的按钮都是固定的，都是【确定】按钮，<br /><br />不能增加也不能省略；不含图标的提示信息框，虽然没有对应的图形显示在提示信息框上，可是你<br /><br />却可以在这种类型的提示信息框内，加入各种组合的按钮，用于各种不同的情况。<br /><br /><br />MessageBox函数会返回一个整数值，这个整数值代表用户刚刚点击提示信息框上的哪个按钮，每个<br /><br />返回值的代表意义在下表：<br /><br />返回值 数值 意义<br />IDOK 1 确定<br />IDCANCEL 2 取消<br />IDABORT 3 中断<br />IDRETRY 4 重试<br />IDIGNORE 5 忽略<br />IDYES 6 是<br />IDNO 7 否<br /><br /><br />下面是提示信息框的示范程序：<br /><br />1． 警告信息框<br /><br />Application-&gt;MessageBox(\\\"警告信息框\\\",\\\"警告信息框\\\",MB_ICONWARNING);<br /><br />2．疑问信息框<br /><br />Application-&gt;MessageBox(\\\"疑问信息框\\\",\\\"疑问信息框\\\",MB_ICONQUESTION);<br /><br />3．错误提示框<br /><br />Application-&gt;MessageBox(\\\"错误信息框\\\",\\\"错误信息框\\\",MB_IConERROR);<br /><br />4．提示信息框<br /><br />Application-&gt;MessageBox(\\\"提示信息框\\\",\\\"提示信息框\\\",MB_ICONASTERISK);<br /><br />5．说明信息框<br /><br />Application-&gt;MessageBox(\\\"说明信息框\\\",\\\"说明信息框\\\",MB_HELP);<br /><br />6．提示信息框<br /><br />Application-&gt;MessageBox(\\\"提示信息框\\\",\\\"提示信息框\\\",MB_OK);<br /><br />7．确认信息框<br /><br />Application-&gt;MessageBox(\\\"确认信息框\\\",\\\"确认信息框\\\",MB_OKCANCEL);<br /><br />8．重试信息框<br /><br />Application-&gt;MessageBox(\\\"重试信息框\\\",\\\"重试信息框\\\",MB_RETRYCANCEL);<br /><br />9．是否信息框<br /><br />Application-&gt;MessageBox(\\\"是否信息框\\\",\\\"是否信息框\\\",MB_YESNO);<br /><br />10．是否取消信息框<br /><br />Application-&gt;MessageBox(\\\"是否取消信息框\\\",\\\"是否取消信息框\\\",MB_YESNOCANCEL);<br /><br />　　在C++Builder中，还提供了一个很简单的信息提示框函数，那就是ShowMessage。这个函数只<br /><br />有一个字符串参数，你可以把要显示的字符串放到这个字符串参数里面，ShowMessage就回显示出<br /><br />该信息，但是没有图标，也没有按钮，只有单纯的字符串信息而已。<br /><br />下面是ShowMessage函数的说明：<br /><br />extern PACKAGE void __fastcall ShowMessage(const AnsiString Msg);<br /><br />例子：<br /><br />ShowMessage(\\\"这个就是ShowMessage函数生成的信息提示框！\\\");<br />Application-&gt;MessageBox(\\\"AA\\\", \\\"BB\\\", MB_OK | MB_ICONSTOP);<br />或<br />MessageBox(Application-&gt;Handle,\\\"AA\\\", \\\"BB\\\", MB_OK | MB_ICONSTOP);<br />这种写法“级别”最高：如果弹出这样的对话框，不点掉，Application下所有的Form都<br />不能“动”的。<br /><br />MessageBox(Form1-&gt;Handle,\\\"AA\\\", \\\"BB\\\", MB_OK | MB_ICONSTOP);<br />这种写法“级别”其次：如果弹出这样的对话框，不点掉，只有From1不能“动”，其他<br />Show()的From还可以点。<br /><br />MessageBox(NULL,\\\"AA\\\", \\\"BB\\\", MB_OK | MB_ICONSTOP);<br />这种写法“级别”最低：如果弹出这样的对话框，不点掉，From1也能“动”，其他<br />Show()的From也可以点。<br /><img src ="http://www.blogjava.net/WshmAndLily/aggbug/45839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-12 14:59 <a href="http://www.blogjava.net/WshmAndLily/articles/45839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些关于BCB的文档资料链接</title><link>http://www.blogjava.net/WshmAndLily/articles/45463.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 10 May 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45463.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45463.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45463.html</trackback:ping><description><![CDATA[1.<a href="http://nemolog.cnblogs.com/">http://nemolog.cnblogs.com/</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/45463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-10 15:10 <a href="http://www.blogjava.net/WshmAndLily/articles/45463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Builder实现人民币小写转大写</title><link>http://www.blogjava.net/WshmAndLily/articles/45453.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 10 May 2006 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/45453.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/45453.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/45453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/45453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/45453.html</trackback:ping><description><![CDATA[
		<p>1、rmb.h</p>
		<p>
				<br />#ifndef rmbH<br />#define rmbH</p>
		<p>// for AnsiString def<br />// #include </p>
		<p>// 数值转大写人民币函数<br />AnsiString NumToRMBStr(double val);</p>
		<p>
				<br />// 正整数字符串转汉字函数，不建议单独使用<br />// 输入字符串必须正整数，只允许前导空格(必须右对齐)，不宜有前导零<br />// AnsiString PositiveIntegerToHanStr(const AnsiString &amp;NumStr);</p>
		<p>#endif<br /></p>
		<p>2、rmb.cpp</p>
		<p>
				<br />#include         // must define AnsiString before rmb.h<br />#pragma hdrstop         // only for C++ Builder</p>
		<p>#include <br />#include "rmb.h"</p>
		<p>//---------------------------------------------------------------------------</p>
		<p>
				<br />// 常量字符串定义，如修改也可变为转换普通汉字函数（如：一二三，十百千）<br />const char *HanDigiStr[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};</p>
		<p>const char *HanDiviStr[] = { "","拾","佰","仟","万","拾","佰","仟","亿",<br />    "拾","佰","仟","万","拾","佰","仟","亿",<br />    "拾","佰","仟","万","拾","佰","仟" };</p>
		<p>AnsiString PositiveIntegerToHanStr(const AnsiString &amp;NumStr)<br />{     // 输入字符串必须正整数，只允许前导空格(必须右对齐)，不宜有前导零<br /> AnsiString RMBStr;<br /> int len,n,lastzero=0;<br /> int hasvalue=0;   // 亿、万进位前有数值标记</p>
		<p> len = NumStr.Length();<br /> if( len &gt; 24 ) return "数值过大!";</p>
		<p> for(int i=len-1;i&gt;=0;i--) {<br />  if( NumStr[len-i]==' ' ) continue;      // AnsiString[] base is 1<br />  n = NumStr[len-i] - '0';<br />  if( n&lt;0 || n&gt;9 ) return "输入含非数字字符!";</p>
		<p>  if( n!=0 ) {<br />   if( lastzero ) RMBStr += HanDigiStr[0];  // 若干零后若跟非零值，只显示一个零<br />                                                                        // 除了亿万前的零不带到后面<br />//   if( !( n==1 &amp;&amp; (i%4)==1 &amp;&amp; (lastzero || i==len-1) ) )   // 如十进位前有零也不发壹音用此行<br />//   if( !( n==1 &amp;&amp; (i%4)==1 &amp;&amp; i==len-1 ) )         // 十进位处于第一位不发壹音<br />    RMBStr += HanDigiStr[n];<br />   RMBStr += HanDiviStr[i];   // 非零值后加进位，个位为空<br />   hasvalue = 1;                                   // 置万进位前有值标记<br />   }<br />  else {<br />   if( (i%8)==0 || ((i%8)==4 &amp;&amp; hasvalue) )  // 亿万之间必须有非零值方显示万<br />    RMBStr += HanDiviStr[i];  // "亿"或"万"<br />   }<br />                if( i%8==0 ) hasvalue = 0;     // 万进位前有值标记逢亿复位<br />  lastzero = (n==0) &amp;&amp; (i%4!=0);                  // 亿万前有零后不加零，如：拾万贰仟<br />  }</p>
		<p> if( RMBStr.Length()==0 ) return HanDigiStr[0];         // 输入空字符或"0"，返回"零"<br /> return RMBStr;<br />}</p>
		<p>AnsiString NumToRMBStr(double val)<br />{<br /> AnsiString SignStr,TailStr;<br /> double fraction, integer;<br /> int jiao,fen;</p>
		<p> if( val&lt;0 ) {<br />  val = -val;<br />  SignStr = "负";<br />  }<br /> fraction = modf(val+0.005, &amp;integer);           // 四舍五入到分</p>
		<p> jiao = int(fraction*10);<br /> fen = int(fraction*100)-jiao*10;<br /> if( jiao==0 &amp;&amp; fen==0 ) {<br />  TailStr = "整";<br />  }<br /> else {<br />  TailStr = HanDigiStr[jiao];<br />  if( jiao!=0 )<br />   TailStr += "角";<br />                if( integer==0 &amp;&amp; jiao==0 )             // 零元后不写零几分<br />                        TailStr = "";<br />  if( fen!=0 )<br />   TailStr += HanDigiStr[fen] + AnsiString("分");<br />  }</p>
		<p>// 下一行可用于非正规金融场合，0.03只显示"叁分"而不是"零元叁分"<br />//        if( integer==0 ) return  SignStr+TailStr;</p>
		<p> return SignStr+PositiveIntegerToHanStr( AnsiString(integer) )+"元"+TailStr;<br />}</p>
		<p>//-----------------------------------------------------------</p>
		<p>// 基本考虑<br />// 人民币大写单位银行规定用"元"<br />// 无零头金额后跟"整"，有则不跟<br />// 角为零时不写角（如：零叁分）<br />// 四舍五入到分<br />// 为减少判读疑惑（一般对大写金额预期较高）和<br />// 体现人民币基本单位为元，金额低于壹圆前仍加"零元"</p>
		<p>// 整数转换<br />// 若干零后若跟非零值，只显示一个零，否则不显示<br />// 万(亿)前有零后不加零，因亿、万为一完整单位，<br />// （如：拾万贰仟 比 拾万零贰仟 更顺些）<br />// 亿为汉语计数最大单位，只要进位到总是显示（如：壹亿亿）<br />// 万为次最大单位，亿万之间必须有非零值方显示万<br />// （如"壹亿"不可显示为"壹亿万"）<br />//<br />// 为减少被窜改的可能性，十进位总发壹音，这和下面的习惯读法不一样<br />//      （十进位处于第一位不发壹音，如"拾元"非"壹拾元"，<br />//        十进位处前有零是否不发壹音不太确定，<br />//        如"叁仟零壹拾元"还是"叁仟零拾元"？）<br />// 用"拾万"不用"壹拾万"，因为每个整数进位后都有进位单位（拾佰仟万亿）<br />// 这样即使金额前没有附防窜改的前缀如"人民币"字样也难窜改些<br />// 因为至少要加添两个汉字并且改动后数字必须进位才能窜改成<br />// （如"拾万"可改成"叁拾万"，而"壹拾万"至少要改成"壹佰壹拾万"）</p>
		<p>
				<br />// 此函数为Borland C++ Builder编写，已充分考虑到跨平台兼容性<br />// 如需转换到其它场合，<br />// 只需修改字符串类型从AnsiString到对应的类型、功能及函数<br />// （注意两个char*型字符串不可以直接相加，需有一个先转换）</p>
		<p> </p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/45453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-05-10 14:47 <a href="http://www.blogjava.net/WshmAndLily/articles/45453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>