<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>VFP及Sql Server拙笔</title>
<link>http://blogger.org.cn/blog/blog.asp?name=doubworm</link>
<description>老瓷的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[VFP日期时间转中文日期时间]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=73346</link>
<author>doubworm</author>
<pubDate>2015/4/9 13:05:02</pubDate>
<description><![CDATA[<P>本函数原为VFP中取日期转中文日期方式，后增加日期时间处理，并改用Iif及ICase修改原代码。<BR>Function DateTime2CHN<BR>Parameters pdDate,plTime<BR>*!* pdDate -- 日期 或 日期时间；&nbsp; plTime -- 取时间否，1--取时间，0--不取时间(默认)，此参数为空时取默认值<BR>*!* By HeQiang&nbsp; 2003-04-01&nbsp; Edit:2010-07-12<BR>If VarType(plTime, .T.)&lt;&gt;'N' Or IsNull(plTime) Or !Between(plTime, 0, 1) Or VarType(pdDate,.T.)='D'<BR>&nbsp;&nbsp; plTime = 0<BR>EndIf<BR>Local lcYMD<BR>Local lnYear,lnMonth,lnDay<BR>lnYear = Year(pdDate)<BR>lnMonth = Month(pdDate)<BR>lnDay = Day(pdDate)<BR><BR>lcYMD = ChrTranC(Transform(lnYear), [1234567890], [一二三四五六七八九〇]) + [年]<BR>lcYMD = lcYMD + ChrTranC(ICase(lnMonth&gt;9, [十] + Transform(Mod(lnMonth,10)), Transform(lnMonth)), [1234567890], [一二三四五六七八九]) + [月]<BR>lcYMD = lcYMD + ChrTranC(ICase(lnDay&gt;19, Transform(Int(lnDay/10)) + [十] + Transform(Mod(lnDay,10)), lnDay&gt;9, [十] + Transform(Mod(lnDay,10)), Transform(lnDay)), [1234567890], [一二三四五六七八九]) + [日]<BR>If plTime=0<BR>Else<BR>&nbsp;&nbsp; lcYMD = lcYMD + [ ] + Iif(Hour(ldDate)=0,&nbsp;&nbsp; [〇], ChrTranC(ICase(Hour(ldDate)&gt;19,&nbsp;&nbsp; Transform(Int(Hour(ldDate)/10))&nbsp;&nbsp; + [十] + Transform(Mod(Hour(ldDate),10)),&nbsp;&nbsp; Hour(ldDate)&gt;9,&nbsp;&nbsp; [十] + Transform(Mod(Hour(ldDate),10)),&nbsp;&nbsp; Transform(Hour(ldDate))),&nbsp; [1234567890], [一二三四五六七八九])) + [时]<BR>&nbsp;&nbsp; lcYMD = lcYMD +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iif(Minute(ldDate)=0, [〇], ChrTranC(ICase(Minute(ldDate)&gt;19, Transform(Int(Minute(ldDate)/10)) + [十] + Transform(Mod(Minute(ldDate),10)), Minute(ldDate)&gt;9, [十] + Transform(Mod(Minute(ldDate),10)), Transform(Minute(ldDate))),[1234567890], [一二三四五六七八九])) + [分]<BR>&nbsp;&nbsp; lcYMD = lcYMD +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iif(Sec(ldDate)=0,&nbsp;&nbsp;&nbsp; [〇], ChrTranC(ICase(Sec(ldDate)&gt;19,&nbsp;&nbsp;&nbsp; Transform(Int(Sec(ldDate)/10))&nbsp;&nbsp;&nbsp; + [十] + Transform(Mod(Sec(ldDate),10)),&nbsp;&nbsp;&nbsp; Sec(ldDate)&gt;9,&nbsp;&nbsp;&nbsp; [十] + Transform(Mod(Sec(ldDate),10)),&nbsp;&nbsp;&nbsp; Transform(Sec(ldDate))),&nbsp;&nbsp; [1234567890], [一二三四五六七八九])) + [秒]<BR>EndIf<BR>Return lcYMD<BR>EndFunc</P>]]></description>
</item><item>
<title><![CDATA[VFP9利用_GdiPlus类处理图片分辨率及缩放]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=73327</link>
<author>doubworm</author>
<pubDate>2015/2/7 14:39:14</pubDate>
<description><![CDATA[<P>Local lcFile_S, lcFile_T, lnW_T, lnH_T, lnXDpi_T, lnYDpi_T</P>
<P>m.lcFile_S = 'D:\Temp\Source.jpg'<BR>m.lcFile_T = 'D:\Temp\Target.jpg'</P>
<P>m.lnW_T = 160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 目标图宽、高度<BR>m.lnH_T = 240<BR>m.lnXDpi_T = 72&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 目标图分辨率<BR>m.lnYDpi_T = 72</P>
<P>Set Classlib To "_GDIPlus.Vcx" Additive</P>
<P>oGraphics=CreateObject("gpGraphics")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 创建工作图像</P>
<P>oImage=CreateObject("gpImage")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 源图<BR>oImage.CreateFromFile(m.lcFile_S)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 从源图创建<BR>m.lnW = oImage.ImageWidth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 宽<BR>m.lnH = oImage.ImageHeight&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 高<BR>m.lnXDpi = oImage.HorizontalResolution&nbsp;&nbsp;&nbsp; &amp;&amp; 水平分辨率<BR>m.lnYDpi = oImage.VerticalResolution&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 垂直分辨率</P>
<P>oBitMap=CreateObject("gpBitMap")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 目标图<BR>oBitMap.Create(m.lnW_T, m.lnH_T)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 按目标图大小创建</P>
<P>oGraphics.CreateFromImage(oBitMap)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 工作图像按目标图建立<BR>oBitMap.SetResolution(m.lnXDpi_T, m.lnYDpi_T)&nbsp;&nbsp;&nbsp; &amp;&amp; 设置目标图分辨率</P>
<P>oGraphics.DrawImageScaled(oImage, 0, 0, m.lnW_T, m.lnH_T)&nbsp;&nbsp;&nbsp; &amp;&amp; 源图按指定矩形区域缩放</P>
<P>m.lnQuality = 90&nbsp; &amp;&amp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; 图片保存质量<BR>oBitMap.SaveToFile(m.lcFile_T, oImage.GetEncoderCLSID("image/jpeg"), "quality="+Transform(m.lnQuality))&nbsp;&nbsp;&nbsp; &amp;&amp; 按源文件类型保存至目标文件</P>
<P>Release oBitMap&nbsp;&nbsp;&nbsp; &amp;&amp; 释放<BR>Release oImage<BR>Release oGraphics</P>
<P>Release Classlib _GdiPlus<BR></P>]]></description>
</item><item>
<title><![CDATA[(转)设置在64位机器上的IIS(IIS6/IIS7)兼容32位程序（64位ODBC和32位ODBC的问题同样适用）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=73161</link>
<author>doubworm</author>
<pubDate>2014/3/25 11:33:06</pubDate>
<description><![CDATA[<P><SPAN>64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程序，也不支持更早的Microsoft Access Driver (*.mdb)方式连接。所以用于 Access 和 Excel 数据库的 Microsoft OLE DB Provider for Jet 在 64 位版本中不可用，也就是说，如下两种连接字符串都已经无法正常工作了：</SPAN></P>
<P>“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”&amp;Server.mappath(db)</P>
<P>“driver=Microsoft Access Driver (*.mdb);DBQ=”&amp;Server.MapPath(db)</P>
<P>既然这样，就只能使用一个办法，将IIS的运行环境设置为32位：</P>
<P>IIS6上的做法:</P>
<P>1.命令行键入:</P>
<P>cscript.exe %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1</P>
<P>即设置IIS6允许32位程序运行在64位机器上</P>
<P>2.重新注册.net FrameWorks</P>
<P>%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i</P>
<P>3.完成之后，应该会看到多出一个32位的asp.net,如下图:<BR><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="uploadfile/2014325113155189.JPG"><BR></P>
<P>将其设置为允许，缺点：这样会使整个IIS上的所有站点都以32位兼容方式运行</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后再运行一下：%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样就可以跑32位的程序了。</P>
<P>不过在IIS7上的做法要简单很多：</P>
<P>应用程序池，高级设置–&gt;允许32位应用程序，如下图:<BR><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 src="uploadfile/2014325113232979.JPG"><BR></P>]]></description>
</item><item>
<title><![CDATA[(转摘)VFP调用API来控制USB摄像头，实现拍照或录像]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=73155</link>
<author>doubworm</author>
<pubDate>2014/3/21 13:30:50</pubDate>
<description><![CDATA[
<P>*--前提：VFP7.0以上;Windows 2K及以上</P>
<P><BR>*--定义：一般放到主程序或表单(集)的Load事件中<BR>Public WM_CAP_DRIVER_DISCONNECT<BR>Public hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP<BR>Declare Integer capCreateCaptureWindowA In "AVICAP32.DLL" String lpszWindowName ,Integer dwStyle ,;<BR>&nbsp;&nbsp;&nbsp; Integer x, Integer Y, Integer nWidth ,Integer nHeight,Integer ParentWin,Integer nId<BR>Declare Integer SendMessage In "user32" Integer HWnd, Integer wmsg,Integer wpar1, Integer wpar2<BR>Declare Integer SendMessage In "user32" As SendMessageA Integer HWnd, Integer wmsg,Integer wpar1, String wpar2<BR>&nbsp;</P>
<P>*--显示：可以放到按钮或表单(集)的Init事件中<BR>WM_USER = 1024<BR>WM_CAP_START = WM_USER<BR>WM_CAP_STOP = WM_CAP_START + 68<BR>WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10<BR>WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11<BR>WM_CAP_SAVEDIB = WM_CAP_START + 25<BR>WM_CAP_GRAB_FRAME = WM_CAP_START + 60<BR>WM_CAP_SEQUENCE = WM_CAP_START + 62<BR>WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20<BR>WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63<BR>WM_CAP_SET_OVERLAY =WM_CAP_START+ 51<BR>WM_CAP_SET_PREVIEW =WM_CAP_START+ 50<BR>WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6<BR>WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2<BR>WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3<BR>WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5<BR>WM_CAP_SET_SCALE=WM_CAP_START+ 53<BR>WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52<BR>*第3、4个参数是定义显示位置,第5、6个参数是定义显示大小。<BR>hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,320,240,Thisform.HWnd ,0)<BR>If hWndC &lt;&gt; 0<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)<BR>&nbsp;&nbsp;&nbsp; SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)<BR>&nbsp;&nbsp;&nbsp; * THISFORM.ACTIVATE<BR>Endif<BR>&nbsp;</P>
<P>*--关闭显示：<BR>SendMessage(hWndC,WM_CAP_DRIVER_DISCONNECT, 0, 0)<BR>hWndC=0<BR>&nbsp;</P>
<P>*--保存图像：<BR>*--无法控制生成的文件尺寸，因为是由摄像头本身默认的，不过可用Image控件显示时进行等比缩小的。<BR>ss=Getfile("bmp;Jpg")<BR>If !Empty(ss)<BR>&nbsp;&nbsp;&nbsp; SendMessageA(hWndC,WM_CAP_SAVEDIB,0,SS)<BR>Endif<BR>&nbsp;</P>
<P>*--录像：<BR>ss = Getfile("avi")<BR>If !Empty(ss)<BR>&nbsp;&nbsp;&nbsp; SendMessageA(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0,ss)<BR>&nbsp;&nbsp;&nbsp; SendMessageA(hWndC, WM_CAP_SEQUENCE, 0, 0)<BR>&nbsp;&nbsp;&nbsp; This.Enabled=.F.<BR>&nbsp;&nbsp;&nbsp; Thisform.MousePointer= 0<BR>&nbsp;&nbsp;&nbsp; Thisform.停止录像按钮.Enabled=.T.<BR>Endif<BR>&nbsp;</P>
<P>*--停止录像：<BR>SendMessage(hWndC, WM_CAP_STOP, 0, 0)<BR>Thisform.开始录像按钮.Enabled=.T.<BR>This.Enabled=.F.<BR></P>]]></description>
</item><item>
<title><![CDATA[VFP9.0的GDI+类的使用]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=72925</link>
<author>doubworm</author>
<pubDate>2013/2/2 23:54:09</pubDate>
<description><![CDATA[<P>GDI+你应该不会陌生吧，然而，在VFP里要使用这一技术，可不是一件容易的事，你得学习一大堆API函数。或许，一想到这，你已经望而却步了。不过，从现在起，这一技术不再是豪门旺族的专宠了，我们每一位Foxer都可以让它成为我们得心应手的好工具了。下面就跟我一起来领略它的风采吧。<BR>在9.0的版本里，有个叫_GDIplus的类，它位于VFP的安装目录下：Home(1) + “FFC\_GDIplus.vcx”,是的，这是API函数的封装类，既然已经是封装的类了，那么，我们就不用关心底层的API了，所心，我们完全可以像用普通的VFP类一样，就这么方便：<BR>这个类里有很多成员，但我们不必奢望太多，只须一部分，一部分就足够了。<BR><IMG style="BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000; BORDER-LEFT-COLOR: #000000" border=0 alt=VFP9的GDI+类库：_gdiplua.vcx src="http://blogger.org.cn/blog/uploadfile/201322234753906.JPG"><BR>有一个流程我们必须要搞清楚：倘若我们想手工画一幅画的话，首先得确定这幅的大小吧，这个大小我们可以用pgBitmap对象来设定，如果你是想在一幅已有的画上锦上添花的话，那就用gpImage对象，注意，这仅仅是一个预步骤，确定绘图尺寸。好，现在尺寸有了，那就跟据这个尺寸来弄张纸吧，要不然我们往哪儿画呢。<BR>说曹操曹操到，Gpgraphics对象就可以为你弄一张你想要的画布，大小跟你想像的一样。接下来的工作就是画笔和颜料了，按顺序，先确定你的颜料吧，gpColor对象可以为你生成你想要的颜料，且不用但心颜料量的问题。颜料问题我为你解决了，还有笔的问题，商店里有两种笔，不知你要哪种，一种是画轮廓的笔，gpPen,就是画线条的笔，另一种是实心笔，gpsolidbrush，用来写字和填充再适合不过了。好了，万事具备，只欠东风了，开始画吧。不过，好像你还是不会，我得教你一些本领，必竟这是VFP绘图，还记得前面为我们创建画布的东东吧，它能教我们很多绘图本领，比如画直线，画椭圆，画矩形，写文字，画贝兹曲线等等等等，呵呵，一口气我说不完。那么我也有点渴了，请允许我润一下嗓子……………….<BR>好了，我们来成就我们的第一幅作品吧，并将它保存为图片文件，你觉得我的建议怎么样：<BR>用表单设计器准备一个表单，大小嘛500*500好了，我们就在这个表单上画绘吧</P>
<P>SET CLASSLIB TO HOME(1) + "FFC\_gdiplus.vcx"<BR>loColorA = CREATEOBJECT("gpColor",255,0,0,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;红色：颜色值为红，绿，蓝，透明度（0为透明，255为不透明）<BR>loColorB = CREATEOBJECT("gpColor",50,50,50,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;深灰色：颜色值为红，绿，蓝，透明度（0为透明，255为不透明）<BR>loPen = CREATEOBJECT("gpPen",loColorB,2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;用前句创建的画笔颜色，画笔宽度为2个像素，可自行更改。<BR>loSolidBrush = CREATEOBJECT("gpSolidbrush",loColorA)&nbsp;&nbsp;&nbsp; &amp;&amp;创建实体画笔，就要用于写文字和填充。<BR>lopoint = CREATEOBJECT("gpPoint",50,50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;创建点对象<BR>loRectangle = CREATEOBJECT("gprectangle",50,50,300,300) &amp;&amp;创建矩形对象<BR>loGraphics = CREATEOBJECT("gpGraphics")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;创建画布对象<BR>loGraphics.createfromHwnd(Thisform.HWnd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;将本画布对象设定为表单大小，这是固定写法。后面我会讲自定义画布大小<BR>loColorA.set(255,0,0,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,45,90)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制实心扇形图。下同</P>
<P>loColorA.set(0,255,0,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,135,90)</P>
<P>loColorA.set(0,0,255,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,225,90)</P>
<P>loColorA.set(110,16,172,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,315,90)</P>
<P>loGraphics.Drawrectangle(loPen,50,50,300,300)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制矩形<BR>loGraphics.DrawLine(loPen,50,50,350,350)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制直线<BR>loGraphics.Drawline(loPen,350,50,50,350)<BR>lographics.DrawEllipse(lopen,50,50,300,300)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制椭圆</P>
<P>以上程序段你可以放在表单的Pait()事件里，当然也可以放在其它的Click事件里。<BR>运行，看看效果吧。不过我们要将它保存为图片，这里我们得做必要的修改。如下：<BR>不过这次我是把代码写在了表单的Activate事件里了：</P>
<P>SET CLASSLIB TO HOME(1) + "FFC\_gdiplus.vcx"<BR>Thisform.AddObject("ShowDrawing","Image")<BR>loColorA = CREATEOBJECT("gpColor",255,255,255,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;红色：颜色值为红，绿，蓝，透明度（0为透明，255为不透明）<BR>loColorB = CREATEOBJECT("gpColor",50,50,50,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;深灰色：颜色值为红，绿，蓝，透明度（0为透明，255为不透明）</P>
<P>lobitmap = CREATEOBJECT("gpBitmap",Thisform.Width,Thisform.Height)</P>
<P>loPen = CREATEOBJECT("gpPen",loColorA,2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;用前句创建的画笔颜色，画笔宽度为2个像素，可自行更改。<BR>loBrush = CREATEOBJECT("gpSolidbrush",loColorA)</P>
<P>loSolidBrush = CREATEOBJECT("gpSolidbrush",loColorA)&nbsp;&nbsp;&nbsp; &amp;&amp;创建实体画笔，就要用于写文字和填充。<BR>lopoint = CREATEOBJECT("gpPoint",50,50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;创建点对象<BR>loRectangle = CREATEOBJECT("gprectangle",50,50,300,300) &amp;&amp;创建矩形对象<BR>loGraphics = CREATEOBJECT("gpGraphics")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;创建画布对象</P>
<P>*loGraphics.createfromHwnd(Thisform.HWnd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;将本画布对象设定为表单大小，这是固定写法。后面我会讲自定义画布大小<BR>loGraphics.createfromImage(lobitmap)<BR>loGraphics.fillRectangle(loBrush,0,0,Thisform.Width,Thisform.Height)</P>
<P>loColorA.set(255,0,0,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,45,90)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制实心扇形图。下同</P>
<P>loColorA.set(0,255,0,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,135,90)</P>
<P>loColorA.set(0,0,255,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,225,90)</P>
<P>loColorA.set(110,16,172,255)<BR>loSolidBrush.create(locolorA)<BR>lographics.FillPie(loSolidBrush,loRectangle,315,90)</P>
<P>loGraphics.Drawrectangle(loPen,50,50,300,300)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制矩形<BR>loGraphics.DrawLine(loPen,50,50,350,350)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制直线<BR>loGraphics.Drawline(loPen,350,50,50,350)<BR>lographics.DrawEllipse(lopen,50,50,300,300)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;绘制椭圆</P>
<P>lSuccess = loBitmap.Savetofile("D:\test.jpg", "image/jpeg", "quality=100" )</P>
<P>IF lSuccess<BR>&nbsp;&nbsp; Thisform.ShowDrawing.Picture = "D:\test.jpg"<BR>&nbsp;&nbsp; Thisform.ShowDrawing.left = 0<BR>&nbsp;&nbsp; Thisform.ShowDrawing.Top = 0<BR>&nbsp;&nbsp; Thisform.ShowDrawing.Visible = .T. <BR>&nbsp;&nbsp; WAIT WINDOW "图片已经保存到：D:\test.jpg" NOWAIT <BR>ELSE <BR>&nbsp;&nbsp; MESSAGEBOX("图片保存失败")<BR>ENDIF</P>]]></description>
</item><item>
<title><![CDATA[快速启动栏中的显示桌面图标的恢复]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=72918</link>
<author>doubworm</author>
<pubDate>2013/1/15 1:34:48</pubDate>
<description><![CDATA[<P>在适当的文件夹（如C:\WINDOWS）新建一个文件名为“显示桌面.scf”的文件，其内容为：<BR>[Shell]<BR>Command=2<BR>IconFile=explorer.exe,3</P>
<P>[Taskbar]<BR>Command=ToggleDesktop</P>
<P>保存文件后将其拉入快速启动栏即可。</P>
<P>&nbsp;</P>
<P>资源管理的恢复类似，其文件内容为：<BR>[Shell]<BR>Command=2<BR>IconFile=explorer.exe,1</P>
<P>[Taskbar]<BR>Command=Explorer</P>]]></description>
</item><item>
<title><![CDATA[新年拜年拱手礼姿式]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=72915</link>
<author>doubworm</author>
<pubDate>2013/1/9 14:43:46</pubDate>
<description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 拱手礼就是两手相合，一般左手在上右手在下姿式。上下摆动，向对方以示敬意。中国是一个礼仪之邦，在人际关系中，无论相见、分别、感谢、谦让、致歉等等的场面都少不了一些礼节形式，否则就会失礼，没有礼貌。</P>
<P>&nbsp;&nbsp;&nbsp; 从古至今，中国几千年来，从来没有失去过一些传统的礼仪。就在当代，我们仍然在各种应酬、集会、社交活动之中，保留着这些礼仪形式。而这些礼仪，主要就是拱手礼、握手礼和鞠躬礼。</P>]]></description>
</item><item>
<title><![CDATA[MSSql访问远程数据库]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=72903</link>
<author>doubworm</author>
<pubDate>2012/12/29 15:05:15</pubDate>
<description><![CDATA[<P>--第一部分(要点)<BR>--永久访问方式（需对访问远程数据库进行经常性操作）时设置链接数据库<BR>Exec sp_addlinkedserver 'MyLinkServer','','SQLOLEDB','远程服务器名或ip地址'<BR>--或：<BR>Exec sp_addlinkedserver '远程服务器',N'SQL Server'<BR>Exec sp_addlinkedsrvlogin 'MyLinkServer','false',null,'用户名','密码'</P>
<P>--返回本地服务器中定义的链接服务器列表<BR>Exec sp_linkedservers<BR>--返回表的字段中，其中对MSSQL而言：SRV_NAME(链接服务器的名称)，SRV_DATASOURCE(与指定链接服务器对应的服务器名)</P>
<P>--访问表时以四部分名称形式<BR>--查询示例<BR>Select * From MyLinkServer.数据库名.dbo.表名</P>
<P>--导入示例<BR>Select * Into 表 From MyLinkServer.数据库名.dbo.表名</P>
<P>--以后不再使用时删除链接服务器<BR>Exec sp_dropserver 'MyLinkServer','droplogins'&nbsp;&nbsp; --以用户名登录时<BR>--或：<BR>Exec sp_dropserver 'MyLinkServer'&nbsp;&nbsp; --未以用户名登录时</P>
<P>--连接远程/局域网数据(OpenRowSet/OpenQuery/OpenDataSource)<BR>--1、OpenRowSet<BR>--查询示例<BR>Select * From OpenRowSet('SQLOLEDB','SQL服务器名';'用户名';'密码',数据库名.dbo.表名)<BR>--生成本地表<BR>Select * Into 表 From OpenRowSet('SQLOLEDB','SQL服务器名';'用户名';'密码',数据库名.dbo.表名)<BR>--把本地表导入远程表<BR>Insert OpenRowSet('SQLOLEDB','SQL服务器名';'用户名';'密码',数据库名.dbo.表名)<BR>Select *From 本地表<BR>--更新本地表<BR>Update b<BR>Set b.列A=a.列A<BR>From OpenRowSet('SQLOLEDB','SQL服务器名';'用户名';'密码',数据库名.dbo.表名) As a Inner Join 本地表 b<BR>On a.column1=b.column1</P>
<P>--OpenQuery用法需要创建一个连接<BR>--首先创建一个连接创建链接服务器<BR>Exec sp_addlinkedserver 'MyLinkServer','','SQLOLEDB','远程服务器名或IP'<BR>--查询<BR>Select * From OpenQuery(MyLinkServer,'Select * From 数据库.dbo.表名')<BR>--把本地表导入远程表<BR>Insert OpenQuery(MyLinkServer,'Select * From 数据库.dbo.表名')<BR>Select * From 本地表<BR>--更新本地表<BR>Update b<BR>Set b.列B=a.列B<BR>From OpenQuery(MyLinkServer,'Select * From 数据库.dbo.表名') As a <BR>Inner Join 本地表 b On a.列A=b.列A</P>
<P>--3、OpenDataSource<BR>Select * From OpenDataSource('SQLOLEDB','Data Source=远程服务器名或IP;User ID=登陆名;Password=密码').test.dbo.roy_ta<BR>--把本地表导入远程表<BR>Insert OpenDataSource('SQLOLEDB','Data Source=远程服务器名或IP;User ID=登陆名;Password=密码').数据库.dbo.表名<BR>Select * From 本地表</P>
<P><BR>--第二部分(实际示例)<BR>--OpenRowSet使用OLEDB的一些例子<BR>Select * From OpenRowSet('SQLOLEDB','Server=(local);PWD=***;UID=sa;','Select * From TB.dbo.school') As t<BR>Select * From OpenRowSet('SQLOLEDB','Server=(local);PWD=***;UID=sa;',TB.dbo.school) As t<BR>Select * From OpenRowSet('SQLOLEDB','Server=(local);Trusted_Connection=yes;',TB.dbo.school) As t<BR>Select * From OpenRowSet('SQLOLEDB','(local)';'sa';'***','Select * From TB.dbo.school') As t<BR>Select * From OpenRowSet('SQLOLEDB','(local)';'sa';'***',TB.dbo.school) As t<BR>Select * From OpenRowSet('SQLOLEDB','(local)';'sa';'***','Select school.id As id1,people.id As id2 From TB.dbo.school Inner Join TB.dbo.people On school.id=people.id') As t</P>
<P>--OpenRowSet使用SQLNCLI的一些例子(SQLNCLI在SqlServer2005以上才能使用)<BR>Select * From OpenRowSet('SQLNCLI','(local)';'sa';'***','Select * From TB.dbo.school') As t<BR>Select * From OpenRowSet('SQLNCLI','Server=(local);Trusted_Connection=yes;','Select * From TB.dbo.school') As t<BR>Select * From OpenRowSet('SQLNCLI','Server=(local);UID=sa;PWD=***;','Select * From TB.dbo.school') As t<BR>Select * From OpenRowSet('SQLNCLI','Server=(local);UID=sa;PWD=***;',TB.dbo.school) As t<BR>Select * From OpenRowSet('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB','Select * From dbo.school') As t</P>
<P>--OpenRowSet其他使用<BR>Insert OpenRowSet('SQLNCLI','Server=(local);Trusted_Connection=yes;','Select name From TB.dbo.school Where id=1') Values('ghjkl') /*要不要Where都一样，插入一行*/<BR>Update OpenRowSet('SQLNCLI','Server=(local);Trusted_Connection=yes;','Select name From TB.dbo.school Where id=1') Set name='kkkkkk'<BR>Delete From OpenRowSet('SQLNCLI','Server=(local);Trusted_Connection=yes;','Select name From TB.dbo.school Where id=1')</P>
<P>--OpenDataSource使用SQLNCLI的一些例子<BR>Select * From OpenDataSource('SQLNCLI','Server=(local);UID=sa;PWD=***;').TB.dbo.school As t<BR>Select * From OpenDataSource('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB').TB.dbo.school As t</P>
<P>--OpenDataSource使用OLEDB的例子<BR>Select * From OpenDataSource('SQLOLEDB','Server=(local);Trusted_Connection=yes;').TB.dbo.school As t</P>
<P>--OpenDataSource其他使用<BR>Insert OpenDataSource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school(name) Values('ghjkl') /*要不要Where都一样，插入一行*/<BR>Update OpenDataSource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school Set name='kkkkkk'<BR>Delete From OpenDataSource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school Where id=1</P>
<P>--OpenQuery使用OLEDB的一些例子<BR>Exec sp_addlinkedserver 'MyLinkServer','','SQLOLEDB','(local)'<BR>Exec sp_addlinkedsrvlogin 'MyLinkServer','false',null,'sa','***'<BR>Select * From OpenQuery(MyLinkServer, 'Select *&nbsp; From TB.dbo.school')</P>
<P>--OpenQuery使用SQLNCLI的一些例子<BR>Exec sp_addlinkedserver 'MyLinkServerA','','SQLNCLI','(local)'<BR>Exec sp_addlinkedsrvlogin 'MyLinkServerA','false',null,'sa','***'<BR>Select * From OpenQuery(MyLinkServerA,'Select *&nbsp; From TB.dbo.school')</P>
<P>--OpenQuery其他使用<BR>Insert OpenQuery(MyLinkServerA,'Select name From TB.dbo.school Where id=1') Values('ghjkl')&nbsp; /*要不要Where都一样，插入一行*/<BR>Update OpenQuery(MyLinkServerA,'Select name From TB.dbo.school Where id=1') Set name='kkkkkk'<BR>Delete OpenQuery(MyLinkServerA,'Select name From TB.dbo.school Where id=1')<BR></P>]]></description>
</item><item>
<title><![CDATA[VFP检测SQL Server的五个实例代码]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=52955</link>
<author>doubworm</author>
<pubDate>2011/12/19 15:31:49</pubDate>
<description><![CDATA[<P>** 需要指出的是，无论下面哪种方式的代码，都需要打开本机的网络共享，否则找不到SQL服务器<BR>** 例一 ***************************************************<BR>* Use MyFll.Fll<BR>Set Library To MyFll<BR>lcLocalName = Left(Sys(0),At("#",Sys(0))-2)<BR>lcLocalIP = DomainToIP(lcLocalName)<BR>? '本机名：'+ lcLocalName<BR>? '本机的 IP 为：'+ lcLocalIP<BR>IF lcLocalIP == '127.0.0.1'<BR>&nbsp;&nbsp; ? '本机现在处于单机状态，未联接网络，或网络适配器停用！'<BR>ENDIF </P>
<P>cStr=GetSqlServer()<BR>nCount=ALines(aServer,cStr,",")&nbsp;&nbsp; &amp;&amp;切分生成数组<BR>?<BR>? "可连接的 SQL Server 服务器"+Transform(nCount)+"个,分别为："<BR>For ii=1 to nCount<BR>&nbsp;&nbsp;&nbsp; ? ii,aServer[ii] &amp;&amp;将名字显示出来<BR>EndFor <BR>Set Library To</P>
<P>** 例二 ****************************************************<BR>* Use SqlDMO.DLL, must install SQLServer or SqlDMO<BR>loSqlDMO=Createobject("SQLDMO.Application")<BR>loSvrs=loSqlDMO.ListAvailableSQLServers()<BR>lnSvrsCount=loSvrs.Count<BR>?<BR>If lnSvrsCount=0<BR>&nbsp;&nbsp;&nbsp; ? "没有找到可用的 SQL Server 服务器。"<BR>Else<BR>&nbsp;&nbsp;&nbsp; ? "可连接的 SQL Server 服务器"+Transform(lnSvrsCount)+"个,分别为："<BR>&nbsp;&nbsp;&nbsp; For ii=1 TO lnSvrsCount<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? ii,loSvrs.Item(ii)<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>Endif<BR>Release loSqlDMO</P>
<P>** 例三 *****************************************************<BR>* Use Windows API, Only VFP9<BR>#Define MAX_PREFERRED_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1<BR>#Define SV_TYPE_SQLSERVER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00000004</P>
<P>Declare Long NetServerEnum In netapi32 string ServerName, Long nlevel, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long @ bufptr, Long prefmaxlen, long @ entriesread, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long @ totalentries, Long servertype, string domain, Long resume_handle<BR>Declare Long NetApiBufferFree In netapi32 Long bufptr<BR>Declare Long lstrlenW In win32api String @ lpString</P>
<P>If Version(5)&lt;900<BR>&nbsp;&nbsp; =MessageBox( '需要 vfp 9.0 运行环境！', 16, '错误！' )<BR>Else<BR>&nbsp;&nbsp; ?<BR>&nbsp;&nbsp; Store 0 To lnBuff, lnReadNums, lnTotNums<BR>&nbsp;&nbsp; If 0 == NetServerEnum( Null, 100, @ lnBuff, MAX_PREFERRED_LENGTH, @ lnReadNums, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ lnTotNums, SV_TYPE_SQLSERVER, Null, 0) and lnReadNums &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? "可连接的 SQL Server 服务器"+TRANSFORM(lnReadNums)+"个,分别为："<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For ii = 1 To lnReadNums<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lnAddr = CToBin(Sys(2600, m.lnBuff + (m.ii-1)*8 + 4, 4), 'RS')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcSrv = Sys(2600, m.lnAddr, 256)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? ii,Left(Strconv(m.lcSrv, 6), lstrlenW(m.lcSrv))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? '没有找到可用的 SQL Server 实例。'<BR>&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp; If lnBuff &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetApiBufferFree(lnBuff)<BR>&nbsp;&nbsp; Endif<BR>Endif<BR>CLEAR DLLS </P>
<P>** 例四 ***********************************************<BR>** 为了与其他例子类似处理，将本例中的Cursor或Table除去了，同时代码也作了相应修改。特注明！<BR>*-----------------------------------------------<BR>* 函数: 获取局域网内所有SqlServer<BR>* 设计: 红雨<BR>* 时间: 2005.04.01<BR>*-----------------------------------------------<BR>?<BR>? NetEnumSqlServer()</P>
<P>Function NetEnumSqlServer()<BR>&nbsp;&nbsp;&nbsp; Declare SHORT SQLBrowseConnect In odbc32 Integer ConnectionHandle, String InConnectionString, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer StringLength1, String @ OutConnectionString, Integer BufferLength, Integer @ StringLength2Ptr<BR>&nbsp;&nbsp;&nbsp; Declare SHORT SQLAllocHandle In odbc32 Integer HandleType, Integer InputHandle, Integer @ OutputHandlePtr<BR>&nbsp;&nbsp;&nbsp; Declare SHORT SQLFreeHandle In odbc32 Integer HandleType, Integer Handle<BR>&nbsp;&nbsp;&nbsp; Declare SHORT SQLSetEnvAttr In odbc32 Integer EnvironmentHandle, Integer Attribute, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer ValuePtr, Integer StringLength</P>
<P>&nbsp;&nbsp;&nbsp; Local hEnv, hConn, cInString, cOutString, nLenOutString, nCnt, iCnt<BR>&nbsp;&nbsp;&nbsp; m.nCnt = 0<BR>&nbsp;&nbsp;&nbsp; m.hEnv = 0<BR>&nbsp;&nbsp;&nbsp; m.hConn = 0<BR>&nbsp;&nbsp;&nbsp; m.cInString = "DRIVER=SQL SERVER"<BR>&nbsp;&nbsp;&nbsp; m.cOutString = Space(2048)<BR>&nbsp;&nbsp;&nbsp; m.nLenOutString = 0<BR>&nbsp;&nbsp;&nbsp; Local Array aServerList[1]</P>
<P>&nbsp;&nbsp;&nbsp; If SQLAllocHandle(1, 0, @hEnv) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If SQLSetEnvAttr(m.hEnv, 200, 3, 0) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If SQLAllocHandle(2, m.hEnv, @hConn) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If SQLBrowseConnect(m.hConn, @cInString, Len(m.cInString), @cOutString, 2048, @nLenOutString) = 99<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.nCnt = Alines(aServerList, Strextract(m.cOutString, '{', '}'), .T., ',')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = '可连接的 SQL Server 服务器'+TRANSFORM(m.nCnt)+'个,分别为：'&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For m.iCnt = 1 To m.nCnt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = lcMsg + Chr(13) + Chr(10) + Chr(9) + Transform(m.iCnt) + aServerList[iCnt]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = '没有找到可用的 SQL Server 实例。'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Clear Dlls<BR>&nbsp;&nbsp;&nbsp; Return lcMsg<BR>Endfunc<BR>*************************************************</P>
<P>** 例五 ************************** 此例与红雨先生的上例近似，也取自网络并作部分修改<BR>?<BR>? GetNetSqlServerApi()</P>
<P>Function GetNetSqlServerApi()<BR>* Use ODBC API<BR>#Define SQL_HANDLE_ENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; <BR>#Define SQL_HANDLE_DBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; <BR>#Define SQL_NULL_HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; <BR>#Define SQL_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; <BR>#Define SQL_SUCCESS_WITH_INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; <BR>#Define SQL_NEED_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99&nbsp; <BR>#Define SQL_ERROR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp; <BR>#Define SQL_INVALID_HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2&nbsp; <BR>#Define SQL_ATTR_ODBC_VERSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200&nbsp; <BR>#Define SQL_OV_ODBC3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; <BR>#Define SQL_NTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -3&nbsp; <BR>#Define ENUM_SERVERS_MAX_RET_LENGTH -1&nbsp;&nbsp; <BR>&nbsp; <BR>lcDrvName = 'Driver={SQL Server}'&nbsp; </P>
<P>Declare short SQLAllocHandle In odbc32 short HandleType, Long InputHandle, Long @ OutputHandlePtr<BR>Declare short SQLSetEnvAttr In odbc32 long EnvironmentHandle, Long nAttribute, Long ValuePtr, Long StringLength<BR>Declare short SQLBrowseConnect In odbc32 long ConnectionHandle, String InConnectionString, short StringLength1, ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String @ OutConnectionString, short BufferLength, short @ StringLength2Ptr<BR>Declare short SQLDisconnect In odbc32 As _SQLDisconnect long ConnectionHandle<BR>Declare short SQLFreeHandle In odbc32 long HandleType, Long Handle</P>
<P>* Allocate the environment handle&nbsp;&nbsp; <BR>hSQLEnv = 0<BR>lnResult = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, @ hSQLEnv)<BR>If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)<BR>&nbsp;&nbsp;&nbsp; * Set the environment attribute to SQL_OV_ODBC3<BR>&nbsp;&nbsp;&nbsp; lnResult = SQLSetEnvAttr(hSQLEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)<BR>&nbsp;&nbsp;&nbsp; If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Allocate a connection handle<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hSQLHdbc = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnResult = SQLAllocHandle(SQL_HANDLE_DBC, hSQLEnv, @ hSQLHdbc)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (lnResult == SQL_SUCCESS Or lnResult == SQL_SUCCESS_WITH_INFO)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szConnStrOut = SPACE(2048)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnLen = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Call SQLBrowseConnect for additional information&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnResult = SQLBrowseConnect(hSQLHdbc, lcDrvName, Len(m.lcDrvName), @ szConnStrOut, 2048, @ lnLen)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (lnResult == SQL_SUCCESS Or lnResult == SQL_NEED_DATA)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ListSqlServersList(Left(szConnStrOut, lnLen))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _SQLDisconnect(hSQLHdbc)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLFreeHandle(SQL_HANDLE_DBC, hSQLHdbc)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Endif&nbsp;&nbsp; <BR>Endif&nbsp;&nbsp; <BR>SQLFreeHandle(SQL_HANDLE_ENV, hSQLEnv)<BR>Clear Dlls<BR>Endfunc </P>
<P>Function ListSqlServersList(tcConnectString)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Local ii, lcSvrs, lcSvr, lcMsg, laSvrs[1]&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; m.nCnt = Alines(laSvrs, Strextract(tcConnectString, '{', '}'), .T., ',')<BR>&nbsp;&nbsp;&nbsp; If m.nCnt &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = '找到 '+TRANSFORM(m.nCnt)+'个 SQL Server 实例：'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For m.ii = 1 To m.nCnt<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = lcMsg + Chr(13) + Chr(10) + Chr(9) + Transform(m.ii) + laSvrs[m.ii]&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMsg = '没有找到可用的 SQL Server 实例。'<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return lcMsg<BR>Endfunc</P>]]></description>
</item><item>
<title><![CDATA[VFP中OCX控件注册检测及自动注册]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=52808</link>
<author>doubworm</author>
<pubDate>2011/12/7 22:22:15</pubDate>
<description><![CDATA[这是原来从网上搜集、整理后编制用于自己的小程序使用的OCX是否注册及未注册控件的自动注册函数。
<P>CheckCtrlFileRegist("ctToolBar.ctToolBarCtrl.4")&nbsp; &amp;&amp; 检测与注册DBI工具条控件(ctToolBar)</P>
<P>****************************** 控件注册函数<BR>Function CheckCtrlFileRegist<BR>Parameters lcCheck</P>
<P>&amp;&amp; 调用形如：CheckCtrlFileRegist("ctGrid.ctGridCtrl.3")<BR>&amp;&amp; 其中，经常用到的控件如下：<BR>&amp;&amp; MS日期控件 MSComCt2.OCX 版本2-("MSComCtl2.DTPicker.2")(MS Date and Time Picker Control 6.0 (SP4))<BR>&amp;&amp; 视频头控件 AVCap.OCX 版本1-("AVCap.AVCapture.1")<BR>&amp;&amp; DBI表格控件 ctGrid.OCX 版本3-("ctGrid.ctGridCtrl.3")，版本1-("ctGrid.ctGridCtrl.1") <BR>&amp;&amp; DBI下拉框控件 ctCombo.OCX 版本2-("ctCoLorCombo.ctColorComboCtrl.2") <BR>&amp;&amp; DBI工具条控件 ctToolBar.OCX 版本4-("ctToolBar.ctToolBarCtrl.4") <BR>&amp;&amp; DBI树形控件 ctTree.OCX 版本7-("ctTree.ctTreeView.7") </P>
<P>Local oErr As Exception, oErrExit As Exception <BR>Local lcCtrlFile As Character, lcCtrl As Character, lcRun As Character <BR>Local oCtrl As Object, oShell As Object <BR>Local lcMess As Character </P>
<P>lcMess='' <BR>lcCtrl=SubStr(lcCheck,1,At('.',lcCheck,1)-1) </P>
<P>Try <BR>&nbsp; oCtrl=CreateObject(lcCheck)<BR>Catch To oErr<BR>&nbsp; oErr.UserValue="发现OCX控件["+lcCtrl+"]未注册！"<BR>&nbsp; =MessageBox(oErr.UserValue,0+64,'提示！')<BR>&nbsp; Do While .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp; lcCtrlFile=GetFile('OCX','输入文件名：','确定',0,'选择需要操作的文件')<BR>&nbsp;&nbsp;&nbsp;&nbsp; If Not File(lcCtrlFile,1) OR Empty(lcCtrlFile) Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMess='程序所必要的控件文件'+Iif(Empty(lcCtrlFile),'','['+lcCtrlFile+']')+'不存在！继续注册么？'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If 6=MessageBox(lcMess,4+32+256,'系统提示！') Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; oShell=CreateObject('Wscript.shell')<BR>&nbsp;&nbsp;&nbsp;&nbsp; lcRun="Regsvr32 /S "+lcCtrlFile<BR>&nbsp;&nbsp;&nbsp;&nbsp; If oShell.Run('&amp;lcRun',0,.T.) != 0 Then &amp;&amp; 隐藏窗口运行并返回错误代码(不为0,运行出错,注册失败)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMess='选定的控件文件'+lcCtrlFile+'不包含控件'+lcCtrl+', 注册失败！继续注册么？'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If 6=Messagebox(lcMess, 4+32+256, '信息提示') Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp; Try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oCtrl=CreateObject(lcCheck)<BR>&nbsp;&nbsp;&nbsp;&nbsp; Catch To oErrExit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oErrExit.UserValue = "OCX控件["+lcCtrl+"]未注册成功 或 与要求版本不符合！"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =MessageBox(oErrExit.UserValue,0+64,'提示！')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quit<BR>&nbsp;&nbsp;&nbsp;&nbsp; Finally<BR>&nbsp;&nbsp;&nbsp;&nbsp; EndTry<BR>&nbsp;&nbsp;&nbsp;&nbsp; lcMess='控件['+lcCtrl+']注册成功！'<BR>&nbsp;&nbsp;&nbsp;&nbsp; =MessageBox(lcMess, 0+64, '系统提示！',5000)<BR>&nbsp;&nbsp;&nbsp;&nbsp; Exit<BR>&nbsp; EndDo<BR>Finally<BR>&nbsp; Release oErr, oErrExit, lcCtrlFile, lcCtrl, lcRun, oCtrl, oShell, lcMess<BR>EndTry<BR>EndFunc</P>
<P></P>
<P>*************************</P>
<P>下面是网上摘抄的红雨先生的一个关于控件注册的函数，一并列示如下（本人未对该函数作过测试，对该函数的控件版本检测功能亦未判断，有兴趣者测试后可在此回复给我，谢谢）：</P>
<P>程序: 动态注册(dll、ocx)控件* 设计: 红雨*-------------------------------------------------<BR>Clear<BR>cLibFileName = getfile([注册控件(*.ocx,*.dll):ocx,dll],[控件文件])<BR>If&nbsp; !Empt(lcLibFileName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>? DllRegister(lcLibFileName,.T.)&nbsp; &amp;&amp; 注册<BR>*? DllRegister(lcLibFileName,.F.)&nbsp; &amp;&amp; 注销<BR>Endif<BR>Clea Dlls<BR>Return</P>
<P>Function DllRegister (lpLibFileName,isReg)<BR>isReg = iif(type("isReg")="U", .T., isReg)<BR>lpProcName = iif(isReg, "DllRegisterServer", "DllUnregisterServer" )<BR>Declare Integer GetLastError in kernel32<BR>Declare Integer LoadLibrary in kernel32 String lpLibFileName<BR>Declare Integer FreeLibrary in kernel32 Integer hLibModule<BR>Declare Integer GetProcAddress in kernel32 Integer hModule, String lpProcName<BR>Declare Integer CallWindowProc in user32 Integer lpPrevWndFunc, Integer hwnd, Integer Msg, Integer wParam, Integer lParam<BR>hLibModule = LoadLibrary (lpLibFileName)<BR>If hLibModule # 0<BR>&nbsp;&nbsp; lnAddress = GetProcAddress (hLibModule, lpProcName)<BR>&nbsp;&nbsp; If lnAddress # 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If CallWindowProc( lnAddress, 0,0,0,0) = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = FreeLibrary (hLibModule)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return "成功: " + lpProcName + " 地址: " + allt(str(lnAddress,12))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnerror = GetLastError()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnerror = GetLastError()<BR>&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp; = FreeLibrary (hLibModule)<BR>Else<BR>&nbsp;&nbsp; lnerror = GetLastError()<BR>Endif<BR>Return "错误: (" + allt(str(lnerror)) + []) + GetErrorStr(lnerror)<BR>End func<BR>**************************</P>
<P>Function GetErrorStr (lpnError)<BR>Declare INTEGER FormatMessage IN kernel32 INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId,;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTEGER dwLanguageId, INTEGER @lpBuffer, INTEGER nSize, INTEGER&nbsp; Arguments<BR>Declare RtlMoveMemory IN kernel32 As CopyMemory STRING @Destination, INTEGER Source, INTEGER nLength<BR>dwFlags = 256 + 4096 + 512<BR>lpBuffer = 0<BR>lnLength = FormatMessage(dwFlags, 0, lpnError, 0, @lpBuffer, 0, 0)<BR>If lnLength &lt;&gt; 0<BR>&nbsp;&nbsp; lpResult = REPLI (Chr(0), 500)<BR>&nbsp;&nbsp; = CopyMemory (@lpResult, lpBuffer, lnLength)<BR>&nbsp;&nbsp; Return STRTRAN(LEFT(lpResult, lnLength), Chr(13)+Chr(10), "")<BR>Else&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; Return "#&lt;未知错误&gt;#"<BR>Endif<BR>Endfunc</P>]]></description>
</item><item>
<title><![CDATA[VFP 图形文件、剪切板互换 API解决方法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=51806</link>
<author>doubworm</author>
<pubDate>2011/8/5 20:12:17</pubDate>
<description><![CDATA[<P>VFP 图形文件、剪切板互换 API解决方法<BR>(这是原来从网上摘下来的，版权归原作者）</P>
<P>DECLARE INTEGER OpenClipboard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN User32 INTEGER<BR>DECLARE INTEGER CloseClipboard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN User32<BR>DECLARE INTEGER EmptyClipboard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN User32<BR>DECLARE INTEGER SetClipboardData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN User32 INTEGER,INTEGER<BR>DECLARE INTEGER LoadImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN WIN32API INTEGER,String,INTEGER,INTEGER,INTEGER,INTEGER<BR>DECLARE INTEGER GetClipboardData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN User32 INTEGER<BR>DECLARE INTEGER GdipCreateBitmapFromHBITMAP IN GdiPlus.dll INTEGER, INTEGER, INTEGER @<BR>DECLARE INTEGER GdipSaveImageToFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN GdiPlus.dll INTEGER,String,String @,String @<BR>DECLARE Long&nbsp;&nbsp;&nbsp; GdipCreateHBITMAPFromBitmap IN GDIPLUS.DLL Long nativeImage, Long @, Long <BR>DECLARE Long&nbsp;&nbsp;&nbsp; GdipCreateBitmapFromFile&nbsp;&nbsp;&nbsp; IN GDIPLUS.DLL String FileName, Long @nBitmap<BR>DECLARE Long&nbsp;&nbsp;&nbsp; CopyImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN WIN32API Long hImage, Long, Long, Long , Long</P>
<P>#Define CF_BITMAP 2<BR>#Define CF_DIB 8<BR>#Define IMAGE_BITMAP 0<BR>#Define LR_LOADFROMFILE 16</P>
<P>*1.将图形文件保存到剪切板<BR>nBitmap=0<BR>hbm=0<BR>imagefile='图形文件名'<BR>GdipCreateBitmapFromFile(STRCONV(imagefile+0h00,5),@nBitmap)<BR>GdipCreateHBITMAPFromBitmap(nBitmap,@hbm,0)<BR>lhBmp = CopyImage(hbm, 0, 0, 0, 0)<BR>IF OpenClipboard(0)!= 0<BR>&nbsp;&nbsp; EmptyClipboard()<BR>&nbsp;&nbsp; SetClipboardData(CF_BITMAP, lhBmp)<BR>&nbsp;&nbsp; CloseClipboard()<BR>ENDIF</P>
<P>*2.将剪切板图形保存到本地<BR>OpenClipboard(0)<BR>hBitmap = GetClipboardData(CF_BITMAP)<BR>hDib = GetClipboardData(CF_DIB)<BR>CloseClipboard()<BR>uBitmap=0<BR>GdipCreateBitmapFromHBITMAP(hBitmap,2,@uBitmap)<BR>lcOutputFile=STRCONV('C:\_Temp1.jpg'+CHR(0),5)<BR>*!* lqEncoderClsID_BMP=0h00F47C55041AD3119A730000F81EF32E &amp;&amp;BMP格式<BR>lqEncoderClsID_JPG=0h01F47C55041AD3119A730000F81EF32E &amp;&amp;JPG格式<BR>*!* lqEncoderClsID_GIF=0h02F47C55041AD3119A730000F81EF32E &amp;&amp;GIF格式<BR>*!* lqEncoderClsID_TIF=0h05F47C55041AD3119A730000F81EF32E &amp;&amp;TIF格式<BR>*!* lqEncoderClsID_PNG=0h06F47C55041AD3119A730000F81EF32E &amp;&amp;PNG格式<BR>GdipSaveImageToFile(uBitmap,lcOutputFile,lqEncoderClsID_JPG,NULL)<BR></P>]]></description>
</item><item>
<title><![CDATA[身份证相关（转）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=46958</link>
<author>doubworm</author>
<pubDate>2009/8/29 0:05:20</pubDate>
<description><![CDATA[<P>*!* 以下为我收集的关于身份证号码的自定义函数(十豆三)</P>
<P>*!* 关于身份证号码最后一位的校验码的算法如下：<BR>*!* 我国现行使用公民身份证号码有两种尊循两个国家标准，〖GB 11643-1989〗和〖GB 11643-1999〗。<BR>*!* 〖GB 11643-1989〗中规定的是15位身份证号码：排列顺序从左至右依次为：六位数字地址码，<BR>*!* 六位数字出生日期码，三位数字顺序码，其中出生日期码不包含世纪数。<BR>*!* 〖GB 11643-1999〗中规定的是18位身份证号码：公民身份号码是特征组合码，由十七位数字本体码和一位数字校验码组成。<BR>*!* 排列顺序从左至右依次为：六位数字地址码，八位数字出生日期码，三位数字顺序码和一位数字校验码。<BR>*!* 地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。<BR>*!* 生日期码表示编码对象出生的年、月、日，其中年份用四位数字表示，年、月、日之间不用分隔符。<BR>*!* 顺序码表示同一地址码所标识的区域范围内，对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性，偶数分给女性。<BR>*!* 校验码是根据前面十七位数字码，按照ISO 7064:1983.Mod 11-2校验码计算出来的检验码。<BR>*!* 公式如下：<BR>*!* 　　∑(a[i]*W[i]) Mod 11 ( i = 2, 3, ..., 18 ) (1)<BR>*!* 　　"*" 表示乘号<BR>*!* 　　i--------表示身份证号码每一位的序号，从右至左，最左侧为18，最右侧为1。<BR>*!* 　　a[i]-----表示身份证号码第 i 位上的号码<BR>*!* 　　W[i]-----表示第 i 位上的权值 W[i] = 2^(i-1) Mod 11<BR>*!* 　　计算公式 (1) 令结果为 R<BR>*!* 根据下表找出 R 对应的校验码即为要求身份证号码的校验码C。<BR>*!* 　　R 0 1 2 3 4 5 6 7 8 9 10<BR>*!* 　　C 1 0 X 9 8 7 6 5 4 3 2<BR>*!* 由此看出 X 就是 10，罗马数字中的 10 就是X，所以在新标准的身份证号码中可能含有非数字的字母X。<BR>*!* *********************************************************************************<BR>*!* 感谢yesyesyes提供的信息：<BR>*!* 15位身份证那时是我国第一次发身份证<BR>*!* 发证当时已满100岁的人,就给他们那些号(因为年份只有2位)<BR>*!* 十五位身份证第十三至十五位为分配顺序代码<BR>*!* 分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。<BR>*!* *********************************************************************************<BR>*!* 感谢清风提供的信息：<BR>*!* 这里所说的“百岁”应该是指19世纪也就是18XX年出生的人，而不是指办身份证时此人已有100岁。这种特例不多，所以男女各设了两个序号<BR>*!* 还得提醒一下，1901年与2001年不会发生冲突，因为2000后就直接使用18位号码了，如果是15位的，那肯定是2000年以前的。<BR>*!* *****************************************************************************</P>
<P><BR>*---------------------------------------------------------------<BR>*此函数功能：输入的15位或18位身份证号，返回正确的18位的身份证号。<BR>*---------------------------------------------------------------<BR>Function IDCardTF<BR>&nbsp;&nbsp;&nbsp; Parameters cNumber<BR>&nbsp;&nbsp;&nbsp; #Define InvalidSize "身份证号码长度不正确！"<BR>&nbsp;&nbsp;&nbsp; #Define InvalidChar "身份证号码包括非法字符！"<BR>&nbsp;&nbsp;&nbsp; #Define InvalidDate "出生日期无效！"<BR>&nbsp;&nbsp;&nbsp; #Define InvalidReturnValue ".F."<BR>&nbsp;&nbsp;&nbsp; Private cString<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(cNumber) = 15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cString = Stuff(cNumber,7,0,"19")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(cNumber) = 18<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cString =Left(Alltrim(cNumber),17)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox(InvalidSize,48,"信息提示")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return InvalidReturnValue<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; Private i,N,iRet<BR>&nbsp;&nbsp;&nbsp; Store 0 To iRet<BR>&nbsp;&nbsp;&nbsp; For i = 1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N = Substr(cString,i,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not Isdigit(N)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox(invalidChar,48,"信息提示")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return invalidReturnValue<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N = 2 ^ (18 - i) % 11 * Val(N)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iRet = iRet + N<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; iRet = iRet % 11 + 1<BR>&nbsp;&nbsp;&nbsp; Private oldDateSet, oldCentury<BR>&nbsp;&nbsp;&nbsp; Private oldStrictDate, BirthDay<BR>&nbsp;&nbsp;&nbsp; oldDateSet = Set("DATE")<BR>&nbsp;&nbsp;&nbsp; oldCentury = Set("CENTURY")<BR>&nbsp;&nbsp;&nbsp; oldStrictDate = Set("STRICTDATE")<BR>&nbsp;&nbsp;&nbsp; Set Date Ansi<BR>&nbsp;&nbsp;&nbsp; Set Century On<BR>&nbsp;&nbsp;&nbsp; Set StrictDate To 0<BR>&nbsp;&nbsp;&nbsp; BirthDay = Ctod(Substr(cString,7,4)+"-"+Substr(cString,11,2)+"-"+Substr(cString,13,2))<BR>&nbsp;&nbsp;&nbsp; Set StrictDate To &amp;oldStrictDate<BR>&nbsp;&nbsp;&nbsp; Set Century &amp;oldCentury<BR>&nbsp;&nbsp;&nbsp; Set Date &amp;oldDateSet<BR>&nbsp;&nbsp;&nbsp; If Empty(BirthDay)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox(InvalidDate,48,"信息提示")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return InvalidReturnValue<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return cString+Substr("10x98765432",iRet,1)<BR>Endfunc</P>
<P><BR>*----------------------------------------------------<BR>*此函数功能：检验输入的15位或18位身份证号码是否为合法<BR>*----------------------------------------------------<BR>Function MyIdentityCardVerify &amp;&amp;校验身份证号是否合法<BR>&nbsp;&nbsp;&nbsp; Lparameters lstr &amp;&amp;参数:lstr 传入的号码<BR>&nbsp;&nbsp;&nbsp; Private lstr,relyn,tsfz,m1,m2,m3,m4,m,I,r,c,ai,wi<BR>&nbsp;&nbsp;&nbsp; relyn=.F. &amp;&amp;返回值<BR>&nbsp;&nbsp;&nbsp; tsfz=Alltrim(lstr)<BR>&nbsp;&nbsp;&nbsp; *分别用m1,m2,m3,m4表示四个条件是否成立<BR>&nbsp;&nbsp;&nbsp; Stor .T. To m1,m2,m3,m4<BR>&nbsp;&nbsp;&nbsp; *条件1：只能是15或18位<BR>&nbsp;&nbsp;&nbsp; m1=Iif(Len(tsfz)=15 Or Len(tsfz)=18,.T.,.F.)<BR>&nbsp;&nbsp;&nbsp; If Len(tsfz)=15 &amp;&amp; 15位的号码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For I=1 To 15 &amp;&amp;检查每一位是否为数字<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=Asc(Substr(tsfz,I,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If m&lt;48 Or m&gt;57 &amp;&amp;数字<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m2=.F. &amp;&amp;若有一位不是就不再查<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m="19" +Substr(tsfz, 7,2) &amp;&amp;早期的号都是上个世纪的<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=m+"."+Substr(tsfz, 9,2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=m+"."+Substr(tsfz,11,2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=Ctod(m)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Isnull(m) Or Isblank(m)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m3=.F. &amp;&amp;生日不正确<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If Len(tsfz)=18 &amp;&amp; 18位的号码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For I=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=Asc(Substr(tsfz,I,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If m&lt;48 Or m&gt;57<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m2=.F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=Substr(tsfz,7,4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=m+"."+Substr(tsfz,11,2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=m+"."+Substr(tsfz,13,2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=Ctod(m)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Isnull(m) Or Isblank(m)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m3=.F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=0 &amp;&amp;计算校验位<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For I=18 To 2 Step -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ai=Val(Substr(tsfz,19-i,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wi=Mod(2^(i-1),11)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=r+ai*wi<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=Mod(r,11)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case r=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c="1"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case r=1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c="0"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case r=2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c="X"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=Alltrim(Str(12-r))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Upper(Substr(tsfz,18,1))&lt;&gt;c<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m4=.F. &amp;&amp;校验位与原码最末位不同<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *四个条件全成立，则返回.t.<BR>&nbsp;&nbsp;&nbsp; relyn=Iif(m1 And m2 And m3 And m4,.T.,.F.)<BR>&nbsp;&nbsp;&nbsp; Return relyn<BR>Endfunc</P>
<P><BR>*--------------------------------------------------------------------------------------------<BR>*此函数功能：输入15位或18位的身份证号，返回被校验后的18位的身份证号，若身份证号非法，则返回空<BR>*--------------------------------------------------------------------------------------------<BR>Function sfjy<BR>&nbsp;&nbsp;&nbsp; Parameters msfz<BR>&nbsp;&nbsp;&nbsp; On Error Return ''<BR>&nbsp;&nbsp;&nbsp; Dimension T(17)<BR>&nbsp;&nbsp;&nbsp; Private msfz,T,sn,i<BR>&nbsp;&nbsp;&nbsp; msfz=Alltrim(msfz)<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(msfz)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msfz=Left(msfz,6)+'19'+Substr(msfz,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(msfz)=18<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msfz=Left(msfz,17)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Isdigit(Substr(msfz,i,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; If !Left(msfz,2)$'11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If Empty(Date(Val(Substr(msfz,7,4)),Val(Substr(msfz,11,2)),Val(Substr(msfz,13,2))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; sn=0<BR>&nbsp;&nbsp;&nbsp; T(1)=7<BR>&nbsp;&nbsp;&nbsp; T(2)=9<BR>&nbsp;&nbsp;&nbsp; T(3)=10<BR>&nbsp;&nbsp;&nbsp; T(4)=5<BR>&nbsp;&nbsp;&nbsp; T(5)=8<BR>&nbsp;&nbsp;&nbsp; T(6)=4<BR>&nbsp;&nbsp;&nbsp; T(7)=2<BR>&nbsp;&nbsp;&nbsp; T(8)=1<BR>&nbsp;&nbsp;&nbsp; T(9)=6<BR>&nbsp;&nbsp;&nbsp; T(10)=3<BR>&nbsp;&nbsp;&nbsp; T(11)=7<BR>&nbsp;&nbsp;&nbsp; T(12)=9<BR>&nbsp;&nbsp;&nbsp; T(13)=10<BR>&nbsp;&nbsp;&nbsp; T(14)=5<BR>&nbsp;&nbsp;&nbsp; T(15)=8<BR>&nbsp;&nbsp;&nbsp; T(16)=4<BR>&nbsp;&nbsp;&nbsp; T(17)=2<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sn=sn+Val(Substr(msfz,i,1))*T(i)<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; sn=Mod(sn,11)<BR>&nbsp;&nbsp;&nbsp; On Error<BR>&nbsp;&nbsp;&nbsp; Return msfz+Substr('10X98765432',sn+1,1)<BR>Endfunc</P>
<P><BR>*------------------------------------------------------------------<BR>*此函数功能：输入的15位或17位或18位的身份证号，返回校验后的最后一位<BR>*------------------------------------------------------------------<BR>Function sfzjy<BR>&nbsp;&nbsp;&nbsp; Parameters cID<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(Alltrim(cID)) = 15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cID = Stuff(Alltrim(cID),7,0,"19")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(Alltrim(cID)) = 18 Or Len(Alltrim(cID)) = 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cID =Left(Alltrim(cID),17)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; If Len(Alltrim(cID))#17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; nSum= Val(Substr(cID,1,1)) * 7 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,2,1)) * 9 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,3,1)) * 10 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,4,1)) * 5 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,5,1)) * 8 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,6,1)) * 4 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,7,1)) * 2 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,8,1)) * 1 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,9,1)) * 6 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,10,1)) * 3 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,11,1)) * 7 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,12,1)) * 9 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,13,1)) * 10 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,14,1)) * 5 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,15,1)) * 8 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,16,1)) * 4 ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Val(Substr(cID,17,1)) * 2<BR>&nbsp;&nbsp;&nbsp; *计算校验位<BR>&nbsp;&nbsp;&nbsp; check_number=Int((12-nSum % 11)%11)<BR>&nbsp;&nbsp;&nbsp; If check_number=10<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; check_number='X'<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return check_number<BR>Endfunc</P>
<P><BR>******************************************<BR>*身份证号出错信息(对字段：sfzherrc的编码解释)<BR>*1、"身份证号不满15位！"2、性别与身份证不符3、出生月份出错（不在1－12范围内）4、出生日期出错（不在1－31范围内）<BR>*5、18位校验位出错（sfzherrc中紧跟括号内的内容为正确的第18位校验码）6、18位身份证出生年份出错（不是19）<BR>*检查原则：不满15位只检查位数，15位检查出生年、月、日的超界关系、性别对应关系（男：身份证第15位为13579，女：身份证第15位为02468）<BR>*检查原则：18位身份证除检查15位的检查原则外增加检查最后一位检验码的关系校验<BR>*以下附身份证号的算法函数，可供大家参考！！<BR>***********************************************************************<BR>*身份号码第18位校验位的算法〖中华人民共和国国家标准 GB 11643-1999〗(依此算法写的函数存放在过*程文件myproc.prg中&lt;附后&gt;)<BR>* 15位的身份证编码首先把出生年扩展为4位，简单的就是增加一个19，但对于1900前年出生的人不适用<BR>* ∑(ai×Wi)(mod 11)……………………………………(1)<BR>* 公式(1)中：<BR>* i----表示号码字符从由至左包括校验码在内的位置序号；<BR>* ai----表示第i位置上的号码字符值；<BR>* Wi----示第i位置上的加权因子，其数值依据公式Wi=2^(n-1)(mod 11)计算得出（(n-1)为幂）。<BR>* i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1<BR>* ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1<BR>* Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1<BR>* ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1<BR>* 根据公式(1)进行计算：<BR>* ∑(ai×Wi) =（21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189<BR>* 189 ÷ 11 = 17 + 2/11<BR>* ∑(ai×Wi)(mod 11) = 2<BR>* 然后根据计算的结果，从下面的表中查出相应的校验码，其中X表示计算结果为10：<BR>* ∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10<BR>* 校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2</P>
<P><BR>*-----------------------------<BR>*身份证升位程序<BR>*作者：窦学田<BR>*功能：计算身份证的校验码<BR>*入口参数：15位号码 或17位号码<BR>*返回：18位身份证号码<BR>*-----------------------------<BR>Function NewIdCode()<BR>&nbsp;&nbsp;&nbsp; Parameters OldId<BR>&nbsp;&nbsp;&nbsp; Local id1,id2,i2,NewIdCode<BR>&nbsp;&nbsp;&nbsp; id1=Strtran(OldId,' ','')<BR>&nbsp;&nbsp;&nbsp; id2=0<BR>&nbsp;&nbsp;&nbsp; If Len(id1)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1=Left(OldId,6)+'19'+Right(OldId,9)<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If Len(id1)=17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i2=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id2=id2+Val(Substr(id1,18-i2,1))*(Mod(2^i2,11))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1=id1+Iif(Mod(1-id2,11)=10,'X',Str(Mod(1-id2,11),1))<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; NewIdCode=id1<BR>&nbsp;&nbsp;&nbsp; Return NewIdCode<BR>Endfunc</P>
<P><BR>*-----------------------------<BR>*测试18位的身份证是否正确<BR>*作者：窦学田<BR>*功能：测试18位身份证的校验码<BR>*入口参数：18位号码<BR>*返回：出错信息<BR>*-----------------------------<BR>Function GetOld()<BR>&nbsp;&nbsp;&nbsp; Parameters sID<BR>&nbsp;&nbsp;&nbsp; s1=' 7 910 5 8 4 2 1 6 3 7 910 5 8 4 2'<BR>&nbsp;&nbsp;&nbsp; s2='10X98765432'<BR>&nbsp;&nbsp;&nbsp; sID=Upper(Alltrim(sID))<BR>&nbsp;&nbsp;&nbsp; If Len(sID)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sID=Stuff(sID,7,0,"19")<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; NewId=Left(sID,17)<BR>&nbsp;&nbsp;&nbsp; jym=0<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jym=jym+Val(Substr(s1,i*2-1,2))*Val(Substr(NewId,i,1))<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; NewId= NewId+ Substr(s2,Mod(jym,11)+1,1)<BR>&nbsp;&nbsp;&nbsp; If Len(sID)=18<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Right(sID,1)&lt;&gt;Right(NewId,1) &amp;&amp;正确<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox(sID+"为错误身份证号码！",48,"警告")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>Endfunc</P>
<P><BR>*---------------------------------------------------<BR>*测试身份证的年月日的合法性YMDS(year,month,date,sex)<BR>*作者：窦学田<BR>*功能：测试18位身份证的年月日的合法性<BR>*入口参数：原表中的性别代码,原身份证号码<BR>*返回：综合出错信息<BR>*---------------------------------------------------<BR>Function CheckYMDS()<BR>&nbsp;&nbsp;&nbsp; Parameters F_xbdm,F_ID<BR>&nbsp;&nbsp;&nbsp; Local rtn_errcode<BR>&nbsp;&nbsp;&nbsp; rtn_errcode=''<BR>&nbsp;&nbsp;&nbsp; sfxb=Iif(F_xbdm='1','13579','02468')<BR>&nbsp;&nbsp;&nbsp; If Len(Alltrim(F_ID))=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfsex=Substr(F_ID,15,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !sfsex$sfxb &amp;&amp;测试性别<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"2",Alltrim(rtn_errcode)+'+2')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfy=Substr(F_ID,9,2) &amp;&amp;月<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfr=Substr(F_ID,11,2) &amp;&amp;日<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !(Val(sfy)&lt;=12)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"3",Alltrim(rtn_errcode)+'+3')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !(Val(sfr)&lt;=31)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"4",Alltrim(rtn_errcode)+'+4')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfsex=Substr(F_ID,17,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !sfsex$sfxb &amp;&amp;测试性别<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"2",Alltrim(rtn_errcode)+'+2')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfy=Substr(F_ID,11,2) &amp;&amp;月<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sfr=Substr(F_ID,13,2) &amp;&amp;日<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !(Val(sfy)&lt;=12) &amp;&amp;月<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"3",Alltrim(rtn_errcode)+'+3')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !(Val(sfr)&lt;=31) &amp;&amp;日<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"4",Alltrim(rtn_errcode)+'+4')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *以下测试第18位校验码的正确性<BR>&nbsp;&nbsp;&nbsp; s1=' 7 910 5 8 4 2 1 6 3 7 910 5 8 4 2'<BR>&nbsp;&nbsp;&nbsp; s2='10X98765432'<BR>&nbsp;&nbsp;&nbsp; F_ID=Upper(Alltrim(F_ID))<BR>&nbsp;&nbsp;&nbsp; If Len(F_ID)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F_ID=Stuff(F_ID,7,0,"19")<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; NewId=Left(F_ID,17)<BR>&nbsp;&nbsp;&nbsp; jym=0<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jym=jym+Val(Substr(s1,i*2-1,2))*Val(Substr(NewId,i,1))<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; NewId= NewId+ Substr(s2,Mod(jym,11)+1,1)<BR>&nbsp;&nbsp;&nbsp; If Len(F_ID)=18<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Right(F_ID,1)&lt;&gt;Right(NewId,1) &amp;&amp;不正确<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;返回出错信息及正确的第18位校验码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"5"+'(应为'+Right(NewId,1)+')',Alltrim(rtn_errcode)+'+5'+'(应为'+Right(NewId,1)+')')<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If Substr(F_ID,7,2)&lt;&gt;'19' &amp;&amp;测试年（19）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rtn_errcode=Iif(Empty(rtn_errcode),"6",Alltrim(rtn_errcode)+'+6')<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return rtn_errcode<BR>Endfunc</P>
<P><BR>*------------------------------------------------------<BR>* 从身份证在返回相关资料<BR>* 第一个参数为[字符型]:身份证号码<BR>* 第二个参数为返回资料[数值型]:1.返回为行政区号[字符符]<BR>* 2.返回为出生日期[日期型]<BR>* 3.返回为性别男女[字符型]<BR>* 没有第二参数时返回正确的18位身份证号码<BR>* 梦幻幻影 2005-04-22 17:12:18 *<BR>*------------------------------------------------------<BR>Function IDCardCheck ( c_IDCard,nRetValue )<BR>&nbsp;&nbsp;&nbsp; If Vartype(m.c_IDCard) &lt;&gt; [C] Or Not Inlist(Len(Alltrim(m.c_IDCard)),15,18)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If Len(Alltrim(m.c_IDCard)) = 15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.c_IDCard = Substr(m.c_IDCard,1,6)+[19]+Substr(m.c_IDCard,7) + [X]<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; m.nRetValue = Iif(Vartype(m.nRetValue) = [N],m.nRetValue,0)<BR>&nbsp;&nbsp;&nbsp; Local nEndCode,ReString<BR>&nbsp;&nbsp;&nbsp; m.nEndCode = 0<BR>&nbsp;&nbsp;&nbsp; For i=17 To 1 Step -1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.nEndCode = m.nEndCode +(2^i%11)*Val(Substr(c_idcard,18-i,1))<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case m.nRetValue = 1 &amp;&amp;返回行政区号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Substr(m.c_IDCard,1,6)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case m.nRetValue = 2 &amp;&amp;返回出生日期<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Substr(m.c_IDCard,7,8)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Local nYear,nMonth,nDay<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.nYear = Val(Substr(m.ReString,1,4))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.nMonth = Val(Substr(m.ReString,5,2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.nDay = Val(Substr(m.ReString,7,2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Between(m.nMonth, 1, 12)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Inlist(m.nMonth,4,6,9,11)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Between(m.nDay,1,30)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case m.nMonth = 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Between(m.nDay,1,Iif(Int(m.nYear/4) = m.nYear/4,29,28))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Between(m.nDay,1,31)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return Date(m.nYear,m.nMonth,m.nDay)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case m.nRetValue = 3 &amp;&amp;返回性别<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Substr(Right(m.c_IDCard,2),1,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Iif(Mod(Val(m.ReString),2)=0,[女],[男])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Substr([10X98765432],Mod(m.nEndCode,11)+1,1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.ReString = Substr(m.c_IDCard,1,17) + m.ReString<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; Return m.ReString<BR>Endfunc</P>
<P><BR>*------------------------------------------------------<BR>*感谢：dfwxj(清风)<BR>*------------------------------------------------------<BR>Function sfjy<BR>&nbsp;&nbsp;&nbsp; Parameters msfz<BR>&nbsp;&nbsp;&nbsp; On Error Return ''<BR>&nbsp;&nbsp;&nbsp; Private msfz,sn,i,dic<BR>&nbsp;&nbsp;&nbsp; dic='0709100508040201060307091005080402'<BR>&nbsp;&nbsp;&nbsp; msfz=Alltrim(msfz)<BR>&nbsp;&nbsp;&nbsp; *出生日期预处理，仅接受15或18位字符串<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(msfz)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Right(msfz,3)$'996,997,998,999'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msfz=Left(msfz,6)+'18'+Substr(msfz,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msfz=Left(msfz,6)+'19'+Substr(msfz,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(msfz)=18<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msfz=Left(msfz,17)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; *检查身份证号字符的合法性<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If !Isdigit(Substr(msfz,i,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; *检查行政区划合法性<BR>&nbsp;&nbsp;&nbsp; If !Left(msfz,2)$'11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *检查出生日期合法性<BR>&nbsp;&nbsp;&nbsp; If Empty(Date(Val(Substr(msfz,7,4)),Val(Substr(msfz,11,2)),Val(Substr(msfz,13,2))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ''<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *生成校检码<BR>&nbsp;&nbsp;&nbsp; sn=0<BR>&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sn=sn+Val(Substr(msfz,i,1))*Val(Substr(dic,i*2-1,2))<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; sn=Mod(sn,11)<BR>&nbsp;&nbsp;&nbsp; On Error<BR>&nbsp;&nbsp;&nbsp; Return msfz+Substr('10X98765432',sn+1,1)<BR>Endfunc</P>
<P><BR>*------------------------------------------------------<BR>*作者：Linzhiyang，发表于『动感游标』 <A href="http://www.vfp.cn">http://www.vfp.cn</A><BR>*若转载，请保留本注释部分<BR>*功能：计算身份证的校验码<BR>*入口参数：15位号码 或17位号码<BR>*返回：18位身份证号码<BR>*------------------------------------------------------<BR>Function NewIdCode<BR>&nbsp;&nbsp;&nbsp; Parameters OldId<BR>&nbsp;&nbsp;&nbsp; Local id1,id2,i,NewId<BR>&nbsp;&nbsp;&nbsp; id1=Strtran(OldId," ","")<BR>&nbsp;&nbsp;&nbsp; id2=0<BR>&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(id1)=15<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1=Left(OldId,6)+"19"+Right(OldId,9)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id2=id2+Val(Substr(id1,18-i,1))*(Mod(2^i,11))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1=id1+Iif(Mod(1-id2,11)=10,"X",Str(Mod(1-id2,11),1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Len(id1)=17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i=1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id2=id2+Val(Substr(id1,18-i,1))*(Mod(2^i,11))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1=id1+Iif(Mod(1-id2,11)=10,"X",Str(Mod(1-id2,11),1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1="Error"<BR>&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp; NewId=id1<BR>&nbsp;&nbsp;&nbsp; Return NewId<BR>Endfunc</P>
<P><BR>*----------------<BR>*18位身份证校验码<BR>*----------------<BR>Function valid_Id_Card_Num<BR>&nbsp;&nbsp;&nbsp; Lparameters cIdCardNo18<BR>&nbsp;&nbsp;&nbsp; Local s,i,b,Y,LastChart, StrValid, Wi<BR>&nbsp;&nbsp;&nbsp; StrValid = '10X98765432'<BR>&nbsp;&nbsp;&nbsp; Wi = '7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1'<BR>&nbsp;&nbsp;&nbsp; S=0<BR>&nbsp;&nbsp;&nbsp; For i = 1 To 17<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = Val(Substr(cIdCardNo18,i,1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S = S + b * Val(Getwordnum(wi,i,','))<BR>&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp; Y= Mod(s,11) + 1<BR>&nbsp;&nbsp;&nbsp; LastChart = Substr(StrValid,Y,1)<BR>&nbsp;&nbsp;&nbsp; Return LastChart<BR>Endfunc</P>
<P><BR>本文来自CSDN博客，转载请标明出处：<A href="http://blog.csdn.net/apple_8180/archive/2006/07/19/941626.aspx">http://blog.csdn.net/apple_8180/archive/2006/07/19/941626.aspx</A><A></A></P>]]></description>
</item><item>
<title><![CDATA[向表单拖放文件,文件路径及名称显示到列表框中(转)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=46957</link>
<author>doubworm</author>
<pubDate>2009/8/28 23:24:47</pubDate>
<description><![CDATA[<P>向表单拖放文件,文件路径及名称显示到列表框中（十豆三）<BR>&nbsp;*------------------------------------------<BR>&nbsp;By:dkfdtf<BR>&nbsp;之前用API实现过，不过这个更简单，利于VFP本身的功能即可。<BR>&nbsp;　<BR>&nbsp;如：在一个表单上加一个List列表框控件<BR>&nbsp;1. 设置此列表框的 OLEDropMode=1<BR>&nbsp;2. 在列表框的 OLEDragOver 事件中写代码：<BR>&nbsp;Lparameters oDataObject,nEffect,nButton,nShift,nXCoord,nYCoord,nState<BR>&nbsp;If nState=0 And oDataObject.GetFormat(15)<BR>&nbsp;&nbsp;&nbsp;&nbsp; This.OLEDropHasData=1<BR>&nbsp;Endif<BR>&nbsp;3. 在列表框的 OLEDragDrop 事件中写加文件项目的代码：<BR>&nbsp;Lparameters oDataObject,nEffect,nButton,nShift,nXCoord,nYCoord<BR>&nbsp;Local laFiles(1)<BR>&nbsp;oDataObject.GetData(15,@laFiles)<BR>&nbsp;For m.lnI=1 To Alen(laFiles)<BR>&nbsp;&nbsp;&nbsp;&nbsp; This.AddItem(laFiles(m.lnI))<BR>&nbsp;Endfor<BR>&nbsp;　<BR>&nbsp;运行时拖文件（1个或多个）入表单的列表框中，因为代码是写在列表框的 OLEDrag... 事件中的。<BR>&nbsp;如果要在拖入表单并释放后加入列表框，只需将对列表框的设置改写到表单的对应属性和事件中即可。</P>
<P>本文来自CSDN博客，转载请标明出处：<A href="http://blog.csdn.net/apple_8180/archive/2008/12/22/3583601.aspx">http://blog.csdn.net/apple_8180/archive/2008/12/22/3583601.aspx</A><A></A></P>]]></description>
</item><item>
<title><![CDATA[WIN API-VFP获得其他程序多个输入框的内容(转)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=46956</link>
<author>doubworm</author>
<pubDate>2009/8/28 23:21:25</pubDate>
<description><![CDATA[<P>WIN API-VFP获得其他程序多个输入框的内容<BR>原文——十豆三<BR>*--------------------------------------<BR>先用SPY++得知其他程序（我测试的软件）的输入框类是Edit<BR>下面你启动测试的软件，在多个输入框中随意输入几个字符，然后用以下代码即可获得你在多个输入框中输入的字符。</P>
<P>Declare Integer FindWindow In user32 String lpClassName,String lpWindowName<BR>Declare Integer FindWindowEx In user32 Integer hwndParent,Integer hwndChildAfter,String @lpszClass,String @lpszWindow<BR>Declare Integer SendMessage In user32 Integer,Integer,Integer,String @<BR>#Define WM_GETTEXT 0xD<BR>lcCaption="要查找窗口的Caption" &amp;&amp;要查找窗口的标题<BR>lnHandle=FindWindow(Null,lcCaption)<BR>If lnHandle&gt;0<BR>&nbsp;&nbsp;&nbsp; lnSendHwnd=0<BR>&nbsp;&nbsp;&nbsp; Do While .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnSendHwnd=FindWindowEx(lnHandle,lnSendHwnd,"Edit",Null) &amp;&amp;获得输入框句柄<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If lnSendHwnd&lt;&gt;0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcTextValue=Space(255)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SendMessage(lnSendHwnd,WM_GETTEXT,255,@lcTextValue) &amp;&amp;获取输入框内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?lcTextValue &amp;&amp;显示得到的输入框内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Enddo<BR>Else<BR>&nbsp;&nbsp;&nbsp; Messagebox("没有找到 ["+lcCaption+"] 窗体！"+Space(5),48,"信息提示")<BR>Endif</P>
<P>本文来自CSDN博客，转载请标明出处：<A href="http://blog.csdn.net/apple_8180/archive/2009/04/07/4054601.aspx">http://blog.csdn.net/apple_8180/archive/2009/04/07/4054601.aspx</A><A></A></P>]]></description>
</item><item>
<title><![CDATA[MS SqlServer 日期日期格式化函数 Convert]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=46392</link>
<author>doubworm</author>
<pubDate>2009/7/3 2:51:30</pubDate>
<description><![CDATA[<P>MS SqlServer 的日期格式化函数：Convert(data_type[(length)], expression [, style])<BR>参数：data_type[(length)]代表转换的数据类型及长度，expression代表源数据表达式，style代表要转换的日期格式样式</P>
<P>Select CONVERT(varchar, GETDATE(), 0): 05 16 2006 10:57AM<BR>Select CONVERT(varchar, GETDATE(), 1): 05/16/06<BR>Select CONVERT(varchar, GETDATE(), 2): 06.05.16<BR>Select CONVERT(varchar, GETDATE(), 3): 16/05/06<BR>Select CONVERT(varchar, GETDATE(), 4): 16.05.06<BR>Select CONVERT(varchar, GETDATE(), 5): 16-05-06<BR>Select CONVERT(varchar, GETDATE(), 6): 16 05 06<BR>Select CONVERT(varchar, GETDATE(), 7): 05 16, 06<BR>Select CONVERT(varchar, GETDATE(), 8): 10:57:46<BR>Select CONVERT(varchar, GETDATE(), 9): 05 16 2006 10:57:46:827AM<BR>Select CONVERT(varchar, GETDATE(), 10): 05-16-06<BR>Select CONVERT(varchar, GETDATE(), 11): 06/05/16<BR>Select CONVERT(varchar, GETDATE(), 12): 060516<BR>Select CONVERT(varchar, GETDATE(), 13): 16 05 2006 10:57:46:937<BR>Select CONVERT(varchar, GETDATE(), 14): 10:57:46:967<BR>Select CONVERT(varchar, GETDATE(), 20): 2006-05-16 10:57:47<BR>Select CONVERT(varchar, GETDATE(), 21): 2006-05-16 10:57:47.157<BR>Select CONVERT(varchar, GETDATE(), 22): 05/16/06 10:57:47 AM<BR>Select CONVERT(varchar, GETDATE(), 23): 2006-05-16<BR>Select CONVERT(varchar, GETDATE(), 24): 10:57:47<BR>Select CONVERT(varchar, GETDATE(), 25): 2006-05-16 10:57:47.250<BR>Select CONVERT(varchar, GETDATE(), 100): 05 16 2006 10:57AM<BR>Select CONVERT(varchar, GETDATE(), 101): 05/16/2006<BR>Select CONVERT(varchar, GETDATE(), 102): 2006.05.16<BR>Select CONVERT(varchar, GETDATE(), 103): 16/05/2006<BR>Select CONVERT(varchar, GETDATE(), 104): 16.05.2006<BR>Select CONVERT(varchar, GETDATE(), 105): 16-05-2006<BR>Select CONVERT(varchar, GETDATE(), 106): 16 05 2006<BR>Select CONVERT(varchar, GETDATE(), 107): 05 16, 2006<BR>Select CONVERT(varchar, GETDATE(), 108): 10:57:49<BR>Select CONVERT(varchar, GETDATE(), 109): 05 16 2006 10:57:49:437AM<BR>Select CONVERT(varchar, GETDATE(), 110): 05-16-2006<BR>Select CONVERT(varchar, GETDATE(), 111): 2006/05/16<BR>Select CONVERT(varchar, GETDATE(), 112): 20060516<BR>Select CONVERT(varchar, GETDATE(), 113): 16 05 2006 10:57:49:513<BR>Select CONVERT(varchar, GETDATE(), 114): 10:57:49:547<BR>Select CONVERT(varchar, GETDATE(), 120): 2006-05-16 10:57:49<BR>Select CONVERT(varchar, GETDATE(), 121): 2006-05-16 10:57:49.700<BR>Select CONVERT(varchar, GETDATE(), 126): 2006-05-16T10:57:49.827<BR>Select CONVERT(varchar, GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM<BR>Select CONVERT(varchar, GETDATE(), 131): 18/04/1427 10:57:49:920AM</P>
<P>其中：130、131代表科威特标准即中东标准，中国近似为回历</P>]]></description>
</item><item>
<title><![CDATA[父母血型与后代的关系]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=39477</link>
<author>doubworm</author>
<pubDate>2008/9/1 15:13:56</pubDate>
<description><![CDATA[<P>按ABO血型<BR>婚配式　子女可能有的血型　子女不可能有的血型<BR>A×A　　　A、O　　　　　　　B、AB<BR>A×B　　　A、B、O、AB　　　　无<BR>A×AB　　 A、B、AB　　　　　　O<BR>A×O　　　A、O　　　　　　　B、AB<BR>B×B　　　B、O　　　　　　　A、AB<BR>B×AB　　 A、B、AB　　　　　　O<BR>B×O　　　B、O　　　　　　　A、AB<BR>AB×AB　　A、B、AB　　　　　　O<BR>AB×O　　 A、B　　　　　　　AB、O<BR>O×O　　　O　　　　　　　　A、B、AB</P>
<P><BR>血型是如何遗传的？<BR>在日常生活中，人们常用一些不规范的方法来推测、判断父母与子女之间的血缘关系，却往往得出错误的结论，引起一些不必要的纠纷。如果从基因的角度来判断血型的遗传关系，就能避免父母与子女之间血缘关系的判断错误。<BR>遗传学研究证明，人的血型同其他所有遗传性状一样，都是由染色体上的基因决定的。我们通常说的ABO血型基因在9号染色体上，科学家早就发现控制人的ABO血型基因有不同的三种，即A、B和O基因，而每条9号染色体上只容得上述三种基因中的任何一种血型基因。这样，来自父母双方两条染色体上的基因匹配就可能出现6种形式：OO，AA，AO，BB，BO，AB，即可能产生6种不同的遗传血型。至于每个人到底是哪种遗传血型，那就要看他从父亲和母亲身上分别传下来的是哪种基因。<BR>通常，人的血型分为A型、B型、O型及AB型4种类型。而为什么血型的遗传型却有前面所说的6种类型，其两者之间有着以下的关系：即如果一个人血型的遗传类型为OO型，则他(她)的血型为O型；如果遗传类型为AA型，则血型为A型；如果遗传类型为AO型，则其血型也为A型；如果遗传类型为BB型，则其血型为B型；如果遗传类型为BO型，则其血型也为B型；如果一个人的血型遗传类型为AB型，则其血型也是AB型。</P>
<P><BR>Rh血型简介<BR>一、什么是Rh血型?<BR>人类红细胞血型由多达二十多种的血型系统组成，ABO和Rh血型是与人类输血关系最为密切的两个血型系统。当一个人的红细胞上存在一种D血型物质(抗原)时，则称为Rh阳性，用Rh(+)表示；当缺乏D抗原时即为Rh阴性，用RH(-)表示。<BR>二、Rh(-)属稀有血型吗?<BR>Rh(-)的分布因种族不同而差异很大，在白种人中的比例较高，约百分之十五。中国人群中，新疆维吾尔等少数民族Rh(-)的分布为百分五；蒙古族人接近百分之一；汉族人所占的比例极少，仅千分之三，属稀有血型。如果同时考虑ABO和Rh血型系统，在汉族人群中寻找AB型Rh(-)同型人的机会不到万分之三，十分罕见。<BR>三、Rh血型是如何遗传的?<BR>Rh(-)基因是隐性基因。当Rh(+)的父母带有Rh(-)基因，且同时遗传给子代时，其孩子即表现为Rh(-)，双亲有一人是Rh(-)时，其子女为Rh(-)的机会增大，反之机会减少。<BR>四、Rh(-)有何意义?<BR>无论是Rh(-)者还是Rh(+)者其差别仅仅是血型的不同，都属健康人群。但Rh(-)者遇到特殊时其临床意义不容忽视，如连续两胎母婴Rh血型不合的妊娠，很可能导致胎儿的严重伤害；又如有输血、人流等免疫史的病人再次输入Rh(+)血时，可能产生强烈的溶血性输血反应。<BR>五、Rh(-)者如何自我保护?<BR>请您记住这条原则：血液只能同型输注，即A型Rh(-)患者只能输A型Rh(-)血，B型的只能输B型Rh(-)血，假如您生病或手术需要输血时，您一定要将您是Rh(-)血型的情况告知医生，以便医生及早和市血液中心联系，组织您所需要的Rh(-)血源。假如您是未育女性，请您做好计划生育以避免人工流产，若您已有流产或输血史，妊娠期务必到血站血型室进行新生儿溶血病的预测检查，以防止今后新生儿溶血病的发生。<BR>六、您知道血型工作者已经为您做了哪些工作吗?<BR>紧急情况时能否及时向Rh(-)患者供应同型血液是一件性命悠关的大事，血液中心的血型工作者以保障每一位Rh(-)患者的输血安全为己任，常年不懈地对数以万计的供血人群进行Rh(-)血型筛选，一旦筛选到Rh(-)血，这袋血就立即做上特殊的标记并保存在4℃冰箱中以备急需。<BR>七、Rh(-)者输血供应有保障吗?<BR>尽管输血工作者防患于未然已竭尽全力，但紧急情况时Rh(-)者可能缺乏同型而危及生命的潜在危险依然存在。其实，消除这一困扰的方法很简单：即所有Rh(-)者同舟共济，在随时作为可能的受血者的同时，也随时作为一名高尚的供血者，这样您和所有的Rh(-)者的生命都将得保障。<A></A></P>]]></description>
</item><item>
<title><![CDATA[短信集]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=37544</link>
<author>doubworm</author>
<pubDate>2008/7/7 18:39:45</pubDate>
<description><![CDATA[<SPAN class=font_diary_size id=diary_group_textDIV style="LINE-HEIGHT: 150%">1.有种友情，事过境迁依然纯朴；有种信任，事隔多年依然怀念；有种友谊，无须挂齿却心领神会；有种问候，清清淡淡却真诚无限！节日快乐！<BR><!---->2.日出东海落西山，愁也一天，喜也一天；遇事不钻牛角尖，人也舒坦，心也舒坦。<BR><!---->3.人生处事之遇到曾经爱过的人时，记得微笑向他感激，因为他是让你更懂爱的人。<BR><!---->4.人生处事之遇到可相信的朋友时，要好好和他相处下去，因为在人的一生中，可遇到知己真的不易。<BR><!---->5.你不能改变天气，但你可以改变心情；你不能选择容貌，但你可以选择表情；你不能预支明天，但你必须用好今天！<BR><!---->6.人生经典之：如果敌人让你生气，那说明你还没有胜他的把握！<BR><!---->7.找一湖碧水，钓几尾闲鱼，回忆人生得失，心游凡尘。喝一壶老酒，交一群朋友，笑谈人间得失，虽说人在江湖身不由己，记着：千万别太累着自己！</SPAN>]]></description>
</item><item>
<title><![CDATA[程序员成功之路(转)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=34236</link>
<author>doubworm</author>
<pubDate>2008/4/21 23:15:07</pubDate>
<description><![CDATA[<SPAN style="FONT-SIZE: 13px">程序员成功之路 ——The road ahead for programmer（演讲稿--gejianlin）<BR>一、我很羡慕在座的各位同学，因为你们是中国未来的程序员，而我不是，我一直很遗憾。<BR>比尔盖茨曾经写过一本书叫做《未来之路》The road ahead, 那么今天我选择这样一个题目，the road ahead for programmer, 程序员的未来之路，也就是程序员的成功之路，希望大家未来也能够拥有像比尔盖茨一样的智慧的头脑和开一家像微软一样的公司。俗话说：心有多大，人生的舞台就有多大！<BR>二、最近看了几篇csdn上的漫漫人生路专辑，很有感触，这里摘抄了几句，非常愿意和大家分享, 优秀程序员的心里话：<BR>编程的原因是喜欢，不是为了别的。 <BR>从摸上电脑的那一刻，我就知道，这才是我的世界。<BR>我一心一意地想作个程序员，尽管知道很累。<BR>人真的不能轻言放弃，否则，失去的永远无法挽回！<BR>生命是一种长期而持续的累积过程 <BR>所有成功的人都有一个不变的黄金法则： 积累！与 坚持！<BR>大家听了这些话，不知道是怎样的想法呢？<BR>提问，（1）你以前有没有读过这样的文章或有没有程序员跟你说过这样的感受？<BR>（2）你怎样看待程序员这个职业？你有这种感觉吗？<BR>上面的话其实都在说明一个道理，只有全身心地投入，写程序才会有意思，才会体会到其中的乐趣。<BR>电脑的世界其实很大，程序员是活在自己想象的王国里。你可以想象到电脑里细微到每一个字节、每一个比特位的东西。通过电脑可以实现你的设想，解决你的问题。电脑远没有人那么复杂，如果程序写得好，你就可以和电脑处好关系，就可以指挥电脑干你想干的事。每每你坐在电脑面前，这个时候你是十足的主宰。<BR>理想和梦想，比尔盖茨自从见到了计算机这个东西，就想象有一天个人计算机将是每一部办公桌面系统以及每一家庭的必备的工具，并为这一信念所指引，开始为个人计算机开发软件。<BR>三、程序人生：可以把程序作为你的人生，也可以把你的人生当作程序来设计。<BR>你的父母把你生下来，你的身体就是一台计算机，而上面运行的软件就是你的思想，这个软件版本高低功能的强弱，就看你的思想境界。思想软件需要你自己慢慢地去编写，可能父母教给了你最基本的语言，但是其他的高级语言和技能需要你长大以后要自己去学习，你能精通几门语言是你的本事。 <BR>第一步，随着你渐渐的长大，你开始有了需求，各种各样的需求，一开始你只是想要一块巧克力糖，一个新书包，一件新衣服，一辆崭新的自行车；后来你可能就想要一栋房子、一辆好车，你开始追求高质量的的物质生活、精神生活，你追求成功与快乐、还要求更好的发展，希望得到别人的尊敬，过一份有尊严的生活。需求很多很多，仔细分析你的需求，想想你最想要什么？怎样去实现它。<BR>第二步，是很关键的一步，你要设计自己的人生程序。你首先要概要设计，你希望将来成为一个怎样的人，分几大步实现这个目标，少年、青年、成年、中年、老年。可能有求学程序、出国程序、恋爱程序、求职程序、事业程序、升职程序、结婚程序等等。概要设计后还要进行详细设计，你每个月每个星期做些什么，每个小模块里面有每个阶段的小的目标，小程序，这个星期读完一本书，下个月参加考试，然后写一篇论文等等，虽然说人生不可能完全规划出来，但是经过设计的人生远远比没有设计过的人有更有意义，好好的设计你的人生吧。<BR>第三步，是编码和测试，你大多数时间都在不停的编码，同时还要不停的测试，编码的过程十分的辛苦，需要耐心和思考，你会觉得苦闷、烦躁不安、寂寞、痛苦、迷茫与无奈，但有些时候又十分开心、兴奋虚荣、骄傲和满足。编码的过程充分体现了人生琐碎与不如意和艰难，bug永远存在，人生也在不断的犯错误和不断地总结。就像一个程序不能编写得完美一样，人生也是不完美的，你不可能处处要求完美，很多地方需要同别人交流和互相借鉴。测试可以分为内部测试和外部测试，经过测试，你发现自己的错误，并想方设法改正它，然后成长起来。<BR>第五步是集成和软件发版，你的设计的人生软件要拿到市场上去卖，能不能卖上好价钱，要看软件的功能和特色，性价比、看软件的包装，你有没有高人一等的杰出才能，你有没有于其它软件相比的竞争力，软件的价值，也就是你人生的价值。当然你可能是一个很高尚的人，编一些免费的软件，不做比尔盖茨，做linus torvols也挺好的，在自由的空气在互联网上空飘荡。看你自己的选择！不过这个世界好像更欢迎前者，linus住在拥挤的民用公寓里。而比尔盖茨住在自己像皇宫一样的豪宅里面当帝王，你首先要解决生存的问题，然后再去考虑其他得东东。<BR>好好的谱写你的人生程序，人这一辈子真是要追求点什么才有意义！在谱写你的人生程序之前，首先看一看你的前辈们是怎样谱写他们的成功人生的！（慢一点儿）<BR>四、国外著名程序员<BR>冯&#8226;诺伊曼和阿兰&#8226;图灵计算机之父，图灵机是现代通用计算机的原型<BR>小托马斯&#8226;沃森，蓝色巨人IBM创始人，迅速发展起来，40%的利润率 <BR>史蒂夫&#8226;乔布斯，苹果公司的总裁 <BR>肖克利博士因将其一生献给其钟爱的晶体管事业而名垂计算机史。<BR>蒂姆&#8226;贝纳斯－李的最大贡献当属发明了WWW（Word Wide Web,万维网）。他也因此而以“Web之父”及大多数浏览器标准的监护人而闻名于世<BR>最早干起计算机软件编程的不是盖茨，而是他的朋友和竞争对手加里&#8226;基尔代尔。 作为最伟大的程序设计员和设计家之一，他搞程序主要是出于缜密思维的雅兴，而不是为了赚钱。当时他开发了一个CP／M操作系统，比尔盖茨也自己写了一个dos操作系统，但是很不好用，远远比不上cp/m,所以ibm公司就想把基尔的操作系统买下来，比尔盖茨这个时后表现出极大的热情，主动代表基尔去谈，于是谈来谈去就把基尔的操作系统谈成了自己的东西，人们都说，使用操作系统的是人都欠基尔一份情，而盖茨欠得最多。 <BR>比如盖茨赖以扬名立身并最终发家致富的Basic语言，是60年代达特默斯学院的两位教授创造的。而微软起飞的翅膀DOS，更是基尔代尔的“临摹品” 。Windows用的是苹果的技术，Excel其实是Lotus1-2-3的复制品，Web浏览器也是借助网景的创意开发的，Word纯粹是WordStar、WordPerfect的跟风...... <BR>微软屡屡实施“吸功大法”，博采众家之长，将许多其他公司创造的新技术新功能纳入自己的产品 <BR>但是，<BR>不管盖茨使用了什么卑劣和霸道的经营手法，不管微软是不是违反了垄断法，不管法院将对它做出什么样的裁决，我们都应当感谢微软，感谢盖茨，是他们改变了我们的工作、学习和生活方式，是他们增加了我们对这个世界的更新、更深刻的认识，是他们让人类向科技和文明的高峰又迈进了一步。盖茨和微软，是工业经济时代向信息经济时代转轨过程中永远屹立的丰碑！<BR><BR>五、国内著名程序员：<BR>求伯君 王江民 严援朝 吴晓军 <BR>鲍岳桥 刘　旭 王志东 朱崇君 <BR>王永民 史玉柱 刘积仁 周志农 <BR>丁　磊 王文京 刘迎建 池宇峰 <BR>王志东 周　奕 郭 为 刘　虎<BR><BR>六、中国有千千万万的程序员，从求伯军到王江民，从严援朝到王志东，从丁磊到雷军；世界上也有千千万万的程序员，从Linus到Andersen，从比尔.盖茨到杨致远，我一直在研究这些优秀的程序员所走过的道路。发现他们共同的特点是把软件开发当成自己的嗜好，并且把这种嗜好变成自己的事业，永远保持着好奇心、思考、执著(韧性)和耐心！市场需求决定着软件产业的发展方向。软件工程师不能就技术论技术，而是要就市场论技术。因为如果没有市场需求，没有地方可应用，即便是“天衣无缝”的技术也只能“孤芳自赏”。 <BR><BR>好奇心：乐趣始终是工作的源动力。视工作的成就为人生最大享受，可能是这一代新富翁共同的特点。做自己喜欢做的事，而不是赚钱，才是他们的主要动力。对他们而言，在计算机屏幕前编写着一句句看似枯燥的程序代码，干得不分昼夜，是最大的乐趣。<BR><BR>思考：基尔代尔，作为最伟大的程序设计员和设计家之一。他搞程序主要是出于缜密思维的雅兴，而不是为了赚钱。在开发的过程中学会思考和远望，学会做创造性的工作。有思想的程序员生命力才能长久。给大家出两道思考题：软件的本质是什么？软件高手怎样定义？日后有机会大家一起讨论!<BR><BR>执著：执著是一切天才的“通病”， 王文京执著于财务软件，于是有了今天的用友软件。苏启强执著于软件服务，于是有了今天的连邦软件。我们也要执著于我的执著！阿甘的例子，只有偏执狂才能生存IBM（安迪&#8226;葛洛夫）<BR><BR>耐心：值得你一生去学习的东西！高手往往都是寂寞的，寂寞的人是走得最快的人。<BR>一个人只要有韧性，刚开始写程序的时候，学得多的人写得好，到了后来，大家都上了一个层次，谁写的好只取决于这个人是否细心、有韧性、有灵性。关键是你是否能够出想法出产品，你的劳动是否能被社会承认，能为社会创造财富。<BR><BR>我要告诉大家的是，不论你今后是选择继续学习还是选择工作，都要始终把终身学习的观念树立起来，永远保持对新事物的好奇心，执著的去追求自己做钟爱的软件事业，学会思考，去除浮躁，有耐心的去写好每一行代码，那么不管今后你发展的怎么样，至少现在，你已经具备了一个优秀程序员所具备的基本素质，你的思想已经能够得到别人的尊重。<BR>“专注与超越——这是人生每日的主题”<BR>七、如何做一个成功的程序员？<BR>下面是我和一些朋友谈过之后的小结，希望对于各位有所帮助。 <BR>1. 培养对软件开发的兴趣。<BR>因为不喜欢，所以才感觉的痛苦，因为痛苦，所以很难有大的发展，因为一直没有大的进步，所以，更加不喜欢。如此恶性循环。而正确的应该是，先做到对于软件开发感兴趣，如何做呢？首先你要产生对于软件本身的好奇心，做这项生活的人，多数有这方面的爱好，也能感受到其中的乐趣，否则就会成天痛苦不堪。<BR><BR>2. 第二步，其实更简单，给自己进入软件行业一个理由！<BR>然后，写下来，放在一个适当的地方，不要随便看到，但是，永远不要忘掉。 <BR>为什么需要这个理由？原因很简单。当我听一些朋友聊他的苦闷时，总觉得对于自己选择软件行业是一个错误，如何的不好。我就问他，你当初为什么选择软件这一行？想了半天，他才回答我。我说，你在犹豫 ，就证明你已经淡忘了当初你为什么决定入行了。关于选择，应该说人生无处不在抉择，一旦选择了就不会放弃。既然选择了就不要轻易后悔，执著的走下去，因为你一后悔，任何选择和决定都是错误的。永远不要把时间浪费到对往事后悔的追忆上。<BR>如果你一直记得入行的理由，那么，在做软件开发这份寂寞的路上，你永远不会被寂寞击倒。成功就在你坚持的那一刻来临。<BR>3. 一切从dos开始。<BR>也许你觉得奇怪，为什么要从dos开始，因为这里我是说你要成为一个成功的软件程序员，而不是仅仅是一个程序员，既然你要成功，所以，你要厚积薄发，所以，从dos开始是有道理的。因为从dos开始，你就知道，要想删除一个文件不是右键点一下，然后，选择删除菜单，可能还要点一个确定，就一切OK了，你可以要执行一下del指令，然后，还要输入一些参数如文件名，可能还需要路径，知道这两个区别有什么用呢？当然有用，你不会被漂亮的窗口界面（所见即所得的精美画面）所迷惑。 当你现在才开始学习的时候，挡住窗口界面的引诱，或许你会更容易成功。 <BR>　你可以猜测出它们大概处理的过程是什么。<BR>4. 开始你选择的工具决定了你将来的发展水平<BR>世界上流行的程序语言有许多种，这种情况将来也不会改变，因为这是由我们所面临的需要解决的计算问题的五彩缤纷所决定的。任何语言都不可能是最完美的工具，不可能在处理任何问题时都是最锐利的宝剑。“为完成目的而不择工具”； 一个计算机工作者需要理解掌握多种程序设计语言，只有这样，在遇到具体问题时才可能做出更合理的选择。<BR>目前流行的：.net; Java; VB; VC等等。<BR>各种开发工具各有千秋，应根据具体应用来采用不同的工具。例如写MIS用PB/VB就很好，界面设计用VB/Delphi很不错，写系统软件，用C是最好的。对于初学者来说，先用一种可视化强的工具(如VFP/VB/DELPHI)比较好，容易掌握，上手也快。但如果你想做一名真正的程序员，我建议你还是很有必要去精通C。<BR>　　单从一个很功利的角度来说说。Delphi/ VB对于一般人来说学上几个月就可以上手了。易学的东西学的人肯定多。而对于C来说，由于它难掌握，学的人不火，但一旦你真正掌握了，你的竞争实力就比其他人强。现实中，C程序员的工资普遍高于其他程序员就是一个证明。<BR>Vb/delphi 写界面的4000元<BR>vc 写通讯DLL的5000到6000元<BR>linux c/c++ 写服务器的7000到9000元<BR>知道C/C++有前途了吧 <BR>5. 编译原理<BR>如果你有足够的好奇的话，你现在应该想知道编译工具背后的故事，写代码时，你也许会奇怪，不同的程序语言为什么会有不同的语法，语义，语用；变量名为什么不能数字开头？计算机如何识别这些定义，运算，名字空间等等。这个时候看看《编译原理》多少能够给你一些解释。学习一点理论知识，加强你的理论功底，很多人都说科班出身的程序员比参加社会认证培训出来的程序员强的地方，就是理论功底强，系统思考能力强，时间长了就会体现出其优势。学习编译原理的另一个好处在于将来你学习其它开发工具时， 特别是学习不同底层语言的开发工具时，虽然它们的底层语言相关非常大，但是，除去这些语言的外衣，用编译原理层面来看它们，原来它们是如此相似。<BR>6. 操作系统原理<BR>你要知道，任何你做出来的软件都是运行在操作系统环境中的，操作系统为你的作品提供了什么样的环境呢？ 这很重要，如果是DOS，它是以软中断的方式提供的，而Windows则是以一系列的API提供的。然后，你还可以知道，如何判断系统当前路径，内存管理机制、进程/线程调度、信号、内核对象管理、系统调用等，操作系统中如何处理死锁的 。 <BR>7. 现在让我们进入windows时代，windows下的开发工具<BR>毕竟在微软统治的时代，大家还是识时务者为俊杰比较好，windows下的开发工具一定要重点掌握。 面向过程编程向面向对象转变，现在流行的开发工具VC,VB都差不多。<BR>8. 数据库原理和开始数据库编程<BR>现在做软件一个最基本的应用类型就是数据库编程，这是可能使你可以胜任很大一部分工作了。也就是说，如果你掌握了数据库之后，你就可以出去找工作了。很多应用程序都是以数据库的数据为中心，而数据库的产品也有不少，其中关系型数据库仍是主流形式，用SQL server作为起点吧，因为这东西使用起来挺方便的。写一个简单的单表输入程序，简单一点容易掌握。比如写一个客户资料录入程序。 <BR>10 英语<BR>统计表明，全世界45个国家的官方语言是英语，1/3的人讲英语，75%的电视节目用英语播出，80%以上的科技信息用英文表达，几乎100%的软件源代码用英文写成。<BR>学习英语真得很重要，且不说它是程序世界的主导语言，且不说它是计算机专业本科毕业生四年的必修课，且不说它是全世界程序高手们互相切磋寻求帮助的主要工具，它还是现在大多数用人单位的敲门砖，在这样一个开放性的社会里，如果你不懂英文，你是不是很难称得上是一个人才啊！<BR>多读英文书。信息技术发展太快，而大部分的技术最先出现的时候都是英文版本的，要几个月以后才有中文版本的书出来，因此要想跟上步伐，一定要努力提高自己的英文水平，这样才能同步跟上信息技术。你可能担心自己的英语水平不行，没关系，刚开始多查字典。<BR>很多东西看中文的译版不如原版的清晰，中文的可能越看越糊涂，可是英文却可以一目了然。再说对于一些最新的技术和动态文章，你哪里有时间去等到别人给你翻译出来再看啊，等你看到了，也快过时了。不懂英语，你真得很难算得上是一个人才！<BR>到了这里，你没有发现你在和别人聊软件开发时，别人对你的态度有变化呢？ <BR>八、从现在开始，你要注意和别人交流了，因为从现在开始的很多东西，都是别人一指点就可以，而你自己看需要很久的。可以经常去一些论坛交流，都是很不错的，没有不上网的程序员，也没有不在网上取长补短的程序员。不过在问问题之前，自己一定要先努力尝试过，再给出自己的想法。动不动就问别人，自己水平得不到提高，别人也不再会回答你的问题。<BR><BR>九、程序员最喜欢的网站：<BR><A href="http://www.microsoft.com/china/msdn/default.asp" target=_blank><FONT color=#013584>http://www.microsoft.com/china/msdn/default.asp</FONT></A>&nbsp;&nbsp;微软社区<BR>(IBM SUN Borland orACLE BEA CISCO GOOGLE)<BR><A href="http://www.csdn.net/" target=_blank><FONT color=#2f76c5>http://www.csdn.net</FONT></A>&nbsp;&nbsp;中国软件<BR><A href="http://www.china-pub.com/" target=_blank><FONT color=#013584>www.china-pub.com</FONT></A> 互动出版社<BR><A href="http://www.codestudy.net/" target=_blank><FONT color=#013584>www.codestudy.net</FONT></A> 程序员联盟<BR><A href="http://www.codeproject.com/" target=_blank><FONT color=#013584>http://www.codeproject.com</FONT></A> <BR><A href="http://www.soft.net/" target=_blank><FONT color=#013584>www.soft.net</FONT></A> 印度<BR>msdn.microsoft.com/msdnmag<BR><BR>十、程序员的七种武器<BR>第一种武器：开发工具<BR>至少熟练掌握两到三种开发工具的使用，这是程序员的立身之本，其中C/C++和JAVA是我重点推荐的开发工具，C/C++以其高效率和高度的灵活性成为开发工具中的利器，很多系统级的软件还是用C/C++编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在，而本人对SUN公司的“网络即计算机”的概念相当欣赏，并相信JAVA即其相关的技术集JAVA One会成为未来的主流开发工具之一。其次，如果能掌握一种简便的可视化开发工具，如VB，PowerBuilder，Delphi，C++ Builder，则更好，这些开发工具减小了开发难度，并能够强化程序员对象模型的概念。另外，需要掌握基本的脚本语言，如shell,perl等，至少能读懂这些脚本代码。 <BR>第二种武器：数据库<BR>为什么数据库是如此重要？很多应用程序都是以数据库的数据为中心，而数据库的产品也有不少，其中关系型数据库仍是主流形式，所以程序员至少熟练掌握一两种数据库，对关系型数据库的关键元素要非常清楚，要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具，但SQL是基础，是通用的数据库操作方法。如果没有机会接触商业数据库系统，可以使用免费的数据库产品是一个不错的选择，如mySQL, Postgres等。 <BR>第三种武器：操作系统<BR>当前主流的操作系统是Windows，Linux/Unix，熟练地使用这些操作系统是必须的，但只有这些还远远不够。要想成为一个真正的编程高手，需要深入了解操作系统，了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统，是一个很好的学习平台，Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少，但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后，你会发现自己上了一个新的台阶。 <BR>第四种武器：网络协议TCP/IP<BR>在互联网如此普及的今天，如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握，就需要迅速补上这一课，网络技术已改变了软件运行的模式，从最早的客户/服务器结构，到今天的WEB Services，再到未来的网格计算，这一切都离不开以TCP/IP协议栈为基础的网络协议支持，所以，深入掌握TCP/IP协议是非常必要的。至少，你需要了解ISO七层协议模型，IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。 <BR>第五种武器：DCOM/CORBA/XML/WEB Services<BR>随着技术的发展，软件与网络的无缝结合是必然趋势，软件系统的位置无关性是未来计算模式的重要特征之一，DCOM/CORBA是当前两大主流的分布计算的中间件平台，DCOM是微软COM(组件对象模型)的扩展，而CORBA是OMG(object Management group)支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件，而是要理解这些技术的初衷，即为什么需要这项技术，如果你能理解了这一点，再回头看这些技术的具体实现，就如庖丁解牛，迎刃而解。XML/WebServices重要性不言而喻，XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”，是分布计算的基石之一。 <BR>第六种武器：软件工程与CMM<BR>现代大型软件系统的开发中，工程化的开发控制取代个人英雄主义，成为软件系统成功的保证，一个编程高手并不一定是一个优秀的程序员，一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合，编程只是软件生命周期中的其中一环，优秀的程序员应该掌握软件开发各个阶段的基本技能，如市场分析，可行性分析，需求分析，结构设计，详细设计，软件测试等。一句话可以概括我的看法：“创意无限，流程保证”。 <BR>第七种武器：强烈的好奇心<BR>什么才是一个程序员的终极武器呢，那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了，它是程序员们永攀高峰的源泉和动力所在。 <BR><BR>养成良好的习惯<BR>现在很流行的一句话是“性格决定命运”，实际上可以这样理解，你的性格决定你的习惯，而习惯决定你的命运！中国有一句古话叫做：习惯成自然。同时，西方古希腊哲学家亚里士多德也说过：“优秀是一种习惯”，比如你每天早上坚持起来读书，就养成了读书的好习惯。那么懒惰也是一种习惯，不知道在座的各位又没有感觉到，当你睡觉越来越多的时候，你每天都想睡觉，越睡越懒，越坐越瘫。你习惯于10点睡觉7点起床，那就比习惯于11点睡觉6点起床的人少拥有两个小时，而据我所知很多好学习的人都是12点睡觉5点起床的，那你就又比他们每天少拥有4个小时了。<BR>在一次次沉重的洗礼后，痛苦地改掉不利于自己发展的不良习惯，从而又一次超越自己。<BR><BR>一、适当背诵的习惯<BR>新东方有个学员上中学的时候英语特别的差，总是倒数第一名，于是为了提高自己的英文水平他就决定开始背诵新概念英语，结果背到一半2册的时候，他成绩就明显提高了。高考后上了大学，他考上了一所比较著名的大学，他本来不想再背诵了，但是当他背给同学听的时候，其他同学都露出了羡慕的眼光，于是为了这种虚荣心，他就坚持背诵第三册第四册，背得滚瓜烂熟，你说上一句，他就能联出下一句，而且语音非常标准，因为他是模仿磁带背诵的。后来他去了美国的duke大学，第一个星期写文章，教授就把他叫过来说你的文章是剽窃的，他说：“我教了20年的书也没教出这么漂亮的文章来”，这个学生说我没办法证明我能写出这么漂亮的文章，但我告诉你我能背诵108篇文章，你想不想听，于是他就开始背诵，结果他没背完两篇，教授就哭了起来，为什么？这个教授想我教了20年书，居然一篇文章也没有背过，被中国学生背掉了，所以很难过。小时候背诵儿歌的故事，好的算法和好的代码可以重点看一看。 <BR>二、好为人师的习惯 <BR>把你认为你懂的东西讲出来吧，将给别人听，你会记忆得更加深刻。成就感是一点一点积累起来的，你考考别人bluetooth、ASP、PDA、CDMA是什么？如果他不懂，你就讲给他听，同时你自己的记忆也在加深。在现代这样一个向开放型过渡的社会里，你要想成功必须要善于表达自己，善于表达自己的观点和思想，并想办法说服别人，做市场作营销当老师当领导者，你要想证明自己有能力，那你就必须学会说出来呀、表达自己，塑造你个人的影响力，人与人之间的交往，就是意志力与意志力的较量，不是我影响你，就是你影响我。 现在最流行的职业：口力劳动者，教师、主持人、歌星、领导、美国总统、市场营销人员等等。<BR>三、五官齐用的习惯 <BR>如果说你看到的东西，你会记住30%，那么你同时看和听就会记住50%，如果你既看又听，手里还在写、嘴里还在念念有词，你就会记住100%，如果日后有时间再复习两至三遍，你就永远不会忘记了。不在于你一次看了多长时间，重要的是你重复了多少次！ <BR>四、学习他人的习惯 <BR>给自己树立一个目标人物，最好从身边找到一个这样的榜样，你可以跟他交流，这样当你遇到困难的时候想一想你做敬佩的人会怎样做，你就有力量去征服它了。我常以为，这辈子如果能遇到一位好的指导老师讲是一件很幸运的事情。如果身边没有，我上面举了那么多的明星人物，从里面找一个你的努力目标吧！周奕的例子，mp3到光盘刻录、注册码、汇款方式。小的目标大的目标，向他看齐，现在时代，不是个人英雄主义的时代，你要学会从别人身上学习好的东西，拿为己用，你的任务只是在他的基础上能够提升。 <BR>五、见缝插针的习惯 <BR>时间像海绵里的水，看你怎样挤出来用，最有效的记忆规律不是你一次记忆多长时间，二是你多长时间重复记忆多少次。把你最喜欢的书随时带在身边，有空就看，不要让大脑闲置太久不用。背单词。<BR>六、设立特定的目标并规定期限 <BR>把你的人生当成程序来设计，制定计划，并限制完成的日期，否则你总会被各种原因而耽误的。比如说参加gre考试，你永远也不敢肯定自己是否已经准备到最充分了，那么是不是就一直不考呢？一直在准备准备、复习复习，直到你筋疲力尽没有力气去考试了，一鼓作气、再而衰、三而竭，再说时间有限，你有多少时间可以浪费呢？ <BR>七、注重实践的习惯 <BR>无论你的书本知识掌握得多么牢固，你多么的清晰地理解你所学到的知识，你一到实践中去用，你会发现远远不是那么一回事。就像学习游泳，我学游泳的时候，请教了无数的游泳专家，模仿最标准的姿势，练气和技巧，我在陆地上不停的练习、练习、再练习，可是一下水，全完了，还是不会。 做程序员，那得练、不停的练习。最好的学习方法，就是自己写一段小程序。学习开车，我跟我男朋友学开车，每次他开车的时候都告诉我，怎样启动发动机，然后踩离合器，挂档，给油，刹车停车，我对开车的理论和技巧无比熟悉了，自信一定可以开车了，于是就尝试了一下，怎么样，结果不是不堪设想啊，动用了手刹。学员活动调查结果，最短时间内、最快学会编程、成为像你们一样的程序员！</SPAN>]]></description>
</item><item>
<title><![CDATA[VFP获取 SQL Server 常用脚本]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=31382</link>
<author>doubworm</author>
<pubDate>2008/1/19 2:06:11</pubDate>
<description><![CDATA[<P>*-----------------------------------------------<BR>* SqlServer 相关函数<BR>*-----------------------------------------------<BR>Clear<BR>*-----------------------------------------------<BR>* 测试 GetTableCode()<BR>*-----------------------------------------------<BR>Local lcDataBaseName, lcTableName, lcTableCode, lnSqlHandle, lcSqlStringConnect<BR>lcTableCode = []<BR>lcDataBaseName = [DCLZ]<BR>lcTableName = "[dbo].[考勤原始表]"<BR>lcSqlStringConnect = [driver={Sql server};server=(local);uid=sa;pwd=Admin;database=Master]<BR>lnSqlHandle = Sqlstringconnect( lcSqlStringConnect )<BR>If lnSqlHandle &gt; 0<BR>&nbsp;&nbsp;&nbsp; = SQLSetprop(lnSqlHandle,[DispWarnings], (.T.))<BR>&nbsp;&nbsp;&nbsp; lcTableCode = GetTableCode( lnSqlHandle, lcDataBaseName, lcTableName )<BR>&nbsp;&nbsp;&nbsp; = SQLDisconnect(lnSqlHandle)<BR>&nbsp;&nbsp;&nbsp; If !Empty(lcTableCode)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Cliptext = lcTableCode<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Modify File ([(]+lcDataBaseName+[)]+lcTableName+[.sql]) Nowait<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyboard [{CTRL+A}]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyboard [{CTRL+V}]<BR>&nbsp;&nbsp;&nbsp; Endif<BR>Endif<BR>Return </P>
<P>*-----------------------------------------------<BR>* 测试 GetProcedreCode()<BR>*-----------------------------------------------<BR>Local lcDataBaseName, lcProcedreName, lcProcedreCode, lnSqlHandle, lcSqlStringConnect<BR>lcProcedreCode = []<BR>lcDataBaseName = [DCLZ]<BR>lcProcedreName = [dbo.ins考勤原始表]<BR>lcSqlStringConnect = [driver={Sql server};server=(local);uid=sa;pwd=Admin;database=Master]<BR>lnSqlHandle = Sqlstringconnect( lcSqlStringConnect )<BR>If lnSqlHandle &gt; 0<BR>&nbsp;&nbsp;&nbsp; = SQLSetprop(lnSqlHandle,[DispWarnings], (.T.))<BR>&nbsp;&nbsp;&nbsp; lcProcedreCode = GetProcedreCode( lnSqlHandle, lcDataBaseName, lcProcedreName )<BR>&nbsp;&nbsp;&nbsp; = SQLDisconnect(lnSqlHandle)<BR>&nbsp;&nbsp;&nbsp; If !Empty(lcProcedreCode)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Cliptext = lcProcedreCode<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Modify File ([(]+lcDataBaseName+[)]+lcProcedreName+[.sql]) Nowait<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyboard [{CTRL+A}]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keyboard [{CTRL+V}]<BR>&nbsp;&nbsp;&nbsp; Endif<BR>Endif<BR>Return<BR>*----------------------------------------------- </P>
<P>*-----------------------------------------------<BR>* 函数: 获取SQL Server加密存储过程、函数、<BR>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 视图、触发器&nbsp; 脚本，字节不受限制<BR>* 设计: 红雨<BR>* 时间: 2004.04.01<BR>*-----------------------------------------------<BR>Function GetProcedreCode( tnSqlHandle, tcDataBase, tcObjectName )<BR>&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp; #Define CR Chr(13)+Chr(10)<BR>&nbsp;&nbsp;&nbsp; Local lcReturn, lcTmpCursor, lcMyProcedure<BR>&nbsp;&nbsp;&nbsp; m.lcReturn = []<BR>&nbsp;&nbsp;&nbsp; m.lcTmpCursor = [T]+Sys(2015)<BR>&nbsp;&nbsp;&nbsp; m.lcDataBase = Iif(Type([m.tcDataBase])=[C] And !Empty(m.tcDataBase), m.tcDataBase, [Master])<BR>&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp; If Type([m.tnSqlHandle])=[N] And m.tnSqlHandle&gt;0 And Type([m.tcObjectName])=[C]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, "use " + m.lcDataBase )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = "CREATE PROCEDURE " + m.lcTmpCursor + "( @objectName varchar(50) )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " AS" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " set nocount on" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " begin tran" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Declare @objectname1 varchar(100)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @orgvarbin varbinary(8000)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Declare @sql1 nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql2 varchar(8000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql3 nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql4 nvarchar(4000)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Declare @OrigSpText1 nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @OrigSpText2 nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @OrigSpText3 nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @resultsp nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ptrval binary(16)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @prvlen Int" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Declare @i Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Status Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Type varchar(10)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @parentid Int" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Declare @colid Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @N Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @q Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @j Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @k Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Encrypted Int," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Number Int"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Select @Type=xtype, @parentid=parent_obj From sysobjects Where Id=object_id(@ObjectName)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " If exists (select * from dbo.sysobjects where id = object_id(N'#result') and OBJECTPROPERTY(id, N'IsUserTable') = 1)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Drop Table #result" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Create Table #result(ProcName varchar(50), ProcCode text)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Insert #result values (@ObjectName, '')" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " If exists (select * from dbo.sysobjects where id = object_id(N'#temp') and OBJECTPROPERTY(id, N'IsUserTable') = 1)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Drop Table #temp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Create Table #temp(Number Int,colid Int,ctext varbinary(8000),Encrypted Int,Status Int)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Insert #temp Select Number,colid,ctext,Encrypted,Status From syscomments Where Id = object_id(@objectName)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Select @Number=Max(Number) From #temp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Set @k=0" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " While @k&lt;<A href="mailto:=@Number">=@Number</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; If Exists(Select 1 From syscomments Where Id=object_id(@objectname) And <A href="mailto:Number=@k">Number=@k</A>)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; If @Type='P'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1=(" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When @Number&gt;1 Then 'ALTER PROCEDURE '+ @objectName +';'+Rtrim(@k)+' WITH ENCRYPTION AS '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else 'ALTER PROCEDURE '+ @objectName+' WITH ENCRYPTION AS '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; If @Type='TR'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Declare @parent_obj varchar(255)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @tr_parent_xtype varchar(10)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @parent_obj = parent_obj From sysobjects Where Id=object_id(@objectName)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @tr_parent_xtype = xtype From sysobjects Where <A href="mailto:Id=@parent_obj">Id=@parent_obj</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @tr_parent_xtype='V'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1='ALTER TRIGGER <A href="mailto:'+@objectname+'">'+@objectname+'</A> ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1='ALTER TRIGGER <A href="mailto:'+@objectname+'">'+@objectname+'</A> ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; If @Type='FN' Or @Type='TF' Or @Type='IF'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1=(" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case @Type" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'TF' Then 'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'FN' Then 'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'IF' Then 'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; If @Type='V'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1='ALTER VIEW <A href="mailto:'+@objectname+'">'+@objectname+'</A> WITH ENCRYPTION AS SELECT 1 as f'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @q=Len(@sql1)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @sql1=@sql1+Replicate('-',4000-@q)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Select @sql2=Replicate('-',8000)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @sql3='exec(@sql1'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Select @colid=Max(colid) From #temp Where <A href="mailto:Number=@k">Number=@k</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @N=1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; While @N&lt;=Ceiling(1.0*(@colid-1)/2) And Len(@sQL3)&lt;=3996" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @sql3=@sql3+'+@'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @N=@N+1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @sql3=@sql3+')'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Exec sp_executesql @sql3,N'@Sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Set @k=@k+1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Set @k=0" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " While @k&lt;<A href="mailto:=@Number">=@Number</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; If Exists(Select 1 From syscomments Where Id=object_id(@objectname) And <A href="mailto:Number=@k">Number=@k</A>)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Select @colid=Max(colid) From #temp Where <A href="mailto:Number=@k">Number=@k</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; Set @N=1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; While @N&lt;<A href="mailto:=@colid">=@colid</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select @OrigSpText1=ctext,@Encrypted=Encrypted,@Status=Status From #temp Where <A href="mailto:colid=@N">colid=@N</A> And <A href="mailto:Number=@k">Number=@k</A>" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText3=(Select ctext From syscomments Where Id=object_id(@objectName) And <A href="mailto:colid=@N">colid=@N</A> And <A href="mailto:Number=@k">Number=@k</A>)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @N=1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @Type='P'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2=(" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CASE" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When @Number&gt;1 Then 'CREATE PROCEDURE '+ @objectName +';'+Rtrim(@k)+' WITH ENCRYPTION AS '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else 'CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @Type='FN' Or @Type='TF' Or @Type='IF'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2=(" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case @Type" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'TF' Then 'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'FN' Then 'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When 'IF' Then 'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @Type='TR'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @tr_parent_xtype='V'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2='CREATE TRIGGER <A href="mailto:'+@objectname+'">'+@objectname+'</A> ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2='CREATE TRIGGER <A href="mailto:'+@objectname+'">'+@objectname+'</A> ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If @Type='V'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2='CREATE VIEW <A href="mailto:'+@objectname+'">'+@objectname+'</A> WITH ENCRYPTION AS SELECT 1 as f'" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @q=4000-Len(@OrigSpText2)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2=@OrigSpText2+Replicate('-',@q)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @OrigSpText2=Replicate('-', 4000)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMyProcedure = lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @i=1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @resultsp = Replicate(N'A', (datalength(@OrigSpText1) / 2))" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; While @i&lt;=datalength(@OrigSpText1)/2" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Begin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @resultsp = Stuff(@resultsp, @i, 1," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NCHAR(UNICODE(Substring(@OrigSpText1, @i, 1)) ^" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (UNICODE(Substring(@OrigSpText2, @i, 1)) ^" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNICODE(Substring(@OrigSpText3, @i, 1)))))" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @i=@i+1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @orgvarbin=cast(@OrigSpText1 As varbinary(8000))" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @resultsp=(" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When @Encrypted=1 Then @resultsp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else convert(nvarchar(4000)," ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; When @Status&amp;2=2 Then uncompress(@orgvarbin)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else @orgvarbin" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print @resultsp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @ptrval = TEXTPTR(ProcCode) from #result" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @prvlen = DATALENGTH(ProcCode) from #result" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATETEXT #result.ProcCode @ptrval @prvlen 0 @resultsp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcMyProcedure = m.lcMyProcedure ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set @N=@N+1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp;&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; Set @k=@k+1" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp;&nbsp; End" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Select * from #result" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Drop Table #temp" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Drop Table #result" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " Rollback Tran" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " End"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, "if exists (select * from dbo.sysobjects" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " where id = object_id(N'[dbo].[" + m.lcTmpCursor + "]')" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " and OBJECTPROPERTY(id, N'IsProcedure') = 1)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " drop procedure [dbo].[" + m.lcTmpCursor + "]")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, m.lcMyProcedure )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, "Exec " + m.lcTmpCursor + " ?tcObjectName", m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, "if exists (select * from dbo.sysobjects" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " where id = object_id(N'[dbo].[" + m.lcTmpCursor + "]')" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " and OBJECTPROPERTY(id, N'IsProcedure') = 1)" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ " drop procedure [dbo].[" + m.lcTmpCursor + "]")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = Alltrim(ProcCode)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return m.lcReturn<BR>Endfunc </P>
<P>*-----------------------------------------------<BR>* 函数: 获取SQL Server表脚本(创建、触发器、索引、约束)<BR>* 设计: 红雨<BR>* 时间: 2005.04.01<BR>*-----------------------------------------------<BR>Function GetTableCode( tnSqlHandle, tcDataBase, tcObjectName )<BR>&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp; #Define CR Chr(13)+Chr(10)<BR>&nbsp;&nbsp;&nbsp; Local lcReturn, lcTmpCursor, lcMyProcedure<BR>&nbsp;&nbsp;&nbsp; m.lcReturn = []<BR>&nbsp;&nbsp;&nbsp; m.lcTmpCursor = [T]+Sys(2015)<BR>&nbsp;&nbsp;&nbsp; m.lcDataBase = Iif(Type([m.tcDataBase])=[C] And !Empty(m.tcDataBase), m.tcDataBase, [Master])<BR>&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp; If Type([m.tnSqlHandle])=[N] And m.tnSqlHandle&gt;0 And Type([tcObjectName])=[C]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, [use ] + m.lcDataBase )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 建立表的脚本<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLExec(m.tnSqlhandle,[EXEC sp_MShelpcolumns N'] + m.tcObjectName + [', 512, @orderby = 'id'] , m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [--- 建立表的脚本] + CR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [If Exists (Select * From dbo.SysObjects Where id = object_id(N']+m.tcObjectName+[')] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ and OBJECTPROPERTY(id, N'IsTable') = 1)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [&nbsp; Drop table ] + m.tcObjectName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [GO]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [Create Table ] + m.tcObjectName + [(]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Local lTextImage<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lTextImage = .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scan<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lTextImage = m.lTextImage Or Inlist(Upper(Alltrim(Col_TypeName)),[TEXT],[NTEXT],[IMAGE])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + "&nbsp; [" + Alltrim(Col_Name) + "] ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "[" + Alltrim(Col_TypeName) + "]" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Iif(Col_Flags=0, [], " (" + Iif(Isnull(Col_Prec),Alltrim(Str(Col_Len)),Alltrim(Str(Col_Prec))) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp; Iif(Isnull(Col_Scale), [], [, ] + Alltrim(Str(Col_Scale))) + ")" ) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Iif(Isnull(Collation),[],[ Collate ] + Alltrim(Collation)) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Iif(Col_Identity,[ Identity (1, 1)],[]) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Iif(Col_Null, [ Null] ,[ Not Null]) + [,]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endscan<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = Left(m.lcReturn,Len(m.lcReturn)-1) + CR + ") ON [PRIMARY]"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + Iif(m.lTextImage," TEXTIMAGE_ON [PRIMARY]",[]) + CR + [GO] + CR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 表的索引脚本<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = SQLExec(m.tnSqlhandle,[EXEC sp_MShelpindex N'] + m.tcObjectName +[' , NULL, 1] , m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor) And Reccount(m.lcTmpCursor) &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Local cFieldName, nIndex<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [--- 表的索引脚本] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ [Create] + Iif(.F.,[ Unique],[]) + Iif(indid=1,[ Clustered],[]) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp; Index [" +Alltrim(Name)+ "] On " + m.tcObjectName +[ (]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For m.nIndex = 1 To 16<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.cFieldName = [IndCol]+Alltrim(Str(nIndex))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Isnull(Evaluate(m.cFieldName))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + "[" + Alltrim(Evaluate(m.cFieldName)) + "]" ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Iif(Bitand(2^(nIndex-1),Descending) = 2^(nIndex-1), [ Desc,], [ ,])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endfor<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = Left(m.lcReturn,Len(m.lcReturn)-1) + ") "<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ [With] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ [&nbsp; DROP_EXISTING] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +CR+ "&nbsp; ON [PRIMARY]" + CR + [GO] + CR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 约束和触发器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Sqlexec(m.tnSqlHandle, [select Name,xType from SysObjects ] ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ where parent_obj=object_id(N']+m.tcObjectName+[') order by xType], m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Used(m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scan<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcName = Alltrim(Name)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do Case<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[TR]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- 触发器脚本: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[TF]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- 表函数: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[IF]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- 内嵌表函数: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[D]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- 默认值或 DEFAULT 约束: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ALTER TABLE ] + m.tcObjectName + [ WITH NOCHECK ADD] + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&nbsp; CONSTRAINT [" + lcName + "] DEFAULT " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName ) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " FOR [" + Getwordnum(lcName,3,[_]) + "]"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[C]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- CHECK 约束: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ALTER TABLE ] + m.tcObjectName + [ WITH NOCHECK ADD] + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&nbsp; CONSTRAINT [" + lcName + "] CHECK " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[F]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- FOREIGN KEY 约束: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ALTER TABLE ] + m.tcObjectName + [ WITH NOCHECK ADD] + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&nbsp; CONSTRAINT [" + lcName + "] FOREIGN KEY " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[PK]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- PRIMARY KEY 约束: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ALTER TABLE ] + m.tcObjectName + [ ADD] + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&nbsp; CONSTRAINT [" + lcName + "] PRIMARY KEY " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case Upper(Alltrim(xType))=[UQ]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + [--- UNIQUE 约束: ] + lcName + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + [ALTER TABLE ] + m.tcObjectName + [ ADD] + CR ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "&nbsp; CONSTRAINT [" + lcName + "] UNIQUE " ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + GetProcedreCode( m.tnSqlHandle, m.lcDataBase, lcName )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Otherwise<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endcase<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.lcReturn = m.lcReturn + CR + [GO] + CR<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endscan<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use In (m.lcTmpCursor)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *-----------------------------------------------<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Return m.lcReturn<BR>Endfunc </P>
<P>*----------------------------------------------- <BR></P>]]></description>
</item><item>
<title><![CDATA[VFP读取MP3信息资料]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=doubworm&amp;id=31381</link>
<author>doubworm</author>
<pubDate>2008/1/19 2:01:41</pubDate>
<description><![CDATA[<P>*---------------------------------------------------------------------<BR>* 程序: 读取 MP3 信息资料<BR>* 设计: 红雨<BR>* 调用示例<BR>*---------------------------------------------------------------------<BR>Clear<BR>Local lcMP3File, laMP3Info(5)<BR>Store [] To laMP3Info<BR>lcMP3File = [Z:\MPSong\阿杜\离别.mp3]<BR>If GetMP3Info( lcMP3File, @laMP3Info )<BR>&nbsp;&nbsp;&nbsp; ? [文件: ] + lcMP3File<BR>&nbsp;&nbsp;&nbsp; ? [歌曲: ] + laMP3Info(1)<BR>&nbsp;&nbsp;&nbsp; ? [歌手: ] + laMP3Info(2)<BR>&nbsp;&nbsp;&nbsp; ? [歌集: ] + laMP3Info(3)<BR>&nbsp;&nbsp;&nbsp; ? [年份: ] + laMP3Info(4)<BR>&nbsp;&nbsp;&nbsp; ? [备注: ] + laMP3Info(5)<BR>Else<BR>&nbsp;&nbsp;&nbsp; = MessageBox( [该文件没有包含媒体信息！] )<BR>Endif </P>
<P>Local lcRetuStr, lnMicLength<BR>lcRetuStr = SendMciString( [Open ]+lcMP3File+[ Alias MICTEMP] )<BR>If Left(lcRetuStr,5)=[错误:]<BR>&nbsp;&nbsp;&nbsp; = MessageBox(lcRetuStr, 0+16+0, [打开媒体文件错误])<BR>Else<BR>&nbsp;&nbsp;&nbsp; = SendMciString( [Set MICTEMP Time Format MilliSeconds])&nbsp;&nbsp;&nbsp; &amp;&amp; 设置时间格式<BR>&nbsp;&nbsp;&nbsp; lnMicLength = Val(SendMciString( [Status MICTEMP Length] )) &amp;&amp; 取媒体长度<BR>&nbsp;&nbsp;&nbsp; = SendMciString( [Close MICTEMP] )<BR>&nbsp;&nbsp;&nbsp; ? [时间: ] + allt(str(lnMicLength))+[ 毫秒]<BR>Endif<BR>Return </P>
<P>*---------------------------------------------------------------------<BR>* 程序: 读取 MP3 信息资料<BR>* 设计: 红雨<BR>*---------------------------------------------------------------------<BR>Function GetMP3Info ( tcMP3File, taMP3Info )<BR>&nbsp;&nbsp;&nbsp; External Array taMP3Info<BR>&nbsp;&nbsp;&nbsp; tcMP3File = iif(Type([tcMP3File])=[C], tcMP3File, [])<BR>&nbsp;&nbsp;&nbsp; If Type([aLen(taMP3Info,1)])#[N]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dime taMP3Info(5)<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If aLen(taMP3Info,1)#5<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dime taMP3Info(5)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; If File(tcMP3File)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Local lcMP3Str, lnFHand<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnFHand = FOPEN( tcMP3File )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If lnFHand &gt; 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = FSEEK( lnFHand, -128, 2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMP3Str = FREAD( lnFHand, 127 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = FCLOSE( lnFHand )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If uppe(subs(lcMP3Str,1,3)) = [TAG]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lcMP3Str = subs(lcMP3Str,4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(1) = allt(subs(lcMP3Str, 1,30))+chr(0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(1) = allt( left(taMP3Info(1),at(chr(0),taMP3Info(1))-1) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(2) = allt(subs(lcMP3Str,31,30))+chr(0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(2) = allt( left(taMP3Info(2),at(chr(0),taMP3Info(2))-1) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(3) = allt(subs(lcMP3Str,61,30))+chr(0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(3) = allt( left(taMP3Info(3),at(chr(0),taMP3Info(3))-1) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(4) = allt(subs(lcMP3Str,91, 4))+chr(0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(4) = allt( left(taMP3Info(4),at(chr(0),taMP3Info(4))-1) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(5) = allt(subs(lcMP3Str,95,30))+chr(0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taMP3Info(5) = allt( left(taMP3Info(5),at(chr(0),taMP3Info(5))-1) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .T.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Endif<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return .F.<BR>&nbsp;&nbsp;&nbsp; Endif<BR>Endfunc </P>
<P>Function SendMciString( tcMCIcmd )<BR>&nbsp;&nbsp;&nbsp; Declare integer mciSendString in WINMM String, String, integer,integer<BR>&nbsp;&nbsp;&nbsp; Declare integer mciGetErrorString in WINMM integer, String, integer<BR>&nbsp;&nbsp;&nbsp; lcRetStr = Space( 80)<BR>&nbsp;&nbsp;&nbsp; lcErrStr = Space(256)<BR>&nbsp;&nbsp;&nbsp; lnRetVal = mciSendString( tcMCIcmd, @lcRetStr, Len(lcRetStr), 0 )<BR>&nbsp;&nbsp;&nbsp; If lnRetVal=0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Retu Trim(Strtran(lcRetStr,chr(0),""))<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mciGetErrorString(lnRetVal,@lcErrStr,Len(lcErrStr))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Retu [错误: ]+Trim(Chrtran(lcErrStr,chr(0),""))<BR>&nbsp;&nbsp;&nbsp; Endif<BR>Endfunc<BR><A></A></P>]]></description>
</item>
</channel>
</rss>