2008年12月01日

关于MDAC错误,造成DELPHI中ADO组件不能正常使用的解决方法。报错为:

Error creating object. Please verify that the Microsoft Data Access Components 2.1 (or later) have been properly installedError creating object. Please verify that the Microsoft Data Access Components 2.1 (or later) have been properly installed

解决办法
1、点击“开始”,运行CMD。
2、依次执行如下命令:
    regsvr32 "C:\Program Files\Common Files\System\ado\msado15.dll"
    regsvr32 "C:\Program Files\Common Files\System\ado\msador15.dll"
    regsvr32 "C:\Program Files\Common Files\System\ado\msadox.dll"
    regsvr32 "C:\Program Files\Common Files\System\ado\msadomd.dll"
3、故障排除

2008年05月28日
  1.   uses mshtml, ActiveX,ComObj;   
  2.      
  3.   procedure TForm1.Button1Click(Sender: TObject);   
  4.   var  
  5.     v: Variant;   
  6.     HTMLDocument: IHTMLDocument2;   
  7.   begin  
  8.     WebBrowser1.Navigate(‘about:blank’);   
  9.     HTMLDocument := WebBrowser1.Document as IHTMLDocument2;   
  10.     v := VarArrayCreate([0], varVariant);   
  11.     v[] := ‘<HTML><h1>Test</h1><br/>aaaaaa</html>’// Here’s your HTML string   
  12.     HTMLDocument.Write(PSafeArray(TVarData(v).VArray));   
  13.     HTMLDocument.Close;   
  14.   end  
2008年05月18日

1,指针的定义,DELPHI和C++中的定义基本类似,除了表示表示符号不一样以外,基本上没有什么区别。而且DELPHI可以用一个=进行指针类型的定义,而在C++中要通过typedef进行自定义类型进行定义:

    如:

var

        PTPerson=^TPerson

       TPerson=class

                Age:integer;

               Sex:integer;

end;

 C++

typedef    (*Person)  PPerson 

2,DELPHI中没有向C++中的->运算符可以通过针针使用指针所指向对象的属性,必须通过建立一个对像先把对象中如:

C++中

PPerson->Sex;

DELPHI中

var

    cperson:TPerson;

 begin

    cperson:=PTPerson^;

     cperson.age:=0;

  

2008年05月16日

var
i: LongInt;
f: Double;
begin
if TryStrToInt(Edit1.Text,i) or TryStrToFloat(Edit1.Text, f) then
ShowMessage(‘是数字’)
else
ShowMessage(‘不是数字’);
end;

2008年05月02日

知道从什么开始,自己越发的喜欢收听网络广播。

 就静静地坐在电脑前,默默的听着从音箱里流露出的各种声音,静静流畅的音乐,各类的广告,再有就是主持人或畅快或深情的语言。慢慢地,自己习惯了那种默默的倾听。在忙碌的上午,打开一些搞笑幽默的频道,在工作中任主持人在音箱里畅聊;在深夜,关掉屋子里的最后一丝灯光,静静对着显示器,偶而从镜子里看到在显示器在灯光下稍稍苍白的面庞,然后继续听着主持人的真情诉说,漫无目的地浏览一页页无关的文字。

记得自己第一次收听网络广播,其实不能称之为广播,而是已经成行被网友转到网上的录音–是一篇关于70年代成长历程的节目。自己平时是很少一个被感动的人,但在听这个节目的时候,自己却一直被深深地触动着。之后自己把保存在自己的硬盘上,每次闲暇之余,静静地听一下,就感到一股莫名的温馨。后来因为硬盘问题使自己丢失了很多的数据,这个节目也在其中。自己一直发狂般地在网络上查找这个节目,可惜一直如同大海捞针,这可能成了自己最大的一份遗憾。

从那以后,自己开始越发地喜欢这种声音。

在北漂在线上,曾经开过一北漂电台的栏目。因为自己的电脑,自己开始收藏每期的节目。每次听着节目里熟悉或陌生的声音,自己总会露出一种莫名的微笑。后来这个节目无果而终,这与成为一份小小的遗憾。

自己也说不好,喜欢倾听对自己意味着什么样的变化。只是觉得–这样的感觉真好。

2008年04月28日
                                               作者:曹京

                                               日期:2006年7月17日
                                         

一、综述
    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个
字节便是“RIFF”。
    WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE
Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:

