﻿<?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-谈笑有鸿儒，往来无白丁-随笔分类-DELPHI</title><link>http://www.blogjava.net/badboyryan/category/15077.html</link><description>&lt;hr color=red&gt;
&lt;marquee  direction=left bgcolor= aaaaee behavior=scroll scrollamount=2 onmouseover="this.stop();" onmouseout="this.start();" width=500&gt;
&lt;font color=green&gt; 在恰当的时间、地点以恰当的方式表达给恰当的人...&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color=blue&gt;阅读的时候请注意分类，佛曰我日里面是谈笑文章，其他是各个分类的文章，积极的热情投入到写博的队伍中来，支持blogjava做大做强！向dudu站长致敬&gt;&gt; &gt;  （qq群侠客岛:26858781）&lt;/font&gt;
&lt;/marquee&gt; 
&lt;hr color=blue&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 07 May 2011 00:14:14 GMT</lastBuildDate><pubDate>Sat, 07 May 2011 00:14:14 GMT</pubDate><ttl>60</ttl><item><title>图片上传怎么变慢了</title><link>http://www.blogjava.net/badboyryan/archive/2011/05/06/349657.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 06 May 2011 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2011/05/06/349657.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/349657.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2011/05/06/349657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/349657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/349657.html</trackback:ping><description><![CDATA[<p>1、第一张图片传的慢，第二张图片传的快<br />
2、上传仅仅有0.6k的速度<br />
3、第二张54k的速度<br />
4、解决办法：清理一下临时表；BLOG字段的事</p>
 <img src ="http://www.blogjava.net/badboyryan/aggbug/349657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2011-05-06 09:45 <a href="http://www.blogjava.net/badboyryan/archive/2011/05/06/349657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELPHI里面的技巧如何运行的时候给常量赋值</title><link>http://www.blogjava.net/badboyryan/archive/2009/08/15/291229.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sat, 15 Aug 2009 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2009/08/15/291229.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/291229.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2009/08/15/291229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/291229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/291229.html</trackback:ping><description><![CDATA[加上这个编译器选项常量就可以赋值了；<br />
{$J+}<br />
const<br />
&nbsp; n: Integer = 1;<br />
begin<br />
&nbsp; n := 112;<br />
end;<br />
<br />
这在Turbo pascal中是合法的. 注意, 这里虽然也是用const声明的, 但相当于带初始值的变量. 在Delphi中, 有的版本可以, 有的版本需用{$J+}编译指令才行. 
<img src ="http://www.blogjava.net/badboyryan/aggbug/291229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2009-08-15 09:31 <a href="http://www.blogjava.net/badboyryan/archive/2009/08/15/291229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi使用资源文件全攻略 </title><link>http://www.blogjava.net/badboyryan/archive/2009/02/06/253555.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 06 Feb 2009 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2009/02/06/253555.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/253555.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2009/02/06/253555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/253555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/253555.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 在通常情况下使用delphi设计程序，都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中，这样做会合修改这些资源时带来不便，如果资源被多次引用，这些资源在程序启动时都被加载到内存中，非常耗费系统资源。因此，这就需要一种新的引用资源的文件：资源文件。资源文件就是将一些资源，如字符串、图像等信息进行编译，然后在程序中引用编译后的资源文件，最后和源程序一起编译生成可执行文件。由于在资源文件中的资源是在需要时加载，因此，比较节省系统资源，而且，如果要做国际化版本的系统，只需要将资源文件一换，重新编译即可。下面就详细介绍delphi中资源文件的建立和使用。<br />
<br />
一、建立资源文件<br />
<br />
&nbsp;&nbsp;&nbsp; 资源文件的源文件是普通的文本文件，扩展名是*.rc。将资源文件的内容写入文件后，调用brcc32.exe将其编译后生成*.res文件。brcc32.exe在delphi的bin目录中。<br />
<br />
二、字符串资源<br />
<br />
&nbsp;&nbsp;&nbsp; 字符串资源实际上是将一个字符串和一个数字索引对应，在装载字符串资源时，需要提供这个字符串资源所对应的数字索引。字符串资源文件以stringtable开头，使用一对begin和and将资源定义括起来。 字符串资源的格式是：数字索引，"资源字符串"。<br />
string.rc文件内容<br />
stringtable<br />
begin<br />
1001, "新建"<br />
1002, "保存"<br />
1003, "关闭"<br />
1004, "帮助"<br />
1005, "退出"<br />
1006, "资源文件测试"<br />
End<br />
&nbsp;&nbsp;&nbsp; 然后调用命令：brcc32.exe string.rc ，生成string.res，最后在程序中加入{$R string.res}。以下所述的*.rc文件都需使用类似的方法进行编译和引用。<br />
<br />
&nbsp;&nbsp;&nbsp; 在delphi中有两种方法可以装载字符串资源。<br />
&nbsp;&nbsp;&nbsp; 1. 使用Windows API函数LoadString。使用这个函数需要定义一个char数组，调用的形式如下。<br />
<br />
&nbsp;&nbsp;&nbsp; LoadString(hInstance, 1001, buffer, 100); //100：buffer数组的最大长度，1001：数字索引<br />
<br />
&nbsp;&nbsp;&nbsp; 2. 使用delphi自身的函数LoadStr。这个函数只需要一个数字索引就可得到相应的字符串资源。调用的形式如下。<br />
<br />
&nbsp;&nbsp;&nbsp; button2.Caption := LoadStr(1002);<br />
<br />
三、Bitmap资源<br />
<br />
&nbsp;&nbsp;&nbsp; 位图资源的定义就相对简单得多。每个位图资源只需要定义三项：位图标识 位图类型 位图文件名 （这三项中间用空格或tab隔开）其中位图标识和字符串资源的数字索引类似，只是位图标识可以是字符串。位图类型是BITMAP。<br />
<br />
&nbsp;&nbsp;&nbsp; 调用bitmap资源有两种比较常用的方法。<br />
&nbsp;&nbsp;&nbsp; 1. 使用bitmap的LoadFromResourceName方法。<br />
&nbsp;&nbsp;&nbsp; 2. 使用windows API函数LoadBitmap。这种方法的代码示例如下：<br />
&nbsp;&nbsp;&nbsp; bmp := TBitmap.Create ;<br />
&nbsp;&nbsp;&nbsp; bmp.Handle := LoadBitmap(Hinstance,'bmp');<br />
&nbsp;&nbsp;&nbsp; rect.Left := 0;<br />
&nbsp;&nbsp;&nbsp; rect.Top := 0;<br />
&nbsp;&nbsp;&nbsp; rect.Right := image2.Width;<br />
&nbsp;&nbsp;&nbsp; rect.Bottom := image2.Height;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; rect1.Left := 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; rect1.Top := 0;<br />
&nbsp;&nbsp;&nbsp; rect1.Right := bmp.Width;<br />
&nbsp;&nbsp;&nbsp; rect1.Bottom := bmp.Height;<br />
&nbsp;&nbsp;&nbsp; image2.Canvas.CopyRect(rect, bmp.Canvas, rect1);<br />
&nbsp;&nbsp;&nbsp; 第一种方法比较简单，但如果是拉伸装载时，第二种方法效果比较好。也可用类似的方法装载icon和cursor文件，其中装载icon使用LoadIcon，装载cursor使用LoadCursor。<br />
<br />
四、Jpeg资源<br />
<br />
&nbsp;&nbsp;&nbsp; 装载Jpeg资源没有Windows API，但可以使用delphi提供的TResourceStream类。在定义资源文件时，资源类型使用RCDATA。示例代码如下：<br />
&nbsp;&nbsp; jpg := TJpegImage.Create ;<br />
&nbsp;&nbsp; rstream := TResourceStream.Create(Hinstance, 'jpg', RT_RCDATA) ; <br />
&nbsp;&nbsp; jpg.LoadFromStream (rstream) ;<br />
&nbsp;&nbsp; image3.Picture.Bitmap.Assign (jpg);<br />
<br />
五、装载任意文件<br />
<br />
&nbsp;&nbsp;&nbsp; 资源文件中不仅可以存储已知类型的资源，如字符串、bitmap、jpeg等，还可以存储任意类型的文件。除了字符串，其它类型的资源文件的格式类似，只是在资源类型上有所变化。除了已知的资源类型外，可以自定义资源类型。如jpeg资源可以不用RCDATA，而用JPEG,但在调用时需要做如下处理。<br />
rstream := TResourceStream.Create(Hinstance, 'jpg1', 'JPEG') ; <br />
<br />
六、从其它程序装载资源<br />
<br />
&nbsp;&nbsp;&nbsp; 在上述的例子中的资源都是从当前的exe中装载，但有些时候需要从另外的exe或dll，而不是自身装载资源。对于这种需求只要在上述例子中将Hinstance改为LoadLibrary(exe或dll名)即可。<br />
&nbsp; rstream := TResourceStream.Create(LoadLibrary('project1.exe'), 'jpg1', 'JPEG') ;<br />
&nbsp; 在装载后，可以使用TResourceStream的SaveToFile将资源保存成文件，或做其它处理。<br />
<br />
此文转载，原文出处：<br />
http://www.blogjava.net/nokiaguy/archive/2008/05/10/199740.html
<img src ="http://www.blogjava.net/badboyryan/aggbug/253555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2009-02-06 14:32 <a href="http://www.blogjava.net/badboyryan/archive/2009/02/06/253555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dsgnintf.pas单元在D6及D7中找不到的解决方法</title><link>http://www.blogjava.net/badboyryan/archive/2008/05/13/200239.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 13 May 2008 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2008/05/13/200239.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/200239.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2008/05/13/200239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/200239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/200239.html</trackback:ping><description><![CDATA[不改包,直接改Delphi源文件的解决方法:(我是这样改的,没有出什么问题)<br />
1.加入搜索路径<br />
C:\Program Files\Borland\Delphi7\Source\ToolsAPI<br />
2.打开<br />
C:\Program Files\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas<br />
3.找到并把<br />
uses<br />
&nbsp;&nbsp; Types, SysUtils, Classes, TypInfo, Variants, DesignIntf, DesignMenus,Proxies;<br />
改为<br />
uses<br />
&nbsp;&nbsp; Types, SysUtils, Classes, TypInfo, Variants, DesignIntf, DesignMenus{,Proxies};<br />
4.找到并把<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FAncestor = nil) and (Component &lt;&gt; Designer.Root)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and IsProxyClass(Component.ClassType) then<br />
改为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FAncestor = nil) and (Component &lt;&gt; Designer.Root)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {and IsProxyClass(Component.ClassType)} then<br />
5.找到并把<br />
&nbsp;&nbsp; while IsProxyClass(ComponentClass) do<br />
改为<br />
&nbsp;&nbsp; //while IsProxyClass(ComponentClass) do<br />
6.保存,编译运行,OK<br />
<br />
上面3.4.5.就是把Proxies单元从DesignEditors单元中剔除,DesignEditors单元<br />
中只有两个地方引用了Proxies单元的函数,而且是同一个函数:IsProxyClass,把<br />
这两个地方注释掉就可以了. 低版本升级到高版，d5-&gt;d7时，在dpk文件里　requires designide;就可以uses ComponentDesigner单元了。
<img src ="http://www.blogjava.net/badboyryan/aggbug/200239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2008-05-13 16:57 <a href="http://www.blogjava.net/badboyryan/archive/2008/05/13/200239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Delphi采用COM来操作Access</title><link>http://www.blogjava.net/badboyryan/archive/2008/03/08/184755.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sat, 08 Mar 2008 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2008/03/08/184755.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/184755.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2008/03/08/184755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/184755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/184755.html</trackback:ping><description><![CDATA[<span class="txt"><span class="smallFont">作为一个ASP爱好者，笔者经常在ASP页面中使用ADO对象操 作ODBC数据库，觉得用ASP创建Web应用系统确实是挺方便的。虽然在编程生涯中，笔者更喜欢Borland系列产品，对微软产品有点排斥，但对 ASP却是例外。某天，忽然想到，ADO对象是一个标准OLE对象，如果在<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>应用程序中能利用ADO操作数据库，应该挺不错。尤其在用<strong style="color: black; background-color: rgb(255,255,102)">DELPHI</strong>做网络数据库应用程序时，如果所在的Web站点是WINNT站点并且支持ASP页面，那就可以用ADO对象访问ODBC数据库，而不用把那么大的BDE再上载到站点上去。这样就可充分利用<strong style="color: black; background-color: rgb(255,255,102)">DELPHI</strong>和ASP的编程优势，做出更好的ISAPI/NSAPI/CGI。经过编程和测试，在<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>中可以成功地用ADO对象存取ODBC数据库，现将本人的使用经验写出来，与大家共享，让我们多一个访问ODBC数据库的方法。<br />
<br />
在32位的<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>中，可以声明一个variant变量（如AVariant），然后通过<a name="baidusnap2"></a><strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong>创建一个OLE对象，如AVariant:=<strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong> (&#8217;ADODB.Connection&#8217;)可以获得一个数据库连接对象的实例，然后就可以利用该对象的方法和属性来操作ODBC数据库了。<br />
下面简单介绍一下访问ODBC数据库所用到的ADO对象及其方法和属性。<br />
</span>
<p><span class="smallFont">1、数据库连接对象(ADODB. Connection)<br />
该对象用于与ODBC数据库建立连接，所有对数据库的操作均通过该连接进行。<br />
数据库连接对象ADODB. Connection的作用象<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>中的TDatabase对象。<br />
建立一个连接对象的方法为(AConnection为Variant类型变量)：<br />
AConnection:=<strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong>(&#8217;A DODB.Connection&#8217;)<br />
用于建立连接的方法为Open，使用语法为(以对象AConnection为例)：<br />
AConnection.Open( ConnectionString, UserId, Password )<br />
三个参数均为字符串类型，其中UserId和Password为用户名称和用户密码，用于访问数据库使用时可以省略，因为在 ConnectionString同样可以指定用户名称和用户密码。ConnectionString是用来说明ODBC数据源信息的字符串，其格式为：<br />
&#8217;Provider=ProviderName; DSN=DSNName; DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password&#8217;<br />
其中：<br />
Provider：数据提供者，默认状态下为MSDASQL，为微软OLEDB，通常省略；<br />
DSN：要打开的数据库对应的OBDC系统数据源(DSN)，是可选参数；<br />
DRIVER：要打开的数据库所用的驱动程序名称，如<a name="baidusnap1"></a><strong style="color: black; background-color: rgb(160,255,255)">Access</strong>对应Microsoft <strong style="color: black; background-color: rgb(160,255,255)">Access</strong> Driv (*.mdb)，是可选参数；<br />
SERVER：要打开的数据库所在的服务器名称，本机可用(local)，是可选参数；<br />
DATABASE：要打开的数据库名称，是可选参数；<br />
UID：用户名称，用来访问数据库，是可选参数；<br />
PWD：用户密码，用来访问数据库，是可选参数。<br />
以上参数均为可选参数，但必须提供足够的信息来描述一个系统数据源。<br />
假如已经定义了一个ODBC的系统DSN，名称为MyDsn，那么就可用以下语句建立一个数据库连接：<br />
AConnection.Open(&#8217;DSN=MyDsn&#8217;);<br />
为了防止DSN不存在或其设置被他人修改时造成应用程序运行错误，可以用ADODB.Connection 创建一个临时ODBC数据源，这样可以保证我们使用的系统DSN的参数设置是正确的。下面的语句可以创建一个临时ODBC系统DSN，对应一个<strong style="color: black; background-color: rgb(160,255,255)">ACCESS</strong>数据库，路径为C:\Inetpub\ wwwroot\ test.mdb：<br />
AConnection.open(&#8217;Driver= {Microsoft <strong style="color: black; background-color: rgb(160,255,255)">Access</strong> Driver (*.mdb)};DBQ=C:\inetpub \wwwroot\test.mdb&#8217;)<br />
建立一个ADODB.Connection后，如果不需要返回操作结果(如删除，修改，更新等操作)就可以对数据库进行正常的SQL操作了，此时应用ADODB.Connection的另外一个方法Execute，使用语法为：<br />
AConnection.Execute( strSQL );<br />
其中strSQL为执行操作的SQL语句，如删除操作可以为：delete from wfjcommu。用AConnection.Close关闭一个数据库连接。<br />
</span></p>
<p><span class="smallFont">2、数据集对象(ADODB. RecordSet)<br />
如果要执行查询操作并返回查询结果，或者要更方便地操作数据表，那就需要用到数据集对象了。<br />
数据集对象ADODB.RecordSet的作用象<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>中的TTable或TQuery对象。<br />
建立一个数据集对象的方法为(ARecordSet为Variant类型变量)：<br />
ARecordSet:=<strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong> (&#8217;ADODB.RecordSet&#8217;)<br />
从数据表取得数据的方法为Open方法，具体使用方法为：<br />
ARecordSet.Open( strCommand,ActiveConnection,int CursorType,intLockType, intCommandType );<br />
其中：<br />
strCommand：字符串，为命令参数，可以是一个Table名称，可以是一个SQL语句，也可以是一个服务器上的存储过程(StoredProc)名称，具体需要后面的参数intCommandType来指定。<br />
ActiveConnection：要使用的数据库连接，是一个ADODB. Connection对象。<br />
intCursorType：长整数，数据集的Cursor类型，可选参数，请参见程序中注释。<br />
intLockType：长整数，对数据表的加锁类型，可选参数，请参见程序中注释。<br />
intCommandType：长整数，命令参数的类型，用来指明strCommand的作用，可以指定strCommand为命令（如SQL语句）或数据表(TTable)或储存过程(StoredProc)，可选参数，请参见程序中注释。<br />
如执行一个SQL查询，可以采用如下语句：<br />
ARecordSet.Open(&#8217;Select * from wfjcommu&#8217;,adOpenStatic,ad LockOptimistic,adCmdText);<br />
其它常见属性和方法与TTable和TQuery相比较如下（具体请见ASP帮助文件）：<br />
eof,bof: eof,bof．MoveFirst, MoveLast: First, LastMovePrevious, MoveNext: Prior, NextMove: MoveByAddNew: appendUpdate: PostClose: close<br />
Delete加Update：delete，所有对数据表的修改均须用Update使操作有效，这与<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>不同。<br />
Fields[FieldNo]: Fields[FieldNo]<br />
Fields[&#8217;FieldName&#8217;]: FieldByName(&#8217;FieldName&#8217;)<br />
</span></p>
<p><span class="smallFont">3、其他常见对象(与<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>对应的对象)：<br />
ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError<br />
ADODB.Command：无 ADODB.Property：无<br />
下面来看一个应用例子：<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
{*****************************************************<br />
用ADO操作ODBC数据库<br />
本程序中，将创建一个临时的ODBC系统数据源，指向一个MsAccess数据库，然后对其中的数据表进行显示、增加、修改、删除和查询操作<br />
注意：请在Uses语句中包含ComObj单元<br />
*****************************************************}<br />
const{一些常量声明，详细请参见adovbs.inc}<br />
{---- CommandType的常量说明 ----}<br />
adCmdUnknown = 0008;//未知,需要系统来判断,速度慢,为缺省值<br />
adCmdText = 0001;//命令语句如SQL语句<br />
adCmdTable = 0002;//数据表名称<br />
adCmdStoredProc = 0004;//存储过程名称<br />
<br />
{---- CursorType的常量说明 ----}<br />
adOpenForwardOnly = 0;//只能由前向后单向访问,为缺省值<br />
adOpenKeyset = 1;//可见其他用户对数据的修改,但对其它用户的增加和删除不可见<br />
adOpenDynamic = 2;//其他用户对数据的增加修改和删除均可见<br />
adOpenStatic = 3;//其他用户对数据的增加修改和删除均不可见<br />
<br />
{---- LockType的常量说明 ---}<br />
adLockReadOnly = 1;//只读,为缺省值<br />
adLockPessimistic = 2;//在修改时,按单个记录锁定<br />
adLockOptimistic = 3;//在修改后更新时,按单个记录锁定<br />
adLockBatchOptimistic = 4;//在成批更新时记录锁定<br />
var<br />
AConnection, ARecordSet : variant;<br />
longintTemp : integer;<br />
strTemp : string;<br />
intIndex : integer;<br />
begin<br />
{创建一个临时的ODBC数据源,指向一个MsAccess数据库,并利用此DSN建立一个数据库连接}<br />
AConnection := <strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong>(&#8217;ADODB.Connection&#8217;);<br />
AConnection.Open(&#8217;Driver={Microsoft <strong style="color: black; background-color: rgb(160,255,255)">Access</strong> Driver (*.mdb)};DBQ=C:\inetpub\wwwroot\test&#8217;);<br />
<br />
{建立一个数据集对象,并从数据表中提取数据}<br />
ARecordSet := <strong style="color: black; background-color: rgb(153,255,153)">CreateOleObject</strong>(&#8217;ADODB.RecordSet&#8217;);<br />
ARecordSet.open( &#8217;wfjcommu&#8217;,AConnection,adOpenStatic,adLockOptimistic,adCmdTable );<br />
<br />
memo1.lines.clear;<br />
memo1.lines.add(&#8217;********数据表原有的内容如下********&#8217;);<br />
{显示各个域的域名}<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].name+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
<br />
{显示各个域的内容}<br />
while not ARecordSet.eof do<br />
begin<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].value+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
ARecordSet.MoveNext;//移到下条，Next<br />
end;<br />
<br />
{增加一个记录}<br />
ARecordSet.AddNew;//增加,Append<br />
ARecordSet.Fields[&#8217;AName&#8217;] := &#8217;1&#8217;;//以FieldByName的方式存取<br />
ARecordSet.Fields[&#8217;Portable&#8217;] := &#8217;2&#8217;;<br />
ARecordSet.Fields(2) := &#8217;3&#8217;;//以Fields[index]的方式存取<br />
ARecordSet.Fields(3) := &#8217;4&#8217;;<br />
ARecordSet.Fields(4) := &#8217;5&#8217;;<br />
ARecordSet.Update;//更新，Post<br />
ARecordSet.MoveFirst;//移到首条，First<br />
memo1.lines.add(&#8217;********增加了一条记录后的数据表的内容如下********&#8217;);<br />
{显示各个域的内容}<br />
while not ARecordSet.eof do<br />
begin<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].value+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
ARecordSet.MoveNext;//移到下条，Next<br />
end;<br />
<br />
{修改最后一条记录}<br />
ARecordSet.MoveLast;<br />
ARecordSet.Fields[&#8217;AName&#8217;] := &#8217;11&#8217;;//以FieldByName的方式存取<br />
ARecordSet.Fields[&#8217;Portable&#8217;] := &#8217;22&#8217;;<br />
ARecordSet.Fields(2) := &#8217;33&#8217;;//以Fields[index]的方式存取<br />
ARecordSet.Fields(3) := &#8217;44&#8217;;<br />
ARecordSet.Fields(4) := &#8217;55&#8217;;<br />
ARecordSet.Update;//更新，Post<br />
ARecordSet.MoveFirst;//移到首条，First<br />
memo1.lines.add(&#8217;********修改了最后一条记录后的数据表的内容如下********&#8217;);<br />
{显示各个域的内容}<br />
while not ARecordSet.eof do<br />
begin<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].value+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
ARecordSet.MoveNext;//移到下条，Next<br />
end;<br />
<br />
{删除最后一条记录}<br />
ARecordSet.MoveLast;//移到末条，Last<br />
ARecordSet.delete;//删除，delete<br />
ARecordSet.Update;//更新，在<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>不需要<br />
ARecordSet.MoveFirst;//移到首条，First<br />
memo1.lines.add(&#8217;********删除了最后一条记录后的数据表的内容如下********&#8217;);<br />
{显示各个域的内容}<br />
while not ARecordSet.eof do<br />
begin<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].value+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
ARecordSet.MoveNext;//移到下条，Next<br />
end;<br />
<br />
ARecordSet.Close;{关闭数据集}<br />
<br />
{用SQL语句进行查询,查询姓名为&#8220;张三&#8221;的记录}<br />
{注意，在SQL语句中，字符串应该用单引号包括起来}<br />
ARecordSet.open( &#8217;select * from wfjcommu where AName = &#8217;&#8217;张三&#8217;&#8217;&#8217;,<br />
AConnection,adOpenStatic,adLockOptimistic,adCmdText );<br />
memo1.lines.add(&#8217;********张三的内容如下********&#8217;);<br />
memo1.lines.add( &#8217;共有&#8217; + IntToStr( ARecordSet.RecordCount ) + &#8217;条匹配的记录&#8217; );<br />
{显示各个域的内容}<br />
while not ARecordSet.eof do<br />
begin<br />
strTemp := &#8217;&#8217;;<br />
for intIndex := 0 to ARecordSet.Fields.count - 1 do<br />
strTemp := strTemp + ARecordSet.Fields[intIndex].value+&#8217;;&#8217;;<br />
memo1.lines.add( strTemp );<br />
ARecordSet.MoveNext;//移到下条，Next<br />
end;<br />
<br />
{关闭数据集和数据库连接}<br />
ARecordSet.close;<br />
AConnection.close;<br />
end;<br />
听别人说总不如自己看实际的例子来体会。在这个例子中，将演示如何利用ADO对象来对一个数据表进行查询、增加记录、修改记录和删除记录操作。具体的用法请参见程序中的注释，如果有点<strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong>数据库编程经验，相信不难理解。<br />
在我们的例子使用的数据库为Test.MDB，其中有一个数据表为wfjcommu，有五个字段AName、Portable、Tel、BP、PostAddress，分别表示姓名、手机号、电话号码、呼机号码和通信地址。<br />
以上程序在PWIN98+ <strong style="color: black; background-color: rgb(255,255,102)">Delphi</strong> 3.0+PWS(Personal Web Server)4.0下调试通过. <br />
<br />
http://hi.baidu.com/mrlong2000/blog/item/f3748d09fb927a206a60fb05.html</span></p>
</span>
<img src ="http://www.blogjava.net/badboyryan/aggbug/184755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2008-03-08 22:24 <a href="http://www.blogjava.net/badboyryan/archive/2008/03/08/184755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ODAC 应用技巧 （二）使用 BLOB 及 CLOB 数据类型 </title><link>http://www.blogjava.net/badboyryan/archive/2007/08/18/137817.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sat, 18 Aug 2007 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/08/18/137817.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/137817.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/08/18/137817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/137817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/137817.html</trackback:ping><description><![CDATA[
		<p align="left">
				<b>使用 BLOB 及 CLOB 数据类型</b>
		</p>
		<p align="left">
				<u>
						<font color="#0000ff">转：<a href="http://blog.csdn.net/nxyc_twz/archive/2004/06/16/16061.aspx">http://blog.csdn.net/nxyc_twz/archive/2004/06/16/16061.aspx</a></font>
				</u>
				<br />ODAC 组件支持 Oracle 8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值，使用同样的方法，你也可以获取  LONG 或 LONG ROW 字段。 当你需要使用 SQL DML 及 PL/SQL 语句存取这些字段时，你就会发现 LOB 数据类型的用法有明显的不同。<br />BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中；实际的 BLOB 和 CLOB 数据存储在独立的表空间中。与之不同的是，LONG 或 LONG RAW 类型存储在数据库中，表中存放着它们的实际值。<br /><br />当存取 LOB 列时，返回的是定位器，而不像 LONG 或 LONG RAW 数据类型那样返回它的实际值。 <br />例如，分析这个表的定义：<br /><br />CREATE TABLE ClobTable (<br />Id NUMBER,<br />Name VARCHAR2(30),<br />Value CLOB<br />)<br /><br />如果我们不通过值参数初始化 LOB 定位器， Oracle 将不允许使用下面的语句来更新数据表：<br /><br />UPDATE ClobTable<br />SET<br />Name = :Name,<br />Value = :Value<br /><br />WHERE<br />Id = :Id<br /><br />要初始化 LOB 定位器，你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器，应在同样的语句中使用 RETURNING 子句。例如：<br /><br />UPDATE ClobTable<br />SET<br />Name = :Name,<br />Value = EMPTY_CLOB()<br />WHERE<br />Id = :Id<br />RETURNING<br />Value<br />INTO<br />:Value<br /><br />ODAC 写 LOB 数据到 Oracle 且返回初始值字段，需使用：值参数。<br />存储过程允许自动初始化 LOB 值，方法如下：<br /><br />CREATE OR REPLACE<br />PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,<br />p_Value OUT CLOB)<br />is<br />begin<br />UPDATE ClobTable<br />SET <br />Name = p_Name,<br />Value = EMPTY_CLOB()<br />WHERE<br />Id = p_Id<br />RETURNING<br />Value<br />INTO<br />p_Value;<br />end;<br /><br />注意：值参数被声明为 OUT。同时，设置 LOB 数据类型的参数的 ParamType 属性为 ptInput ，且指定它到所需的数据前来实际调用存储过程。我们可以这样调用前面声明的存储过程：<br /><br />OraStroredProc1.StoredProcName := 'ClobTableUpdate';<br />OraStroredProc1.Prepare;<br />OraStroredProc1.ParamByName('p_Id').AsInteger := Id;<br />OraStroredProc1.ParamByName('p_Name').AsString := Name;<br />OraStroredProc1.ParamByName('Value').ParamType := ptInput;<br />OraStroredProc1.ParamByName('Value').AsCLOBLocator.<br />LoadFromFile(FileName);<br />OraStroredProc1.Execute;<br /><br />对 ODAC 来说，在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput ， ODAC 写数据到服务器，如果 ParamType 是 ptOutput，它则读取数据。<br /><br />你可以使用 LOB 参数的 dtBlob 和 dtMemo 数据类型来编写普通的 DML 语句。在这种情况下， Oracle 自动将 LONG 和 LONG ROW 类型的值转换为 CLOB 或 BLOB 数据。<br /><br /><a href="http://support.microsoft.com/kb/322796/en-us">http://support.microsoft.com/kb/322796/en-us</a><br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/137817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-08-18 15:07 <a href="http://www.blogjava.net/badboyryan/archive/2007/08/18/137817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过存储过程来上传文件大于4kBLOB</title><link>http://www.blogjava.net/badboyryan/archive/2007/08/17/137430.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 16 Aug 2007 17:36:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/08/17/137430.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/137430.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/08/17/137430.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/137430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/137430.html</trackback:ping><description><![CDATA[
		<p align="left">第一日：<br /><br />1.建立数据表<br />create table aaa(id varchar2(9) not null,img blob);<br /><br />2.存储过程<br />create or replace procedure pro_upd(<br />  sid in string,<br />  bblob in blob  default empty_blob())<br />is<br /> lobloc blob;<br /> vLength integer;<br />begin   <br />  insert into aaa(id,img) values(sid,empty_blob());<br />     IF (bblob IS NOT NULL) THEN  <br />        SELECT img INTO lobloc FROM aaa WHERE ID = sid FOR UPDATE;  <br />        vLength := dbms_lob.getlength(bblob);<br /> DBMS_LOB.OPEN(lobloc,DBMS_LOB.lob_readwrite);<br /> DBMS_LOB.copy(lobloc,bblob,vLength);<br />      END IF;<br />      commit;<br />   exception   <br />         when    others    then   <br />         rollback;   <br />end;<br /><br />3.程序代码<br />  用的ODAC的oraquery<br />  orqry1.SQL.Text := 'call pro_upd(:id,:bblob)';<br />  orqry1.Params.ParamByName('id').Value := '123';<br />  orqry1.Params.ParamByName('bblob').LoadFromFile('D:\work\照片上传\pic\005.jpg',ftBlob);<br />  orqry1.ExecSQL;  <br /><br />目的：就是把图片上传到数据库，结果4k一下的可以成功上传；4k以上稍小点的图片就<a href="http://blog.oracle.com.cn/html/10/t-121610.html" target="_blank"><font size="3">ORA-03113: <font color="#c60a00">通信通道的文件结束</font></font></a>如果几百k就会报ora-12571错误；经过两天的努力发现的一个规律！<br /><br />继续找原因。。。。。。<br /><br />第二日<br />8月18日问题终于得到解决，但是存储过程和调用都经过了改变！<br /><br />  with orstrdprc1 do begin<br />    StoredProcName := 'pro_upd';<br />    PrepareSQL;  // receive parameters<br />    Randomize;<br />    ParamByName('SID').AsString := IntToStr(Random(1000));<br />    ParamByName('bblob').ParamType := ptInput;  // to transfer Lob data to Oracle<br />    ParamByName('bblob').AsOraBlob.LoadFromFile('D:\work\照片上传\pic\10000027_005.jpg');<br />    Execute;<br />  end;</p>
		<p>这样可以了，但是要求<br />--这个存储过程得到了解决<br />create or replace procedure pro_upd(<br />  sid in string,<br />  bblob out blob)<br />is<br />begin   <br />  insert into aaa(id,img) values(sid,empty_blob())<br />  RETURNING img INTO bblob;<br />end;<br /><br />继续前进，看看原来的存储过程什么原因不可以！<br /><br />总结：lob 文件4k以内的内容放到表段，其他的放到blob的表空间！<br />插入时，首先要插入empty_blob,然后select  for update!这样才能更新blob字段<br />另外如果是存储过程，则注意参数，想下面的一样：<br /><br />  bblob out blob<br /><br />这样才能得到blob字段的定位器；；；更新内容！<br /><br />但是现在还不知道 bblob  in  blob 这种方式下如何修改，上传图片<br /><br />第三天：<br />经过3天的努力寻找，终于找到了完美的解决方案居然就是一句话的问题，完全可以解决 in blob的问题了<br />TemporaryLobUpdate := True;<br />加一句就好了<br />到此在存储过程里面解决上传blob的问题解决完毕。<br />到此可以圆满结束，明天的合同就签了。<br />注意文章转载注明出处：http://blogjava.net/badboyryan<br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/137430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-08-17 01:36 <a href="http://www.blogjava.net/badboyryan/archive/2007/08/17/137430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi2007来了介绍Delphi2007的一些亮点</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/14/124377.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 14 Jun 2007 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/14/124377.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/124377.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/14/124377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/124377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/124377.html</trackback:ping><description><![CDATA[Delphi2007 for Win32一些技术亮点：<br />1、 IDE工具采用.Net2.0来编写，安装时候需要.Net FrameWork2.0，但编译出来的Exe是纯正的Win32程序，发布不需要.Net FrameWork2.0。新IDE采用.Net FrameWork2.0是为了更好的统一IDE平台，利用.Net的反射、泛型等高级特性，节省编写IDE时间。新的IDE确实比D7启动还要快，大概是五六秒时间左右就启动，跟VS.Net2005差不多。演示中，新的IDE编译新建工程比D7还要快一点。<br />2、 Delphi2007支持Vista界面，封装了Vsita的新API函数。<br />3、 Delphi2007有一个功能很有意思，支持D2006的所有BPL组件。意思是，如果你用D2006编译过的BPL，没有源码和DCU，也可以直接安装在Delphi2007。哈哈，这个是delphi版本上的史无前例，即使第三方控件包来不及支持Delphi2007，也不妨碍开发人员从D2006 升级到Delphi2007做项目开发。<br />4、 支持MS Build。比如支持Debug、Release。也支持编译前和编译后事件，可调用BAT文件。比如，你编译前邮件告诉老板，你要给我加薪50%，否则十分钟后销毁源代码。另外，也可以修改其XML格式，只编译特定的程序代码。<br />5、 Delphi2007 for Win32数据集控件全面支持Unicode。比如，你的数据库表字段可采用中文名称作字段。Filter也支持Unicode。唉，为了这个 filter支持Unicode，有些人在delphiBBS上苦苦守候了六七年。但delphi2007的UI（可视化界面）还不是全面支持 Unicode。比如，你的DBGrid就不能支持中文、韩文（不说狗屁日文）、阿拉伯文等同时显示。原有的Vcl框架大量采用string声明而不是 WideString，据李维讲，CodeGear会将Vcl全面支持Unicode，但要考虑一种最佳的平衡方法。<br />6、非常棒的DBX4。dbExpress将要统一混乱的数据库连接组件，底层全部改写。无论在Win32还是Win64上，可兼容本机代码和托管代码。呵呵，举个例子，DBX4可支持ADO，也可以支持ADO.Net。这一点，M$也做不到。DBX4新增加了Connection Pool高级组件。更令人心动的是，开放Driver Source，可自行扩展属性和方法，哈哈，ColreLab公司这回可高价卖不出去dbExpress驱动了。DBX4也全面支持Uicode。<br />7、 Delphi2007 for Win32支持Ajax技术—Intraweb9.0。Intraweb9.0组件封装了Ajax，以事件方式来驱动程序。Intraweb9.0的 Ajax技术支持断点跟踪调试，简单到跟你调试其他delphi程序一样。Intraweb9.0不愧是封装javascript的上乘之作。其实，话又说回来了，这一两年流行的Ajax技术，其实无非就是javascript封装而已。而Intraweb已经在六七年将javascript技术做得炉火纯青。更令人汗颜的是，许多所谓的web2.0新技术调试Ajax时候，仿佛又回到20多年前的C编程时代，不停地用Printf打印调试。Ajax技术也并非是什么高级技术，只是web编程一种无奈的选择。不久未来，应该是属于智能客户端平台。<br /><br />Delphi for PHP：这是一种对web技术前所未有的震撼。<br />1、 完全支持现有PHP项目。李维先生将一开源的纯PHP5项目用delphi for PHP打开，即可编译运行。<br />2、 支持模板、CSS等技术。<br />3、非常Cool的调试技术。将光标移到其链接，在出现链接的所属PHP文件里，设置断点，当页面调试运行到该断点时候，自动跳转到其PHP所在的断点。在 Debug窗口里，呵呵，比Delphi的Debug做得更好，自动会出现断点所在的类实例、变量树形调试信息，甚至是Request的内容，类似 VS.NET2005的Debug窗口。由于PHP是动态语言，如果有变量尚未声明或实例化，则会出现“尚未确定”之类的提示。<br />4、 用Vcl封装PHP而成的组件，其源码脚本还是纯正的PHP脚本语言。Vcl组件的Object Inspector除了有属性、事件外，还有javascript，运行在程序中动态调用javascript。<br />5、 非常震撼的可视化界面设计。delphi for PHP有50多个组件，其中有一个为window组件，将其放在页面上，拖拉其大小，会出现一个window form（有最大化，最小化，关闭之类按钮），然后，你可以随意拖放类似 Standard组件或数据感知组件。跟你做CS界面并没有什么不同。一个web页面可以放多个window组件，然后用Show方法显示调用。运行后， window form会出现在浏览器的页面里。说起来，那些所谓的Web UI技术，比如是Sturcts、JSF等流行框架，如同垃圾一样，生产力并没有什么显著提高。CodeGear很牛啊。<br />6、 最后一个演示例子，李维先生将一个封装而成的Google Map VCL组件（PHP封装而成）运行演示，呵呵，不写一句代码，竟然实现了 Google 官方网站上Google Map所有功能，一摸一样。李维先生用Google Map例子显示Borland总坛和他的台北家。呵呵，台北不是我的家，我的家乡没有霓虹灯；深圳也不是我的家，我的家乡没有歧视也没有三座大山。<br />7、 Delphi for PHP大概今天在美国正式Release，其试用版大概一周后可下载。价格是299美元，优惠期申购价格为249美元左右（呵呵，网上报价，我可不是托）。Release后，其Vcl组件包源码将会提交到开源组织开源。CodeGear只卖IDE。Delphi for PHP与Delphi2007是两个不同的IDE，将来应该会统一起来。<img src ="http://www.blogjava.net/badboyryan/aggbug/124377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-14 21:02 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/14/124377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELPHI里面的webservices编程Client端实现</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/11/123307.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 11 Jun 2007 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/11/123307.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/123307.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/11/123307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/123307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/123307.html</trackback:ping><description><![CDATA[1、file-new-application<br /><br />2、在webservice 页标签把控件THTTPRIO放到窗体里面来<br /><br />3、把服务器CGI程序用IIS发布出去需要建虚拟目录<br /><br />4、在浏览器里面输入<a href="http://ip/">http://ip/</a>虚拟目录/cgi.exe/wsdl<br /><br />5、点击里面的任意的wsdl，浏览器打开地址，把地址拷贝下来<br /><br />6、THTTPRIO控件的wsdllocation属性赋值5里的地址<br /><br />7、把服务器端的intf引用进来<br /><br />       uses IdemoIntf;<br /><br />8、写代码调用webservices里面的方法；<br /><br />var<br />IdemoIntf : IIdemo ;<br />begin<br /> IdemoIntf := htpr1 as  IIdemo;<br /> ShowMessage(IdemoIntf.hellworld('123'));<br />end;<br /><br />这样的好处是客户端不需安装数据库的客户端，不用关心业户代码，只需要调用服务器端的接口函数就可以了。<br /><br />到这delphi里面如何简单创建和使用webservice的例子写完了。<br /><br />转载注明出处：<a href="/badboyryan/archive/2007/06/11/123304.html">http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html</a><br /><br />版权所有：坏男孩<br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/badboyryan/aggbug/123307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-11 10:19 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/11/123307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELPHI里面的webservices编程SERVER端实现</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 11 Jun 2007 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/123304.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/123304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/123304.html</trackback:ping><description><![CDATA[1、File-new-other-webservices-soapserver application-选择CGI Stand-alone executable<br /><br />2、Create Interface for SOAP Module 选择是<br /><br />3、输入Service Name 点击ok<br /><br />4、在INTF下面写上接口实现的函数<br />  IIdemo = interface(IInvokable)<br />  ['{E05B7E78-4B57-412F-BB34-805F99E6CDCA}']<br />   function hellworld(str1 : String):String; stdcall;<br /><br />5、在impl里面写上<br />  public<br />      function hellworld(str1 : String):String; stdcall;<br />  end;<br /><br />并且实现这个函数<br /><br />6、编译程序，这时这个cgi的exe文件就生成了<br /><br />7、用IIS发布就可以了，等着被客户端调用了。<br /><br /><br />转载注明出处：<a href="/badboyryan/archive/2007/06/11/123304.html">http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html</a><br /><br />版权所有：坏男孩<br /><img src ="http://www.blogjava.net/badboyryan/aggbug/123304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-11 10:10 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/11/123304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何通过xml来更新数据库结构！</title><link>http://www.blogjava.net/badboyryan/archive/2007/05/28/120510.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 28 May 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/05/28/120510.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/120510.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/05/28/120510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/120510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/120510.html</trackback:ping><description><![CDATA[
		<p>&lt;?xml version="1.0" encoding="GBK"?&gt;</p>
		<p>&lt;SqlMain&gt;<br />&lt;property name="1" table="索引ID_Tpu_Menu3_Cyzgxz"&gt;<br />    create unique index ID_Tpu_Menu3_Cyzgxz on Tpu_Menu3_Cyzgxz(CyzgxzID)<br />  &lt;/property&gt;<br /><br />  &lt;property name="3" table="T_CYRY_MZ"&gt;<br />    drop table T_CYRY_MZ<br />  &lt;/property&gt;<br /><br /><br />  &lt;property name="2" table="TPu_Menu8_Clxx"&gt;<br />    alter table tpu_menu8_clxx alter column dzw decimal(6,2)<br />  &lt;/property&gt;<br />&lt;/SqlMain<br /><br />procedure TFrmMain.UpDataStruct(aFileName:String);<br />var<br />  vNode,vChildNode:IXMLNode;<br />  iLen,i:integer;<br />  fSqlText,fName,fTable:string;<br />begin<br />  try  <br />    XMLDoc.LoadFromFile(aFileName);<br />    XMLDoc.Active:=True;<br />    vNode:=XMLDoc.ChildNodes.FindNode('SqlMain');<br />    iLen:=vNode.ChildNodes.Count;<br />    pb1.Max:=iLen*10;<br />    for i:=0 to iLen-1 do<br />    begin<br />      vChildNode:=vNode.ChildNodes.Get(i);<br />      fSqlText:=vChildNode.NodeValue;<br />      fName:=vChildNode.Attributes['name'];<br />      fTable:=vChildNode.Attributes['table'];<br />      DoSqlText(fSqlText,fName,fTable);<br />    end;<br />  except<br />    on e:Exception do<br />      Showmessage('XML文件读取错误，请与开发商联系！'+chr(13)+e.Message);<br />  end;<br />end;</p>
		<p>procedure TFrmMain.DoSqlText(aSqlText,aName,aTable:string);<br />var<br />  it:Integer;<br />begin<br />  ADOExec.SQL.Clear;<br />  ADOExec.SQL.Add(aSqlText);<br />  try<br />    it:=StrToInt(aName);<br />    case it of<br />    1:lb1.Caption:='建立表'+aTable;<br />    2:lb1.Caption:='更新表'+aTable;<br />    3:lb1.Caption:='删除表'+aTable;<br />    10:<br />    begin<br />      lb1.Caption:='添加数据表'+aTable;<br />      ClearData(aTable);<br />    end;<br />    11:lb1.Caption:='更新数据表'+aTable;<br />    else<br />      lb1.Caption:='更新表'+aTable;<br />    end;<br />    ADOExec.ExecSQL;<br />    memo1.Lines.Add('信息→'+lb1.Caption+'操作成功！');<br />  except<br />    on e:Exception do<br />      memo1.Lines.Add('警告→'+e.Message);<br />  end;<br />  pb1.StepIt;<br />  pb1.Refresh;<br />  lb1.Refresh;<br />  memo1.Refresh;<br />end;<br /><br /><br />注明出处：<a href="/badboyryan/archive/2007/05/28/120510.html">http://www.blogjava.net/badboyryan/archive/2007/05/28/120510.html</a><br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/120510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-05-28 17:02 <a href="http://www.blogjava.net/badboyryan/archive/2007/05/28/120510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Delphi部分函数、命令、属性中文说明</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/23/95523.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 23 Jan 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/23/95523.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/95523.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/23/95523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/95523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/95523.html</trackback:ping><description><![CDATA[Abort 函数 引起放弃的意外处理 <br />Abs 函数 绝对值函数 <br />AddExitProc 函数 将一过程添加到运行时库的结束过程表中 <br />Addr 函数 返回指定对象的地址 <br />AdjustLineBreaks 函数 将给定字符串的行分隔符调整为CR/LF序列 <br />Align 属性 使控件位于窗口某部分 <br />Alignment 属性 控件标签的文字位置 <br />AllocMem 函数 在堆栈上分配给定大小的块 <br />AllowGrayed 属性 允许一个灰度选择 <br />AnsiCompareStr 函数 比较字符串（区分大小写） <br />AnsiCompareText 函数 比较字符串（不区分大小写） <br />AnsiLowerCase 函数 将字符转换为小写 <br />AnsiUpperCase 函数 将字符转换为大写 <br />Append 函数 以附加的方式打开已有的文件 <br />ArcTan 函数 余切函数 <br />AssignFile 函数 给文件变量赋一外部文件名 <br />Assigned 函数 测试函数或过程变量是否为空 <br />AutoSize 属性 自动控制标签的大小 <br /><br />BackgroundColor 属性 背景色 <br />BeginThread 函数 以适当的方式建立用于内存管理的线程 <br />BevelInner 属性 控件方框的内框方式 <br />BevelOuter 属性 控件方框的外框方式 <br />BevelWidth 属性 控件方框的外框宽度 <br />BlockRead 函数 读一个或多个记录到变量中 <br />BlockWrite 函数 从变量中写一个或多个记录 <br />BorderStyle 属性 边界类型 <br />BorderWidth 属性 边界宽度 <br />Break 命令 终止for、while、repeat循环语句 <br />Brush 属性 画刷 <br /><br />Caption 属性 标签文字的内容 <br />ChangeFileExt 函数 改变文件的后缀 <br />ChDir 函数 改变当前目录 <br />Checked 属性 确定复选框选中状态 <br />Chr 函数 返回指定序数的字符 <br />CloseFile 命令 关闭打开的文件 <br />Color 属性 标签的颜色 <br />Columns 属性 显示的列数 <br />CompareStr 函数 比较字符串（区分大小写） <br />Concat 函数 合并字符串 <br />Continue 命令 继续for、while、repeat的下一个循环 <br />Copy 函数 返回一字符串的子串 <br />Cos 函数 余弦函数 <br />Ctl3D 属性 是否具有3D效果 <br />Cursor 属性 鼠标指针移入后的形状 <br /><br />Date 函数 返回当前的日期 <br />DateTimeToFileDate 函数 将DELPHI的日期格式转换为DOS的日期格式 <br />DateTimeToStr 函数 将日期时间格式转换为字符串 <br />DateTimeToString 函数 将日期时间格式转换为字符串 <br />DateToStr 函数 将日期格式转换为字符串 <br />DayOfWeek 函数 返回星期的数值 <br />Dec 函数 递减变量值 <br />DecodeDate 函数 将日期格式分解为年月日 <br />DecodeTime 函数 将时间格式分解为时、分、秒、毫秒 <br />Delete 函数 从字符串中删除子串 <br />DeleteFile 命令 删除文件 <br />DiskFree 函数 返回剩余磁盘空间的大小 <br />DiskSize 函数 返回指定磁盘的容量 <br />Dispose 函数 释放动态变量所占的空间 <br />DisposeStr 函数 释放字符串在堆栈中的内存空间 <br />DitherBackground 属性 使背景色的色彩加重或减少50% <br />DragCursor 属性 当鼠标按下时光标的形状 <br />DragMode 属性 按动的作用方式 <br />DropDownCount 属性 容许的显示数据项的数目 <br />EditMask 属性 编辑模式 <br />Enabled 属性 是否使标签呈现打开状态 <br />EncodeDate 函数 将年月日合成为日期格式 <br />EncodeTime 函数 将时、分、秒、毫秒合成为时间格式 <br />EndMargin 属性 末尾边缘 <br />Eof 函数 对有类型或无类型文件测试是否到文件尾 <br />Eoln 函数 返回文本文件的行结束状态 <br />Erase 命令 删除外部文件 <br />ExceptAddr 函数 返回引起当前意外的地址 <br />Exclude 函数 从集合中删除一些元素 <br />ExceptObject 函数 返回当前意外的索引 <br />Exit 命令 立即从当前的语句块中退出 <br />Exp 函数 指数函数 <br />ExpandFileName 函数 返回包含绝对路径的字符串 <br />ExtendedSelect 属性 是否允许存在选择模式，True时，MultiSelect才有意义 <br />ExtractFileDir 函数 返回驱动器和路径 <br />ExtractFileExt 函数 返回文件的后缀 <br />ExtractFileName 函数 返回文件名 <br />ExtractFilePath 函数 返回指定文件的路径 <br /><br />FileAge 函数 返回文件已存在的时间 <br />FileClose 命令 关闭指定的文件 <br />FileCreate 命令 用指定的文件名建立新文件 <br />FileDateToDateTime 函数 将DOS的日期格式转换为DELPHI的日期格式 <br />FileExists 函数 检查文件是否存在 <br />FileGatAttr 函数 返回文件的属性 <br />FileGetDate 函数 返回文件的DOS日期时间标记 <br />FileOpen 命令 用指定的存取模式打开指定的文件 <br />FilePos 函数 返回文件的当前指针位置 <br />FileRead 命令 从指定的文件读取 <br />FileSearch 命令 在目录中搜索指定的文件 <br />FileSeek 函数 改变文件的指针 <br />FileSetAttr 函数 设置文件属性 <br />FileSetDate 函数 设置文件的DOS日期时间标记 <br />FileSize 函数 返回当前文件的大小 <br />FileWrite 函数 对指定的文件做写操作 <br />FillChar 函数 用指定的值填充连续字节的数 <br />FindClose 命令 终止FindFirst/FindNext序列 <br />FindFirst 命令 对指定的文件名及属性搜索目录 <br />FindNext 命令 返回与文件名及属性匹配的下一入口 <br />FloatToDecimal 函数 将浮点数转换为十进制数 <br />FloatToStrF 函数 将浮点数转换为字符串 <br />FloatToStr 函数 将浮点数转换为字符串 <br />FloatToText 函数 将给定的浮点数转换为十进制数 <br />FloatToTextFmt 函数 将给定的浮点数转换为十进制数 <br />Flush 函数 将缓冲区的内容刷新到输出的文本文件中 <br />FmtLoadStr 函数 从程序的资源字符串表中装载字符串 <br />FmtStr 函数 格式化一系列的参数，其结果以参数Result返回 <br />Font 属性 设置字体 <br />Format 函数 格式化一系列的参数并返回Pascal字符串 <br />FormatBuf 函数 格式化一系列的参数 <br />FormatDateTime 函数 用指定的格式来格式化日期和时间 <br />FormatFloat 函数 指定浮点数格式 <br />Frac 函数 返回参数的小数部分 <br />FreeMem 函数 按给定大小释放动态变量所占的空间 <br /><br />GetDir 返回指定驱动器的当前目录 <br />GetHeapStatus 返回内存管理器的当前状态 <br />GetMem 建立一指定大小的动态变量，并将指针指向该处 <br />GetMemoryManager 返回内存管理器的入口点 <br />Glyph 函数 按钮上的图象 <br /><br />Halt 停止程序的执行并返回到操作系统 <br />Hi 返回参数的高地址位 <br />High 返回参数的上限值 <br />Hint 属性 提示信息 <br /><br />Int 返回参数的整数部分 <br />Include 添加元素到集合中 <br />Insert 在字符串中插入子串 <br />IntToHex 将整型数转换为十六进制数 <br />IntToStr 将整型数转换为字符串 <br />IOResult 返回最新的I/O操作完成状态 <br />IsValidIdent 测试字符串是否为有效的标识符 <br />Items 属性 默认显示的节点 <br /><br />Kind 属性 摆放样式 <br /><br />LargeChange 属性 最大改变值 <br />Layout 属性 图象布局 <br />Length 函数 返回字符串的动态长度 <br />Lines 属性 缺省显示内容 <br />Ln 函数 自然对数函数 <br />Lo 函数 返回参数的低地址位 <br />LoadStr 函数 从应用程序的可执行文件中装载字符资源 <br />LowerCase 函数 将给定的字符串变为小写 <br />Low 函数 返回参数的下限值 <br /><br />Max 属性 最大值 <br />MaxLength 属性 最大长度 <br />Min 属性 最小值 <br />MkDir 命令 建立一子目录 <br />Move 函数 从源到目标复制字节 <br />MultiSelect 属性 允许同时选择几个数据项 <br /><br />Name 属性 控件的名字 <br />New 函数 建立新的动态变量并设置一指针变量指向他 <br />NewStr 函数 在堆栈上分配新的字符串 <br />Now 函数 返回当前的日期和时间 <br /><br />Odd 测试参数是否为奇数 <br />OnActivate 事件 焦点移到窗体上时触发 <br />OnClick 事件 单击窗体空白区域触发 <br />OnDblClick 事件 双击窗体空白区域触发 <br />OnCloseQuery 事件 使用者试图关闭窗体触发 <br />OnClose 事件 窗体关闭后才触发 <br />OnCreate 事件 窗体第一次创建时触发 <br />OnDeactivate 事件 用户切换到另一应用程序触发 <br />OnDragDrop 事件 鼠标拖放操作结束时触发 <br />OnDragOver 事件 有其他控件从他上面移过触发 <br />OnMouseDown 事件 按下鼠标键时触发 <br />OnMouseUp 事件 释放鼠标键时触发 <br />OnMouseMove 事件 移动鼠标时触发 <br />OnHide 事件 隐藏窗体时触发 <br />OnKeyDown 事件 按下键盘某键时触发 <br />OnKeyPress 事件 按下键盘上的单个字符键时触发 <br />OnKeyUp 事件 释放键盘上的某键时触发 <br />OnPaint 事件 窗体上有新部分暴露出来触发 <br />OnResize 事件 重新调整窗体大小触发 <br />OnShow 事件 在窗体实际显示之前瞬间触发 <br />Ord 返回序数类的序数 <br />OutlineStyle 属性 类型 <br />OutOfMemoryError 引起OutOfMemory意外 <br />PageIndex 属性 页索引 <br />Pages 属性 页 <br />ParamCount 函数 返回在命令行上传递给程序的参数数量 <br />ParamStr 函数 返回指定的命令行参数 <br />Pen 属性 画刷设置 <br />Pi 函数 返回圆周率Pi <br />Picture 属性 显示图象 <br />PictureClosed 属性 设置Closed位图 <br />PictureLeaf 属性 设置Leaf位图 <br />PictureMinus 属性 设置Minus位图 <br />PictureOpen 属性 设置Open位图 <br />PicturePlus 属性 设置Plus位图 <br />Pos 函数 在字符串中搜索子串 <br />Pred 函数 返回先前的参数 <br /><br />Random 函数 返回一随机函数 <br />Randomize 函数 用一随机数初始化内置的随机数生成器 <br />Read 函数 对有格式的文件，读一文件组件到变量中； <br />对文本文件，读一个或多个值到一个或多个变量中 <br />Readln 函数 执行Read过程，然后跳到文件下一行 <br />ReadOnly 属性 只读属性 <br />ReAllocMem 函数 分配一动态变量 <br />Rename 函数 重命名外部文件 <br />RenameFile 函数 对文件重命名 <br />Reset 函数 打开已有的文件 <br />Rewrite 函数 建立并打开一新的文件 <br />RmDir 函数 删除空的子目录 <br />Round 函数 将实数值舍入为整型值 <br />RunError 函数 停止程序的执行 <br /><br />ScrollBars 属性 滚动条状态 <br />Seek 函数 将文件的当前指针移动到指定的组件上 <br />SeekEof 函数 返回文件的文件结束状态 <br />SeekEoln 函数 返回文件的行结束状态 <br />SelectedColor 属性 选中颜色 <br />SetMemoryManager 函数 设置内存管理器的入口点 <br />SetTextBuf 函数 给文本文件指定I/O缓冲区 <br />Shape 属性 显示的形状 <br />ShowException 函数 显示意外消息与地址 <br />Sin 函数 正弦函数 <br />SizeOf 函数 返回参数所占的字节数 <br />SmallChange 属性 最小改变值 <br />Sorted 属性 是否允许排序 <br />Sqr 函数 平方函数 <br />Sqrt 函数 平方根函数 <br />StartMargin 属性 开始边缘 <br />State 属性 控件当前状态 <br />Str 函数 将数值转换为字符串 <br />StrAlloc 函数 给以NULL结束的字符串分配最大长度-1的缓冲区 <br />StrBufSize 函数 返回存储在由StrAlloc分配的字符缓冲区的最大字符数 <br />StrCat 函数 将一字符串附加到另一字符串尾并返回合并的字符串 <br />StrComp 函数 比较两个字符串 <br />StrCopy 函数 将一个字符串复制到另一个字符串中 <br />StrDispose 函数 释放堆栈上的字符串 <br />StrECopy 函数 将一字符串复制到另一个字符串并返回结果字符串尾部的指针 <br />StrEnd 函数 返回指向字符串尾部的指针 <br />Stretch 属性 自动适应控件的大小 <br />StrFmt 函数 格式化一系列的参数 <br />StrIComp 函数 比较两个字符串（不区分大小写） <br />StringToWideChar 函数 将ANSI字符串转换为UNICODE字符串 <br />StrLCat 函数 将一字符串中的字符附加到另一字符串尾并返回合并的字符串 <br />StrLComp 函数 以最大长度比较两个字符串 <br />StrLCopy 函数 将一个字符串中的字符复制到另一个字符串中 <br />StrLen 函数 返回字符串中的字符数 <br />StrLFmt 函数 格式化一系列的参数，其结果中包含有指向目标缓冲区的指针 <br />StrLIComp 函数 以最大长度比较两个字符串（不区分大小写） <br />StrLower 函数 将字符串中的字符转换为小写 <br />StrMove 函数 将一个字符串中的字符复制到另一个字符串中 <br />StrNew 函数 在堆栈上分配一个字符串 <br />StrPas 函数 将以NULL结束的字符串转换为PASCAL类的字符串 <br />StrPCopy 函数 将PASCAL类的字符串复制为以NULL结束的字符串 <br />StrPLCopy 函数 从PASCAL类的最大长度字符串复制为以NULL结束的字符串 <br />StrPos 函数 返回一个字符串在另一个字符串中首次出现指针 <br />StrRScan 函数 返回字符串中最后出现字符的指针 <br />StrScan 函数 返回字符串中出现首字符的指针 <br />StrToDate 函数 将字符串转换为日期格式 <br />StrToDateTime 函数 将字符串转换为日期/时间格式 <br />StrToFloat 函数 将给定的字符串转换为浮点数 <br />StrToInt 函数 将字符串转换为整型 <br />StrToIntDef 函数 将字符串转换为整型或默认值 <br />StrToTime 函数 将字符串转换为时间格式 <br />StrUpper 函数 将字符串中的字符转换为大写 <br />Style 属性 类型选择 <br />Suce 函数 返回后继的参数 <br />Swap 函数 交换参数的高低地址位 <br /><br />Tabs 属性 标记每一项的内容 <br />TabIndex 属性 标记索引 <br />Text 属性 显示的文本 <br />TextToFloat 函数 将字符串（以NULL结束的格式）转换为浮点数 <br />Time 函数 返回当前的时间 <br />TimeToStr 函数 将时间格式转换为字符串 <br />Trim 函数 从给定的字符串中删除前导和尾部的空格及控制字符 <br />TrimLeft 函数 从给定的字符串中删除首部的空格及控制字符 <br />TrimRight 函数 从给定的字符串中删除尾部的空格及控制字符 <br />Trunc 函数 将实型值截取为整型值 <br />Truncate 函数 截去当前文件位置后的内容 <br /><br />UnSelectedColor 属性 未选中颜色 <br />UpCase 将字符转换为大写 <br />UpperCase 将给定的字符串变为大写 <br /><br />Val 函数 将字符串转换为整型值 <br />VarArrayCreate 函数 以给定的界限和维数建立变体数组 <br />VarArrayDimCount 函数 返回给定变体的维数 <br />VarArrayHighBound 函数 返回给定变体数组维数的上界 <br />VarArrayLock 函数 锁定给定的变体数组 <br />VarArrayLowBound 函数 返回给定变体数组维数的下界 <br />VarArrayOf 函数 返回指定变体的数组元素 <br />VarArrayRedim 函数 通过改变上限来调整变体的大小 <br />VarArrayUnlock 函数 解锁指定的变体数组 <br />VarAsType 函数 将变体转换为指定的类型 <br />VarCase 函数 将变体转换为指定的类型并保存他 <br />VarClear 函数 清除指定的变体 <br />VarCopy 函数 将指定的变体复制为指定的变体 <br />VarFormDateTime 函数 返回包含日期时间的变体 <br />VarIsArray 函数 测试变体是否为数组 <br />VarIsEmpty 函数 测试变体是否为UNASSIGNED <br />VarIsNull 函数 测试变体是否为NULL <br />VarToDateTime 函数 将给定的变体转换为日期时间 <br />VarType 函数 将变体转换为指定的类型并保存他 <br />Visible 属性 控件的可见性 <br /><br />WantReturns 属性 为True时，按回车键产生一个回车符；为False时，按下Ctrl+Enter才产生回车符 <br />Write 命令 对有格式的文件，写一变量到文件组件中；对文本文件，写一个或多个值到文件中 <br />Writeln 命令 执行WRITE过程，然后输出一行结束标志 <br />WideCharLenToString 函数 将ANSI字符串转换为UNICODE字符串 <br />WideCharLenToStrWar 函数 将UNICODE字符串转换为ANSI字符串变量 <br />WideCharToString 函数 将UNICODE字符串转换为ANSI字符串 <br />WideCharToStrVar 函数 将UNICODE字符串转换为ANSI字符串变量 <br /><img src ="http://www.blogjava.net/badboyryan/aggbug/95523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-23 13:28 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/23/95523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELPHI常用的流水账！不断更新</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/20/89044.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Wed, 20 Dec 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/20/89044.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/89044.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/20/89044.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/89044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/89044.html</trackback:ping><description><![CDATA[1、sql := 'SELECT To_char(SYSDATE,'+ QuotedStr('yyyy-MM-dd hh:mm:ss')+') as d FROM Dual';<br />      QuotedStr ： 此函数的作用保证数据库里面执行的SQL不会因为‘，等特殊字符而出错；<br />      Dual          ： oracle数据库里面的函数。<br />2、          Application.ProcessMessages;<br />这个语句的作用很大啊，工控里面有专门负责数据采集的程序，时时的需要采集数据，里面要是不加上这么一句话你的前台展示，就会很难看，鼠标点击下去，老半天没有反应。<br />3、Delphi--Stream和Variant的转化网上广为流传的两个函数，确实好用。<br /><strong>procedure</strong> VariantToStream (<strong>const</strong> v : OleVariant; Stream : TMemoryStream); <br /><strong>var</strong><br />  p : pointer; <br /><strong>begin <br /></strong>  Stream.Position := <font color="#ff00ff">0</font>; <br />  Stream.Size := VarArrayHighBound (v, <font color="#ff00ff">1</font>) - VarArrayLowBound (v, <font color="#ff00ff">1</font>) + <font color="#ff00ff">1</font>; <br />  p := VarArrayLock (v); <br />  Stream.Write (p^, Stream.Size); <br />  VarArrayUnlock (v); <br />  Stream.Position := <font color="#ff00ff">0</font>; <br /><strong>end</strong>; 
<p><strong>procedure</strong> StreamToVariant (Stream : TMemoryStream;<strong> var</strong> v : OleVariant); <br /><strong>var</strong><br />  p : pointer; <br /><strong>begin</strong><br />  v := VarArrayCreate ([<font color="#ff00ff">0</font>, Stream.Size - <font color="#ff00ff">1</font>], varByte); <br />  p := VarArrayLock (v); <br />  Stream.Position := <font color="#ff00ff">0</font>; <br />  Stream.Read (p^, Stream.Size); <br />  VarArrayUnlock (v); <br /><strong>end</strong>; <br /><br /><br />4、这个函数也是非常镇的，<br /><br />function ByteType(const S: string; Index: Integer): TMbcsByteType;<br />IsDBCSLeadByte<br />告诉你一个非常有用的函数。</p><p>bytetype  它可以判断一个字符串中，某个 Char 是单个字母，还是双字节的前一位或<br />后一位。<br />mbSingleByte 单字母<br />mbLeadByte 双字节第一位<br />mbTrailByte 双字节第二位<br /><br />在copy（Str，1，12）中结果有个全角的8，，，过不去了居然quotedstr（）的结果也出现了？我怎么办<br /><br />function TFrmMain.procQJWT(olds: String): String;<br />var<br />  tmp : string;<br />begin<br />  tmp := Trim(olds);</p><p>  Result := tmp;  <br />  if Length(tmp)&gt;12 then<br />  begin<br />    //是单个字符<br />    if  ByteType(tmp,12)=mbLeadByte then<br />      result := Copy(tmp,1,11)<br />    else<br />      result := Copy(tmp,1,12);<br />  end;<br />end;<br /><br />写了一个函数就解决战斗了！<br /></p><img src ="http://www.blogjava.net/badboyryan/aggbug/89044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-20 15:07 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/20/89044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QuickReport打印字体怪怪的如何解决！</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/14/87699.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 14 Dec 2006 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/14/87699.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/87699.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/14/87699.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/87699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/87699.html</trackback:ping><description><![CDATA[        三年前做得一个药店的销售单打印的项目，最近又找到了，拿出来测试一下结果用DELPHI重新编译，运行软件，打印。结果发现销售单的宽度没有变化，结果字体拉长，纸张的高度本来一概94毫米高，结果成了A4纸张这么大；<br /><br />       去网络上GOOGLE了一下，没有找到类似的案例，没有办法只有自己解决了，旧程序是好的，新程序不可以，程序又没有修改过，WHY？后来发现QuickReport的版本当是我用的是3.X,现在用的是4.X。<br /><br />      有可能是控件的问题，呵呵原来QuickReport4.0.6不支持自定义纸张的打印，郁闷啊，无奈去网上费了九牛二虎之力终于下载了一个QuickReport3.6.2。。。<br /><br />     Installing.............<br /><br />     Finished.<br /><br />    Compileing.......<br /><br />    Run.<br /><br />    Print.....<br /><br />结果程序不用做任何修改，搞定！<br /><br /><br /><br /><img src ="http://www.blogjava.net/badboyryan/aggbug/87699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-14 14:31 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/14/87699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>delphi中多线程同步的一些方法</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/11/86803.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 11 Dec 2006 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/11/86803.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/86803.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/11/86803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/86803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/86803.html</trackback:ping><description><![CDATA[       多核时代的到来，对于我们程序员来说要尽快的，尽可能多的使用多线程编程只有这样，作的程序才会有高效率，这个思想一定要宣传啊，不然多核时代了，还写单线程的程序就太不够档次了。<br /><br /><h4 class="TextColor1" id="subjcns!1F35743133BE93C7!115" style="MARGIN-BOTTOM: 0px">delphi中多线程同步的一些方法</h4><div id="msgcns!1F35743133BE93C7!115">当有多个线程的时候，经常需要去同步这些线程以访问同一个数据或资源。例如，假设有一个程序，其中一个线程用于把文件读到内存，而另一个线程用于统计文件中的字符数。当然，在把整个文件调入内存之前，统计它的计数是没有意义的。但是，由于每个操作都有自己的线程，操作系统会把两个线程当作是互不相干的任务分别执行，这样就可能在没有把整个文件装入内存时统计字数。为解决此问题，你必须使两个线程同步工作。 <br />存在一些线程同步地址的问题，Win32提供了许多线程同步的方式。在本节你将看到使用临界区、 互斥、信号量和事件来解决线程同步的问题。 <br /><br /><b>1. 临界区</b><br />临界区是一种最直接的线程同步方式。所谓临界区，就是一次只能由一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内，另一个线程在第一个线程处理完之前是不会被执行的。 <br />在使用临界区之前，必须使用InitializeCriticalSection()过程来初始化它。 <br />其声明如下： 
<div><span>    procedure</span> InitializeCriticalSection(<span>var</span></div><div><span>lpCriticalSection参数是一个TRTLCriticalSection类型的记录，并且是变参。至于TRTLCriticalSection 是如何定义的，这并不重要，因为很少需要查看这个记录中的具体内容。只需要在lpCriticalSection中传递未初始化的记录，InitializeCriticalSection()过程就会填充这个记录。 <br />注意Microsoft故意隐瞒了TRTLCriticalSection的细节。因为，其内容在不同的硬件平台上是不同的。在基于Intel的平台上，TRTLCriticalSection包含一个计数器、一个指示当前线程句柄的域和一个系统事件的句柄。在Alpha平台上，计数器被替换为一种Alpha-CPU 数据结构，称为spinlock。在记录被填充后，我们就可以开始创建临界区了。这时我们需要用EnterCriticalSection()和LeaveCriticalSection()来封装代码块。这两个过程的声明如下： </span></div><div><span>    
<div><span>procedure</span> EnterCriticalSection(<span>var</span> lpCriticalSection:TRRLCriticalSection);stdcall; <br /><span>procedure</span> LeaveCriticalSection(<span>var</span></div></span></div><div><span>正如你所想的，参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。 <br />当你不需要TRTLCriticalSection记录时，应当调用DeleteCriticalSection()过程，下面是它的声明： 
<div><span>procedure</span> DeleteCriticalSection(<span>var</span></div><br /><br /><b>2. 互斥</b><br />互斥非常类似于临界区，除了两个关键的区别：首先，互斥可用于跨进程的线程同步。其次，互斥能被赋予一个字符串名字，并且通过引用此名字创建现有互斥对象的附加句柄。 <br />提示临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时，要用1 0 ~ 1 5个时间片，而事件对象由于涉及到系统内核要用400~600个时间片。 <br />可以调用函数CreateMutex ( )来创建一个互斥量。下面是函数的声明： 
<div><span>function</span></div><br />lpMutexAttributes参数为一个指向TSecurityAttributtes记录的指针。此参数通常设为0，表示默认的安全属性。bInitalOwner参数表示创建互斥对象的线程是否要成为此互斥对象的拥有者。当此参数为False时， 表示互斥对象没有拥有者。 <br />lpName参数指定互斥对象的名称。设为nil表示无命名，如果参数不是设为nil，函数会搜索是否有同名的互斥对象存在。如果有，函数就会返回同名互斥对象的句柄。否则，就新创建一个互斥对象并返回其句柄。 <br />当使用完互斥对象时，应当调用CloseHandle()来关闭它。 <br /><br />在程序中使用WaitForSingleObject()来防止其他线程进入同步区域的代码。此函数声明如下： 
<div><span>function</span></div><br /><br />这个函数可以使当前线程在dwMilliseconds指定的时间内睡眠，直到hHandle参数指定的对象进入发信号状态为止。一个互斥对象不再被线程拥有时，它就进入发信号状态。当一个进程要终止时，它就进入发信号状态。dwMilliseconds参数可以设为0，这意味着只检查hHandle参数指定的对象是否处于发信号状态，而后立即返回。dwMilliseconds参数设为INFINITE，表示如果信号不出现将一直等下去。 <br />这个函数的返回值如下 <br />WaitFor SingleObject()函数使用的返回值 <br />返回值 含义 <br />WAIT_ABANDONED 指定的对象是互斥对象，并且拥有这个互斥对象的线程在没有释放此对象之前就已终止。此时就称互斥对象被抛弃。这种情况下，这个互斥对象归当前线程所有，并把它设为非发信号状态 <br />WAIT_OBJECT_0 指定的对象处于发信号状态 <br />WAIT_TIMEOUT等待的时间已过，对象仍然是非发信号状态再次声明，当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者，此互斥对象设为不发信号状态。当线程调用ReleaseMutex()函数并传递一个互斥对象的句柄作为参数时，这种拥有关系就被解除，互斥对象重新进入发信号状态。 <br />注意除WaitForSingleObject()函数外，你还可以使用WaitForMultipleObject()和MsgWaitForMultipleObject()函数，它们可以等待几个对象变为发信号状态。这两个函数的详细情况请看Win32 API联机文档。 <br /><br /><b>3. 信号量</b><br />另一种使线程同步的技术是使用信号量对象。它是在互斥的基础上建立的，但信号量增加了资源计数的功能，预定数目的线程允许同时进入要同步的代码。可以用CreateSemaphore()来创建一个信号量对象，其声明如下： 
<div><span>function</span></div><br />和CreateMutex()函数一样，CreateSemaphore()的第一个参数也是一个指向TSecurityAttribute s记录的指针，此参数的缺省值可以设为nil。 <br />lInitialCount参数用来指定一个信号量的初始计数值，这个值必须在0和lMaximumCount之间。此参数大于0，就表示信号量处于发信号状态。当调用WaitForSingleObject()函数(或其他函数)时，此计数值就减1。当调用ReleaseSemaphore()时，此计数值加1。 <br />参数lMaximumCount指定计数值的最大值。如果这个信号量代表某种资源，那么这个值代表可用资源总数。 <br />参数lpName用于给出信号量对象的名称，它类似于CreateMutex()函数的lpName参数。 <br /><br />—————————————————————————————————————————— <br /><br />★★★关于线程同步： <br />Synchronize()是在一个隐蔽的窗口里运行，如果在这里你的任务很繁忙，你的主窗口会阻塞掉；Synchronize()只是将该线程的代码放到主线程中运行，并非线程同步。 <br /><br />临界区是一个进程里的所有线程同步的最好办法，他不是系统级的，只是进程级的，也就是说他可能利用进程内的一些标志来保证该进程内的线程同步，据Richter说是一个记数循环；临界区只能在同一进程内使用；临界区只能无限期等待，不过2k增加了TryEnterCriticalSection函数实现0时间等待。 <br /><br />互斥则是保证多进程间的线程同步，他是利用系统内核对象来保证同步的。由于系统内核对象可以是有名字的，因此多个进程间可以利用这个有名字的内核对象保证系统资源的线程安全性。互斥量是Win32 内核对象，由操作系统负责管理；互斥量可以使用WaitForSingleObject实现无限等待，0时间等待和任意时间等待。<br /><br /><b>1. 临界区</b><br />临界区是一种最直接的线程同步方式。所谓临界区，就是一次只能由一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内，另一个线程在第一个线程处理完之前是不会被执行的。在使用临界区之前，必须使用InitializeCriticalSection()过程来初始化它。 <br />在第一个线程调用了EnterCriticalSection()之后，所有别的线程就不能再进入代码块。下一个线程要等第一个线程调用LeaveCriticalSection()后才能被唤醒。 <br /><br /><b>2. 互斥</b><br />互斥非常类似于临界区，除了两个关键的区别：首先，互斥可用于跨进程的线程同步。其次，互斥能被赋予一个字符串名字，并且通过引用此名字创建现有互斥对象的附加句柄。 <br />提示：临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时，要用10 ~ 15个时间片，而事件对象由于涉及到系统内核要用400~600个时间片。 <br />当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者，此互斥对象设为不发信号状态。当线程调用ReleaseMutex()函数并传递一个互斥对象的句柄作为参数时，这种拥有关系就被解除，互斥对象重新进入发信号状态。 <br />可以调用函数CreateMutex()来创建一个互斥量。当使用完互斥对象时，应当调用CloseHandle()来关闭它。 <br /><br /><b>3. 信号量</b><br />另一种使线程同步的技术是使用信号量对象。它是在互斥的基础上建立的，但信号量增加了资源计数的功能，预定数目的线程允许同时进入要同步的代码。可以用CreateSemaphore()来创建一个信号量对象， <br />因为只允许一个线程进入要同步的代码，所以信号量的最大计数值(lMaximumCount)要设为1。ReleaseSemaphore()函数将使信号量对象的计数加1； <br />记住，最后一定要调用CloseHandle()函数来释放由CreateSemaphore()创建的信号量对象的句柄。 <br /><br />★★★WaitForSingleObject函数的返值： <br />WAIT_ABANDONED指定的对象是互斥对象，并且拥有这个互斥对象的线程在没有释放此对象之前就已终止。此时就称互斥对象被抛弃。这种情况下，这个互斥对象归当前线程所有，并把它设为非发信号状态； <br />WAIT_OBJECT_0 指定的对象处于发信号状态； <br />WAIT_TIMEOUT等待的时间已过，对象仍然是非发信号状态； <br /><br />—————————————————————————————————————————————— <br />VCL支持三种技术来达到这个目的： <br />（2） 使用critical区 <br />如果对象没有提高内置的锁定功能，需要使用critical区，Critical区在同一个时间只也许一个线程进入。为了使用Critical区，产生一个TCriticalSection全局的实例。TcriticalSection有两个方法，Acquire(阻止其他线程执行该区域)和Release(取消阻止) <br /><br />　　每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后，线程调用Release方法，让其他线程也可以通过调用Acquire来使用这块全局内存。 <br /><br />　　警告：Critical区只有在所有的线程都使用它来访问全局内存，如果有线程直接调用内存，而不通过Acquire，会造成同时访问的问题。例如：LockXY是一个全局的Critical区变量。任何一个访问全局X, Y的变量的线程，在访问前，都必须使用Acquire 
<div>LockXY<span>.</span>Acquire; <span>{ lock out other threads }</span><br /><span>try</span><br />Y := sin(X); <br /><span>finally</span><br />LockXY<span>.</span>Release; <br /><span>end</span></div>临界区主要是为实现线程之间同步的，但是使用的时候注意，一定要在用此临界对象同步的线程之外建立该对象（一般在主线程中建立临界对象）。 <br /><br />———————————————————————————————————————————————— <br />线程同步使用临界区，进程同步使用互斥对象。 <br /><br />Delphi中封装了临界对象。对象名为TCriticalSection，使用的时候只要在主线程当中建立这个临界对象（注意一定要在需要同步的线程之外建立这个对象）。具体同步的时候使用Lock和Unlock即可。 <br />而进程间同步建立互斥对象，则只需要建立一个互斥对象CreateMutex. 需要同步的时候只需要WaitForSingleObject(mutexhandle, INFINITE) unlock的时候只需要ReleaseMutex(mutexhandle);即可。 <br /><br />有很多方法, 信号灯, 临界区, 互斥对象,此外, windows下还可以用全局原子,共享内存等等. 在windows体系中, 读写一个8位整数时原子的, 你可以依靠这一点完成互斥的方法. 对于能够产生全局名称的方法能够可以在进程间同步上(如互斥对象), 也可以用在线程间同步上;不能够产生全局名称的方法(如临界区)只能用在线程间同步上.</span></div></div><img src ="http://www.blogjava.net/badboyryan/aggbug/86803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-11 09:26 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/11/86803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码格式化工具</title><link>http://www.blogjava.net/badboyryan/archive/2006/09/11/68973.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 11 Sep 2006 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/09/11/68973.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/68973.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/09/11/68973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/68973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/68973.html</trackback:ping><description><![CDATA[<a href="/Files/badboyryan/DelForEx.v2.5.zip">http://www.blogjava.net/Files/badboyryan/DelForEx.v2.5.zip</a> <br />
<br />
这个工具是delphi里面代码格式化的工具！陈省 在DELPHI深度探索里面介绍的代码格式化工具 <br />
工具2：<br />
dz的论坛数据恢复的工具<br />
http://www.blogjava.net/Files/badboyryan/dz数据库恢复.rar<br />
端口查看器<br />
http://www.blogjava.net/Files/badboyryan/Active%20Ports端口查看器汉化版.rar<br />
清除windows服务<br />
<a href="http://www.blogjava.net/Files/badboyryan/profileclean.rar">http://www.blogjava.net/Files/badboyryan/profileclean.rar</a>
<img src ="http://www.blogjava.net/badboyryan/aggbug/68973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-09-11 15:37 <a href="http://www.blogjava.net/badboyryan/archive/2006/09/11/68973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>