————————————————
|             RIFF WAVE Chunk                  |
|             ID  = ‘RIFF’                     |
|             RiffType = ‘WAVE’                |
————————————————
|             Format Chunk                     |
|             ID = ‘fmt ‘                      |
————————————————
|             Fact Chunk(optional)             |
|             ID = ‘fact’                      |
————————————————
|             Data Chunk                       |
|             ID = ‘data’                      |
————————————————
            图1   Wav格式包含Chunk示例

    其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位
于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节
表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。
PS:
    所有数值表示均为低字节表示低位,高字节表示高位。

二、具体介绍
RIFF WAVE Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   ‘RIFF’    |
    ———————————-
    | Size  |  4 Bytes |             |
    ———————————-
    | Type  |  4 Bytes |   ‘WAVE’    |
    ———————————-
            图2  RIFF WAVE Chunk

    以’FIFF’作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID
和Size所占用的字节数,即FileLen – 8 = Size。然后是Type字段,为’WAVE’,表
示是wav文件。
    结构定义如下:
 struct RIFF_HEADER
 {
  char szRiffID[4];  // ‘R’,'I’,'F’,'F’
  DWORD dwRiffSize;
  char szRiffFormat[4]; // ‘W’,'A’,'V’,'E’
 };

 

Format Chunk
    ====================================================================
    |               |   字节数  |              具体内容                |
    ====================================================================
    | ID            |  4 Bytes  |   ‘fmt ‘                             |
    ——————————————————————–
    | Size          |  4 Bytes  | 数值为16或18,18则最后又附加信息     |
    ——————————————————————–  —-
    | FormatTag     |  2 Bytes  | 编码方式,一般为0×0001               |     |
    ——————————————————————–     |
    | Channels      |  2 Bytes  | 声道数目,1–单声道;2–双声道       |     |
    ——————————————————————–     |
    | SamplesPerSec |  4 Bytes  | 采样频率                             |     |
    ——————————————————————–     |
    | AvgBytesPerSec|  4 Bytes  | 每秒所需字节数                       |     |===> WAVE_FORMAT
    ——————————————————————–     |
    | BlockAlign    |  2 Bytes  | 数据块对齐单位(每个采样需要的字节数) |     |
    ——————————————————————–     |
    | BitsPerSample |  2 Bytes  | 每个采样需要的bit数                  |     |
    ——————————————————————–     |
    |               |  2 Bytes  | 附加信息(可选,通过Size来判断有无) |     |
    ——————————————————————–  —-
                            图3  Format Chunk

    以’fmt ‘作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
    结构定义如下:
 struct WAVE_FORMAT
 {
  WORD wFormatTag;
  WORD wChannels;
  DWORD dwSamplesPerSec;
  DWORD dwAvgBytesPerSec;
  WORD wBlockAlign;
  WORD wBitsPerSample;
 };
 struct FMT_BLOCK
 {
  char  szFmtID[4]; // ‘f’,'m’,'t’,’ ‘
  DWORD  dwFmtSize;
  WAVE_FORMAT wavFormat;
 };

Fact Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   ‘fact’    |
    ———————————-
    | Size  |  4 Bytes |   数值为4   |
    ———————————-
    | data  |  4 Bytes |             |
    ———————————-
            图4  Fact Chunk

    Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
    结构定义如下:
 struct FACT_BLOCK
 {
  char  szFactID[4]; // ‘f’,'a’,'c’,'t’
  DWORD  dwFactSize;
 };

 

Data Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   ‘data’    |
    ———————————-
    | Size  |  4 Bytes |             |
    ———————————-
    | data  |          |             |
    ———————————-
             图5 Data Chunk

    Data Chunk是真正保存wav数据的地方,以’data’作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,
wav数据的bit位置可以分成以下几种形式:
    ———————————————————————
    |   单声道  |    取样1    |    取样2    |    取样3    |    取样4    |
    |           |——————————————————–
    |  8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |
    ———————————————————————
    |   双声道  |          取样1            |           取样2           |
    |           |——————————————————–
    |  8bit量化 |  声道0(左)  |  声道1(右)  |  声道0(左)  |  声道1(右)  |
    ———————————————————————
    |           |          取样1            |           取样2           |
    |   单声道  |——————————————————–
    | 16bit量化 |    声道0    |  声道0      |    声道0    |  声道0      |
    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
    ———————————————————————
    |           |                         取样1                         |
    |   双声道  |——————————————————–
    | 16bit量化 |  声道0(左)  |  声道0(左)  |  声道1(右)  |  声道1(右)  |
    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
    ———————————————————————
                         图6 wav数据bit位置安排方式

    Data Chunk头结构定义如下:
    struct DATA_BLOCK
 {
  char szDataID[4]; // ‘d’,'a’,'t’,'a’
  DWORD dwDataSize;
 };

三、小结
    因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

2008年04月20日

  删除昨天的烦恼;选择今天的快乐;设置明天的幸福;存储永远的爱心;粘贴美丽的心情;复制醉人的风采。

 

    在网上四处游荡的时候,突然看到网友的这样一句话,加上最近的心情,不免若有所感。现在自己的心情也不是烦恼能说的清的。昨天的烦恼已经随着消逝的自我一起烟消云散了。这类的话自己在网上见到许多,一直不能为所动,不知今天为什么,自己心里特别有感觉。

    想起一个故事,情节大致是这样:两个商人和一个和尚同做一艘小船,看到船上的帆随风而动是,一个人是说帆在动;别一个人却说是风在动,正在这时,和尚却说了一句,既非帆动,亦非心动,而是心动。这是一个中学政治课上作为唯心主义的一个反面教材。不知为什么,自己现在却感觉得到自己的心变了。

 

    说不上来让自己有感觉的,是这句话,还是自己的心?

 

    ???

2008年03月07日

    很久以来,自己就想写一些文字了。
­
    每当自己独步于属于自己的那个方寸世界的时候,总感觉有好多话要说。烦闷让自己几乎感到无法呼吸。可是每当自己打开自己的博客的时候,却发现自己的大脑中一片空白–好像被什么掏空了似的。自己穷尽所有的力量去寻找自己要写的文字,要说的话,可是自己这时候发现:这一切都不见了,甚至自己灵魂。
­
    剩下的只有自己–一付躯壳,呆呆地坐在电脑前。数落着几乎已被掏空的大脑,一种无由的恐慌和迷惘慢慢涌变全身,浸入到自己身体的每一个角落。望着天桥下来来往往的车辆,公路两边的路灯沿着路的起伏形成了一道优美的曲线,不断向深入沿伸。各种灯光的交相辉下,静静的夜空已经难得见到星光。只有偶尔有几黯淡的星,稀稀疏疏地散落在天空中。
­
    脑海中突然想起了童年,想起了童年村外夜空里满天的繁星,想了了郑智化的那首《星星点灯》。如今,这一切却慢慢地渐行渐远。
­
    自己如何才找回自己的灵魂,找回那些被掏空了的东西。
­
    星星点灯照亮我的家门
    让迷失的孩子找到来时的路
    星星点灯照亮我的前程
    用一点光温暖孩子的心
­
                     —–郑智化<星星点灯>

2008年01月03日

*     程序………..:   Copy2xls.prg  
*     作者…………:   Daniel   Gramunt  
*     项目………..:   common  
*     创建………..:   11.10.2000     17:25:06  
*)   说明…….:   替换   VFP   自己的   COPY   TO   TYPE   XL5   命令.  
*)                                       :   Excel   5   和   Excel   95   有一个限制就是一张工作表只能有   16,383   行.  
*)                                       :   该限制在   Excel   97   和   Excel   2000   是   65,536   行.  
*)                                       :   由于没有   TYPE   XL8   命令,   VFP   只能复制最初的   16,383   条记录.  
*)                                       :  
*)                                       :   该程序处理该限制并允许复制用户机器上的   Excel   版本所支持的记录数.  
*)                                       :  
*)                                       :   该方案是非常简单的:  
*)                                       :     1.   COPY   TO   TYPE   CSV  
*)                                       :     2.   打开   CSV   文件并用   Automation   来   SaveAs(tcExcelFile)  
*)                                       :  
*)                                       :   假定   MS   Excel   (Excel   97   或以上)   安装在用户的机器上  
*)                                       :     (好,   它将也可处理   Excel   5.0   和   95,   但将使用   16,383   的限制).  
*)                                       :  
*)                                       :   返回成功导出的记录数,   否则:  
*)                                       :       -1   =   缺少参数或参数类型错误  
*)                                       :       -2   =   当前工作区中未打开表  
*)                                       :       -3   =   记录数超过最大   Excel   行数  
*)                                       :       -4   =   用户不想复盖已存在的   Excel   文件   (SET   SAFETY   =   ON)  
*)                                       :  
*)                                       :   性能注意:   在   VFP   中的   COPY   TO   命令比起任何   automation   都要快得多.  
*)                                       :                       但是,   由于我们只用来打开导出的文件并保存为不同格式,   几乎没有  
*)                                       :                       性能损失.  
*)                                       :  
*)                                       :  
*     调用示例….:   Copy2Xls("c:\temp\bidon.xls")  
*     参数列表….:   tcExcelFile   –   要创建的   Excel   文件的路径\文件名.  
*     主要修改….:   26.10.2000:   COPY   TO   FOX2X   和   SaveAs()   代替  
*                                         :                           "组合"   个别的   Excel   文件.  
*                                         :                           谢谢   UT   的   莈tin   Bas鰖   的意见  
*                                         :   12.04.2000:   COPY   TO   CSV   代替   FOX2X.  
*                                         :                           FOX2X   有以下限制:  
*                                         :                           –   代码页   850   的问题   (如字符   "?)  
*                                         :                           –   不支持长文件名   (虽然很容易处理)  
*                                         :                           –   不支持   datetime  
*                                         :                           CSV   没有上述问题,   但有其它限制:  
*                                         :                           –   逻辑字段转换为   F/T   而不是   FALSE/TRUE.  
*                                         :                               这不是一个问题,   但为了保持一致性,   我们  
*                                         :                               对于记录数没有超过限制的表,  
*                                         :                               不再使用   VFP   自己的   COPY   TO   TYPE   XL5.  
*                                         :                           –   如果一个字符字段只包括数值且值中包括前导的零,  
*                                         :                               Excel   转换它为数值型的值   (如   "00000100"   =>   100).  
*                                         :                               这是一个问题,   特别是字段是一个专用关键字且你又要在稍后从  
*                                         :                               Excel   文件转换回   VFP   时.  
*————————————————————————————————–  
LPARAMETER   tcExcelFile  
 
#INCLUDE   FoxPro.h  
 
#DEFINE   xlWorkbookNormal             -4143           &&   被   SaveAs()   用来保存于当前   Excel   版本  
#DEFINE   ccErrorNoParameter         "Parameter     :   参数丢失失或类型错误   (非   ‘C’)"  
#DEFINE   ccErrorNoTableOpen         "当前工作区中没有打开表"  
#DEFINE   ccErrorToManyRows           "记录数"   +   ;  
                                                            ALLTRIM(TRANSFORM(lnRecords,   "999,999,999"))   +;  
                                                            ")   超过   Excel   最大行数   ("   -;  
                                                            ALLTRIM(TRANSFORM(lnXlsMaxNumberOfRows,   "999,999,999"))+;  
                                                            ")"  
 
*–   检查参数  
IF   VARTYPE(tcExcelFile)   <>   "C"   OR   EMPTY(tcExcelFile)  
        ??CHR(7)  
        WAIT   WINDOW   NOWAIT   ccErrorNoParameter  
        RETURN   -1  
ELSE  
        tcExcelFile   =   ForceExt(tcExcelFile,   "XLS")  
ENDIF  
 
*–   确信在选定的工作区中打开了表或游标  
IF   EMPTY(ALIAS())  
        ??CHR(7)  
        WAIT   WINDOW   NOWAIT   ccErrorNoTableOpen  
        RETURN   -2  
ENDIF  
 
LOCAL   loXls,   lnXlsMaxNumberOfRows,   lnRecords,   lnRetVal,   lcTempDbfFile  
 
loXls   =   CREATEOBJECT("excel.application")  
*–   抑制   Excel   的警告和信息   (类似于   SET   SAFETY   OFF)  
loXls.DisplayAlerts   =   .f.  
*–   从   Excel   获取最大行数.   在我们计算工作表中的行数前,   需要添加一个工作簿.  
loXls.workbooks.add()  
lnXlsMaxNumberOfRows   =   loXls.ActiveWorkBook.ActiveSheet.Rows.Count   –   1   &&   1   头行  
 
lnRecords   =   RECCOUNT()  
 
*–   检查记录数是否超过了   Excel   的限制  
IF   lnRecords   >   lnXlsMaxNumberOfRows  
        ??CHR(7)  
        WAIT   WINDOW   NOWAIT   ccErrorToManyRows  
        *–   关闭   Excel  
        loXls.application.quit()  
        RETURN   -3  
ENDIF  
 
*–   维持   SET   SAFETY  
IF   SET("SAFETY")   =   "ON"   AND   FILE(tcExcelFile)  
        IF   MESSAGEBOX(tcExcelFile   +   "   已经存在,   复盖它?",;  
                                    MB_YESNO   +   MB_ICONQUESTION   +   MB_DEFBUTTON2)   =   IDNO  
                *–   用户选择了     因此退出  
                *–   关闭   Excel  
                loXls.application.quit()  
                RETURN   -4  
        ENDIF  
ENDIF  
 
lcTempDbfFile   =   AddBs(SYS(2023))   +   SYS(3)   +   ".CSV"  
 
COPY   TO   (lcTempDbfFile)   TYPE   CSV  
lnRetVal   =   _TALLY  
 
*–   打开导出的   CSV   文件  
loXls.Application.Workbooks.Open(lcTempDbfFile)  
 
*–   保存为   Excel   文件  
loXls.ActiveSheet.saveAs(tcExcelFile,   xlWorkbookNormal)  
 
*–   删除   CSV   文件  
IF   FILE(lcTempDbfFile)  
        DELETE   FILE   (lcTempDbfFile)  
ENDIF  
 
*–   关闭   Excel  
loXls.application.quit()  
 
RETURN   lnRetVal  

2007年12月05日

 

在发布一个 Visual FoxPro 9.0 开发的可执行程序(.exe)文件时,你需要考虑发布下面的文件:
①.VFPV9R.dll/VFPV9T.dll
VFPV9R.dll 文件是单线程运行库,而 VFPV9T.dll 文件是多线程运行库。如果你用 Visual
FoxPro 开发的是一个服务程序或是.dll 文件,必须同时发布 VFPV9T.dll 文件。
②.VFP9Rchs.dll/VFPV9Rcht.dll
VFPV9Rchs.dll 是简体中文运行库,VFPV9Rcht.dll 是繁体中文运行库。根据运行环境的不同,这两个文件只需要发布一个。
③.GDIPlus.dll
这个文件需要发布。从 Visual FoxPro 8.0 开始,Visual FoxPro 支持 GDI+ 了。因此 Visual FoxPro 的 Image 控件具有了 RotateFlipproperty 属性,你可通过此属性来旋转、反转和翻转图片。
支持的文件格式如下:
.ani、.bmp、.cur、.dib、.emf、.exif、.gif/.gif 动画/.gfa、.ico、.jpg/.jpeg/.jpe/.jfif、.png、.tif/.tiff、.wmf 文件
注意:
在 Visual FoxPro 中,指针、动画指针和图标文件等均可被当作普通图形文件使用。例如,你可为 Image 控件的 Picture 属性指定一个动画指针文件,只不过 Image 控件显示的是静态的指针图像罢了。
④.MSVCR71.dll
Visual C++ 运行库,这是必须发布的一个文件。
⑤.Visual FoxPro 9.0 自带的 ActiveX 控件
下面这些 ActiveX 控件(.ocx 文件) 是在安装 Visual FoxPro 9.0 时默认安装的,它们可随你的应用程序一起自由发布。ActiveX 控件是在使用 Visual FoxPro OLE 容器控件时被添加到表单的。你在开发软件时不一定都会用到。因此,只需将用到的.ocx 文件和你的程序一起发布即可。这些控件的帮助文件在 MSDN 中提供。
MSCOMCtl.ocx 包括: ImageCombo、ImageList、ListView、ProgressBar、Slider、StatusBar、TabStrip、Toolbar 和 TreeView 控件 ( 注意:在 7.0 及以前的版本中该文件的名字是 Comctl32.ocx )
MSCOMCt2.ocx 包括: Animation、DateTimePicker、FlatScrollBar、MonthView 和 UpDown 控件
MCI32.ocx 包括: Multimedia MCI 控件
MSChrt20.ocx 包括: MsChart 控件
MSCOMM32.ocx 包括: MSComm 控件
MSInet.ocx 包括: Microsoft Internet Transfer 控件
MSMapi32.ocx 包括: MAPIMessages 和 MAPISession 控件
MSMask32.ocx 包括: Masked Edit 控件
MSWinsck.ocx 包括: Winsock 控件
Picclp32.ocx 包括: PictureClip 控件
Richtx32.ocx 包括: RichTextBox 控件
Sysinfo.ocx 包括: SysInfo 控件
⑥.VfpOleDB.dll
这个文件是其它程序设计语言及应用程序中访问 Visual FoxPro 数据库和表的 OLE DB 接口,一般用不到。
⑦.vfpodbc.dll
vfpodbc.dll 文件是 ODBC(数据库链接) 驱动程序,需要你就发布。
⑧.你在开发时用到的其它第三方控件