将DELPHI代码变为BCB代码

合集下载

用Delphi进行数据库之间转换

用Delphi进行数据库之间转换

用Delphi进行数据库之间转换在实际应用中,可能会遇到将一种数据库转为另一种数据库的情况,而Delphi可以完成这种功能。

尤其是需要将以前的dbase 数据库结构及内容转换成其它数据库结构时,采用此方法简单、快速且安全。

Delphi是一种Windows应用程序开发软件。

它速度快,具有强大且容易使用的可视化开发环境,并采用了具有弹性和可重用的完整的面向对象程序语言。

由于以上的这些特点,Delphi可以让我们快速地建立起主从结构的应用程序,可产生单一可执行文件与动态链接库以及从单机、网络到主从结构的应用程序。

使用Delhpi可以方便而快速地建立强大的数据库应用程序,可以和Paradox、dbase、Lo cal InterBase Server、Foxpro及ODBC数据源等多种桌面型数据库直接配合使用。

数据库转换方法1.所使用的控件2.TBatchMove控件的使用TBatchMove允许在一组记录或是整个数据表中执行特种作业, 这个控件的主要用途在于把数据从服务器中卸到本地的数据源供分析或进行其他操作。

TBatchMove可以在目的地建立对应于原数据表内容的数据表,自动将列名及数据类型进行适当的对应操作。

TBatchMove两个特性指明批量移动(Batch Move)操作的源表及目的表。

Source指定一个对应于已有的源数据表的数据集(一个Tquery或Ttable控件),Destination指明对应于一个数据库数据表的Ttable控件,目的数据表可以是已经存在的也可以是不存在的。

Mode特性指明TBatchMove对象所要做的事情:我们可以根据batCopy模式,对数据库类型进行适当的转换,以下是从dBASE类型到其它类型之间的转换结果:数据库转换举例现有用Foxbase开发的财务程序中的会计科目数据库(kjkmk.dbf),系统将升级到Window s环境下开发,数据库将采用Paradox语言。

经典 BCB编程实例及基础讲解

经典 BCB编程实例及基础讲解
C++ Builder的主要特点
C++Builder(以后简称CBuilder)是Borland公司在Delphi成功的基础上开发的可视化C++编程工具,什么?等等!也许有的朋友会问:Borland以前不是出了一个Borland C++吗,难道CBuilder不是从BC演变而来?不错,CBuilder确实也吸取了不少BC的好东西,但CBuilder可视化编程的关键——Visual Component Library(VCL,可视化元件库)却是从Delphi搬过来的,因此CBuilder象Delphi比象BC更多一些。CBuilder面世的时间虽然不长,但几乎是以最快速度成为最流行的C++编程工具之一,由于自身的优秀品质,它受到了越来越多的程序员的喜爱,目前最新版本已经出到了5.0。
第5步选择安装类型(图1-1),所列的安装类型包括典型、简洁、自定义和完全安装四种类型。其中完全安装(Full)的内容最完整,包括CBuilderIDE、BDE(Borland数据库引擎)、数据库桌面等,典型安装(Typical)只比完全安装缺少MFC支持和微软SDK帮助文档,简洁安装(Compact)则只包括CBuilder的主程序和ITE(Internet Translate Environment)、CodeGuard等少数工具。自定义安装(Custom)是由用户选择安装内容。另外还有一个“仅配置注册信息”的选项,用于修复以前的安装信息,如果选取了该选项,则仅仅对安装过程中搜集到的信息进行注册,安装过程中不拷贝或只拷贝很少的必需文件,在第一次安装时不要选中该选项。为了能够充分体验CBuilder5的强大功能,心铃建议大家在这一步选择完全安装,大约需要388MB的硬盘空间。

Delphi汉字简繁体转换代码

Delphi汉字简繁体转换代码

Delphi汉字简繁体转换代码unit ChineseCharactersConvert;interfaceusesClasses, Windows;typeTGBBIG5Convert = class(TObject)publicclass function BIG5ToGB(BIG5Str : String): AnsiString;class function GBT oBIG5(GBStr : String): AnsiString;class function GBChs2Cht(GBStr: String): AnsiString;class function GBCht2Chs(GBStr: String): AnsiString;end;implementationclass function TGBBIG5Convert.BIG5ToGB(BIG5Str : String): AnsiString;varLen: Integer;pBIG5Char: PChar;pGBCHSChar: PChar;pGBCHTChar: PChar;pUniCodeChar: PWideChar;begin//String -> PCharpBIG5Char := PChar(BIG5Str);Len := MultiByteToWideChar(950,0,pBIG5Char,-1,nil,0);GetMem(pUniCodeChar,Len*2);ZeroMemory(pUniCodeChar,Len*2);//Big5 -> UniCodeMultiByteToWideChar(950,0,pBIG5Char,-1,pUniCodeChar,Len);Len := WideCharToMultiByte(936,0,pUniCodeChar,-1,nil,0,nil,nil);GetMem(pGBCHTChar,Len*2);GetMem(pGBCHSChar,Len*2);ZeroMemory(pGBCHTChar,Len*2);ZeroMemory(pGBCHSChar,Len*2);//UniCode->GB CHTWideCharT oMultiByte(936,0,pUniCodeChar,-1,pGBCHTChar,Len,nil,nil);//GB CHT -> GB CHSLCMapString($804,LCMAP_SIMPLIFIED_CHINESE,pGBCHTCh ar,-1,pGBCHSChar,Len);Result := String(pGBCHSChar);FreeMem(pGBCHTChar);FreeMem(pGBCHSChar);FreeMem(pUniCodeChar);end;{进行GBK简体转繁体}class function TGBBIG5Convert.GBChs2Cht(GBStr: String): AnsiString;VarLen: integer;pGBCHTChar: PChar;pGBCHSChar: PChar;BeginpGBCHSChar := PChar(GBStr);Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);GetMem(pGBCHTChar, Len * 2 + 1);ZeroMemory(pGBCHTChar, Len * 2 + 1);LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);result := String(pGBCHTChar);FreeMem(pGBCHTChar);end;{进行GBK繁体转简体}class function TGBBIG5Convert.GBCht2Chs(GBStr: String): AnsiString;VarLen: integer;pGBCHTChar: PChar;pGBCHSChar: PChar;BeginpGBCHTChar := PChar(GBStr);Len := MultiByteToWideChar(936, 0, pGBCHTChar, -1, Nil, 0);GetMem(pGBCHSChar, Len * 2 + 1);ZeroMemory(pGBCHSChar, Len * 2 + 1);LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len * 2);result := String(pGBCHSChar);FreeMem(pGBCHSChar);end;class function TGBBIG5Convert.GBT oBIG5(GBStr : String): AnsiString;varLen: Integer;pGBCHTChar: PChar;pGBCHSChar: PChar;pUniCodeChar: PWideChar;pBIG5Char: PChar;beginpGBCHSChar := PChar(GBStr);Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);GetMem(pGBCHTChar,Len*2+1);ZeroMemory(pGBCHTChar,Len*2+1);//GB CHS -> GB CHTLCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHS Char,-1,pGBCHTChar,Len*2);GetMem(pUniCodeChar,Len*2);ZeroMemory(pUniCodeChar,Len*2);//GB CHT -> UniCodeMultiByteToWideChar(936,0,pGBCHTChar,-1,pUniCodeChar,Len*2);Len := WideCharToMultiByte(950,0,pUniCodeChar,-1,nil,0,nil,nil);GetMem(pBIG5Char,Len);ZeroMemory(pBIG5Char,Len);//UniCode -> Big5WideCharT oMultiByte(950,0,pUniCodeChar,-1,pBIG5Char,Len,nil,nil);Result := String(pBIG5Char);FreeMem(pBIG5Char);FreeMem(pGBCHTChar);FreeMem(pUniCodeChar);end;end.。

在Delphi编程中使用C语言代码

在Delphi编程中使用C语言代码

在Delphi编程中使用C语言代码在Delphi编程中使用C语言代码时间:2011-5-26来源:yang 作者: peng点击: 5次在Delphi编程中使用C语言代码Windows下编程的工具有很多,例如VB,Delphi,VC等等.我在这里不想讨论"它们的具体哪个更好一点"这种幼稚的问题.玩过DOS程序设计的人都知道,DOS下很多语言的实质核心还是调用系统提供的汇编中断函数.到了Windows下,它就变成了我们常说的API了.而在Windows下写程序很多时候都是调用API,语言,只不过是一个表达工具而已.我现在已经参加工作大约有半年左右,我们公司是用Borland公司的Delphi作为主开发工具.本着未偏袒任何一个工具的立场,我说句公道话:Delphi是目前Win32下开发程序的最快速,最有效率的工具.Delphi适合用来开发应用程序,但是有时侯一些底层的东西可以直接使用C语言来开发.我在公司经常开发跟硬件相关的项目,而很多硬件的SDK包是用C来写的.这个时候我一般把它们转换成Delphi(PASCAL)语法的代码.下面谈一下我的个人粗浅经验.因为当时学校教的是Pascal 语言,所以我对C语言并不是太熟手.下面的观点或者代码如有错漏之处希望高手们放小弟一马:)一:将C语言的程序编译成DLL供Delphi调用.这种方法过于简单,而且需要额外带一个DLL文件,所以不在本文的讨论范围之内.二:直接转换C语言代码到DELPHI代码C语言的函数格式与Delphi不同,它们是函数返回类型在前,函数声明在后.对于没有任何返回类型的函数则定义为VOID类型.例如:Delphi中函数function MyFunction:(intIN:integer):Bool;相应的C语言代码就变成Bool MyFunction(int intIN);又例如procedure MyProcedure;====>void MyProcedure;采用这种方法,一般要求对C语言比较熟悉.我一般是采用这种方法.下面是我收集整理的自己常用的Delphi与C之间的类型对应表.其中左边是C类型,右边是对应的Delphi类型:ABC -> TABCACCEL -> TAccelATOM -> TAtomBITMAP -> TBitMapBITMAPCOREHEADER -> TBitmapCoreHeaderBITMAPCOREINFO -> TBitmapCoreInfoBITMAPFILEHEADER -> TBitmapFileHeaderBITMAPINFO -> TBitmapInfoBITMAPINFOHEADER -> TBitmapInfoHeaderBOOL -> BoolCBT_CREATEWND -> TCBT_CreateWndCBTACTIVATESTRUCT -> TCBTActivateStructCHAR -> CharCHAR* -> PCharCLIENTCREATESTRUCT -> TClientCreateStructCOLORREF -> TColorRefCOMPAREITEMSTRUCT -> TCompareItemStructCOMSTAT -> TComStatCREATESTRUCT -> TCreateStructCTLINFO -> TCtlInfoCTLSTYLE -> TCtlStyleCTLtype -> TCtltypeDCB -> TDCBDDEAACK -> TDDEAckDDEADVISE -> TDDEAdviseDDEDATA -> TDDEDataDDEPOKE -> TDDEPokeDEBUGHOOKINFO -> TDebugHookInfo DELETEITEMSTRUCT -> TDeleteItemStruct DEVMODE -> TDevModeDOUBLE -> DoubleDRAWITEMSTRUCT -> TDrawItemStructDWORD -> LongIntENUMLOGFONT -> TEnumLogFont EVENTMSG -> TEventMsgFARPROC -> TFarProcFIXED -> TFixedFLOAT -> SingleGLYPHMETRICS -> TGlyphMetricsHANDLE -> THandleHANDLETABLE -> THandleTable HARDWAREHOOKSTRUCT -> THardwareHookStruct HELPWININFO -> THelpWinInfoINT -> IntegerKERNINGPAIR -> TKerningPairLOGBRUSH -> TLogBrushLOGFONT -> TLogFontLOGPALETTE -> TLogPaletteLOGPEN -> TLogPenLONG -> LongIntLONG DOUBLE -> ExtendedLONG INT -> LongIntLPSTR -> PCharLPWSTR -> PWideCharMAT2 -> TMat2MDICREATESTRUCT -> TMDICreateStructMEASUREITEMSTRUCT -> TMeasureItemStructMENUITEMTEMPLATE -> TMenuItemTemplateMENUITEMTEMPLATEHEADER -> TMenuItemTemplateHeaderMETAFILEPICT -> TMetaFilePictMETAHEADER -> TMetaHeaderMETARECORD -> TMetaRecordMINMAXINFO -> TMinMaxInfoMOUSEHOOKSTRUCT -> TMouseHookStructMSG -> TMsgMULTIKEYHELP -> TMultiKeyHelpNCCALCSIZE_PARAMS -> TNCCalcSize_ParamsNEWTEXTMETRIC -> TNewTextMetricOFSTRUCT -> TOFStructOUTLINETEXTMETRIC -> TOutlineTextMetricPAINTSTRUCT -> TPaintStructPALETTEENTRY -> TPaletteEntryPANOSE -> TPanosePATTERN -> TPatternPOINTFX -> TPointFXPSTR -> PCharPWSTR -> PWideCharRASTERIZER_STATUS -> TRasterizer_StatusRGBQUAD -> TRGBQuadRGBTRIPLE -> TRGBTripleSEGINFO -> TSegInfoSHORT -> SmallIntSHORT INT -> SmallIntSIZE -> TSizeTEXTMETRIC -> TT extMetricTPOINT -> TPointTRECT -> TRectTTPOLYCURVE -> TTTPolyCurveTTPOLYGONHEADER -> TPolygonHeaderUINT -> WordUNSIGNED -> WordUNSIGNED CHAR -> ByteUNSIGNED INT -> WordUNSIGNED LONG -> LongInt(DWORD)UNSIGNED LONG INT -> LongIntUNSIGNED SHORT -> WordUNSIGNED SHORT INT -> WordVOID* -> PointerWINDOWPLACEMENT -> TWindowPlacementWINDOWPOS -> TWindowPosWNDCLASS -> TWndClassWORD -> Word三:在Delphi中直接链接C语言的OBJ文件.这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以直接把OBJ文件链接到我们的程序里面.不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下:/*文件名称:DatFormat.h*/#ifndef DatFormat_H#define DatFormat_H#include <windows.h>#pragma pack(push, 1)//这个与下面的配对,一般用到记录类型的时候需要定义,这里实际不用#ifdef __cplusplusextern "C" {#endifextern BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile);#ifdef __cplusplus}#endif#pragma pack(pop)#endif // DatFormat_H具体实现代码DatFormat.c如下:#include "DatFormat.h"BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile) /*函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式.参数:IN:FileName:欲判断的文件名称IN,OUT:IsDatFile:是否为Dat格式文件OUT:读文件失败返回FALSE,否则返回TRUE.------------------------------------作者:陈经韬.2004,01,17. ,********************/*/{HANDLE hFile;DWORD dwBytesRead;BOOL re;char MyBuf[4];*IsDatFile=FALSE;//建立读文件句柄hFile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,0);if (hFile == INVALID_HANDLE_VALUE) return FALSE;//读文件re = ReadFile(hFile,&MyBuf,4,&dwBytesRead,NULL);if (dwBytesRead!=4){CloseHandle(hFile);return FALSE;}//读文件失败的时候if (re!=TRUE){CloseHandle(hFile);return FALSE;}CloseHandle(hFile);*IsDatFile=(MyBuf[0]==‘R‘ && MyBuf[1]==‘I‘ && MyBuf[2]==‘F‘ && MyBuf[3]==‘F‘);return(TRUE);}运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.运行Delphi,新建一个工程并保存.然后把DatFormat.OBJ拷贝到它的目录之下.在单元的implementation下面添加如下代码:{$LINK ‘DatFormat.obj‘} //链接外部OBJ文件function _CheckIsDatFile(const FileName:Pchar;IsDatFile:PBool):Bool;cdecl;external;//定义函数.其中cdecl进栈方式说明采用C语言格式传递参数.external说明是个外部声明函数.注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中.C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论.请感兴趣的朋友自行参阅相关资料.然后我们写如下代码调用此函数:procedure TFrmMain.Button1Click(Sender: TObject);varIsDatFile:Bool;beginif OpenDialog1.Execute thenif _CheckIsDatFile(Pchar(OpenDialog1.FileName),@IsDatFile) thenif IsDatFile then ShowMessage(‘恭喜!该文件是一个Dat格式的视频文件!‘)else ShowMessage(‘不好意思,该文件不是一个Dat格式的视频文件!‘)else ShowMessage(‘读文件错误!‘);end;编译这个程序,将得到一个干净的可执行EXE文件了.四:C++Builder中使用Delphi单元这个实际是题外话了,不过这里还是提一提:假设我们有一个获取BIOS密码的Delphi单元unit AwardBiosPas;{====================================== =================项目: 在Delphi编程中使用C语言代码-演示程序模块: 获取BIOS密码单元描述:版本:日期: 2004-01-17作者: 陈经韬*********************,更新: 2004-01-17====================================== =================}interfaceuseswindows, SysUtils;function My_GetBiosPassword: string;implementationfunction CalcPossiblePassword(PasswordValue: WORD): string;varI: BYTE;C: CHAR;S: string[8];beginI := 0;while PasswordValue <> 0 dobeginInc(I);if $263 > PasswordValue thenbeginif $80 > PasswordValue thenS[I] := CHAR(PasswordValue)else if $B0 > PasswordValue thenS[I] := CHAR(PasswordValue and $77)else if $11D > PasswordValue thenS[I] := CHAR($30 or (PasswordValue and $0F))else if $114 > PasswordValue thenS[I] := CHAR($64 or (PasswordValue and $0F));if ‘0‘ > S[I] thenS[I] := CHAR(BYTE(S[I]) + 8);endelse if $1C2 > PasswordValue thenS[I] := CHAR($70 or (PasswordValue and $03))else if $1E4 > PasswordValue thenS[I] := CHAR($30 or (PasswordValue and $03))elsebeginS[I] := CHAR($70 or (PasswordValue and $0F));if ‘z‘ < S[I] thenS[I] := CHAR(BYTE(S[I]) - 8);end;endelseS[I] := CHAR($30 or (PasswordValue and $3));PasswordValue := (PasswordValue - BYTE(S[I])) shr 2;end;S[0] := CHAR(I);PasswordValue := I shr 1;while PasswordValue < I dobegin {this is to do because award starts calculating with the last letter}C := S[BYTE(S[0]) - I + 1];S[BYTE(S[0]) - I + 1] := S[I];S[I] := C;end;CalcPossiblePassword := S;end;function readcmos(off: byte): byte;varvalue: byte;beginasmxor ax, axmov al, offout 70h, alin al, 71hmov value, alend;readcmos := value;end;function My_GetBiosPassword: string;varsuperpw, userpw: word;beginif Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NTbeginpchar(@superpw)[0] := char(readcmos($1C));pchar(@superpw)[1] := char(readcmos($1D));pchar(@userpw)[0] := char(readcmos($64));pchar(@userpw)[1] := char(readcmos($65));Result:= (‘************BIOS密码**********************‘)+#13+‘超级用户密码为:‘ + CalcPossiblePassword(superpw) + #13 + ‘用户密码为:‘ + CalcPossiblePassword(userpw);endelseResult := ‘用户系统为NT,无法获取BIOS密码!‘;end;end.如何直接在CBC中使用它呢?新建一个CBC工程,然后把这个单元加到项目里面去.具体操作为:Add to Project--->文件类型:pascal unit(*.pas),然后Build Demo1.这个时候将在AwardBiosPas.pas的同目录下生成一个AwardBiosPas.hpp文件.把它引用到我们的需要调用的单元.然后直接调用即可:void __fastcall TFrmMain::Button1Click(TObject *Sender){ShowMessage(My_GetBiosPassword());}五:其它方法.当然可以用RES将C语言生成的二进制文件,但这个方法与第一种方法差不多.优点是不怕文件丢失.缺点是很容易被别人直接用资源修改工具打开修改.这个时候可以使用笔者写的自制编程序工具PasAnywhere.不过这已经是另外一个话题了.。

BCB自定义输入对话框

BCB自定义输入对话框

通过消息实现自定义输入框(InputBox)关键字:消息,自定义,输入对话框,InputBox作者:ccrun 更新:2005-6-24 浏览:12122C++Builder提供了两个显示输入对话框的函数:InputBox和InputQuery(其中InputBox也是通过调用InputQuery实现),这个输入对话框有很多缺点,在以前的文章中我曾提到过利用修改VCL源码来实现自定义输入对话框,后来在看到一篇文章是利用自定义消息的方法来实现,原文是Delphi代码,ccrun(老妖)用C++改写,并适当修改让显示效果更好一些:基本思路:在输入对话框显示出来以前,Post一条消息给主窗体,由主窗体负责修改输入对话框窗体的属性和输入文字编辑框的属性,在主窗体中通过重载WndProc函数来响应自定义消息。

代码及效果图如下:.h文件中:public:void __fastcall WndProc(TMessage &Msg);.cpp文件中:// 自定义一个消息,通知主窗体进行输入框的设置#define MY_INPUT_BOX WM_USER + 101//---------------------------------------------------------------------------// 重载主窗体的WndProc实现自定义消息的处理void __fastcall TfrmMain::WndProc(TMessage &Msg){if(Msg.Msg == MY_INPUT_BOX){// Msg.WParam// 0: 普通模式, 1: 密码框模式// Msg.LParam// 0: 普通模式, 1: 带图片的模式TForm *frm = Screen->Forms[0];if(frm != this) // 输入框窗体{// 将输入对话框的字体设为和主窗体一样,建议将主窗体字体设为宋体9号frm->Font->Assign(Font);// 改变OK和Cancel按钮的标题HANDLE hBtnOK = FindWindowEx(frm->Handle, NULL, "TButton", "OK");HANDLE hBtnCancel = FindWindowEx(frm->Handle, NULL, "TButton", "Cancel");if(hBtnOK)SetWindowText(hBtnOK, "确定(&O)");if(hBtnCancel)SetWindowText(hBtnCancel, "取消(&C)");// 是否需要显示一个图片if(Msg.LParam == 1){// 新增一个图片在窗体左下角,指定其Owner为输入框窗体,// 这样当输入框窗体关闭时自动释放TImage的资源TImage *img = new TImage(frm);img->Picture->Assign(Application->Icon);img->Left = 11;img->Top = 60;img->Parent = frm;img->Show();}// 是否为密码框式 // 63 63 72 75 6E 2E 63 6F 6Dif(Msg.WParam == 1){HANDLE hEdit = FindWindowEx(frm->Handle, NULL, "TEdit", NULL);if(hEdit)SendMessage(hEdit, EM_SETPASSWORDCHAR, WPARAM('*'), 0);}}}TForm::WndProc(Msg);}//---------------------------------------------------------------------------// 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。

delphi数据类型转换(转)

delphi数据类型转换(转)

delphi数据类型转换(转)不同的类有不同的成员,⼀般⼦类的成员是在⽗类的成员的后⾯增加了新的成员,如果⼦类转为⽗类,那这些新增加的成员虽然还存在,但是就不可以访问得到了。

如果⽗类转为⼦类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员。

类型的转换也有很多类的,有隐性的和显性的,⼀些专⽤的类型转换函数,会重新建⽴⼀个新类型⽬标对象,然后把就类型的数值移动过去,然后销毁旧对象。

⼀些隐性的转换,对象本⾝没改变,就把指针类型换⼀了⼀下。

@⽤于取地址!最⽅便的⽤法:在调⽤Api的时候,举个例⼦:我们调⽤Api的时候,经常要⽤到pchar类型,⽽Pchar类型的内存管理是⼀个很头疼的事情。

在使⽤时要先Getmem,最后还要freemem,如果⽤了@就⽅便了。

声明⼀个string类型的变量abc,然后在调⽤的时候使⽤@abc就可以了。

DateTimeToFileDate 函数将DELPHI的⽇期格式转换为DOS的⽇期格式DateTimeToStr 函数将⽇期时间格式转换为字符串DateTimeToString 函数将⽇期时间格式转换为字符串DateToStr 函数将⽇期格式转换为字符串FileDateToDateTime 函数将DOS的⽇期格式转换为DELPHI的⽇期格式FloatToDecimal 函数将浮点数转换为⼗进制数FloatToStrF 函数将浮点数转换为字符串FloatToStr 函数将浮点数转换为字符串FloatToText 函数将给定的浮点数转换为⼗进制数FloatToTextFmt 函数将给定的浮点数转换为⼗进制数IntToHex 将整型数转换为⼗六进制数IntToStr 将整型数转换为字符串StringToWideChar 函数将ANSI字符串转换为UNICODE字符串StrToDate 函数将字符串转换为⽇期格式StrToDateTime 函数将字符串转换为⽇期/时间格式StrToFloat 函数将给定的字符串转换为浮点数StrToInt 函数将字符串转换为整型StrToIntDef 函数将字符串转换为整型或默认值StrToTime 函数将字符串转换为时间格式TextToFloat 函数将字符串(以NULL结束的格式)转换为浮点数TimeToStr 函数将时间格式转换为字符串VarToDateTime 函数将给定的变体转换为⽇期时间WideCharLenToString 函数将ANSI字符串转换为UNICODE字符串WideCharToString 函数将UNICODE字符串转换为ANSI字符串WideCharToStrVar 函数将UNICODE字符串转换为ANSI字符串变量procedure GetMem(var P: Pointer; Size: Integer);//分配动态内存function StrPas(const Str: PChar): string;//将PChar转换为Stringdelphi数据类型转换函数计算机知识 2009-11-26 11:02 阅读100 评论0字号:⼤⼤中中⼩⼩在我们编写程序当中,根据不同情况,会使⽤到多种数据类型。

将Delphi代码变为BCB代码

将Delphi代码变为BCB代码

有时Delphi应用程序与C++Builder应用程序可能需要相互转换。

这种转换虽然费时,但并不困难(顺便说一句,进行转换时,我将Delphi与C++Builder同时运行)。

这里只介绍将Delphi变为C++Builder的过程,反过来也差别不大。

将Delphi变为C++Builder主要有两步。

第一步是将Delphi应用程序窗体复制到C++Builder项目中,第二步是修改Delphi 代码。

一般情况下这都是没有必要的,除非你想改写为C++代码。

下面详细介绍这两个步骤:首先要复制Delphi窗体到C++Builder应用程序中。

Delphi窗体与C++Builder窗体使用相同的基本格式,但至少有一大差别。

显然,窗体文件包含窗体本身和窗体上每个构件的尺寸和位置。

但窗体文件中也还包含事件信息。

具体地说,窗体文件包括窗体及其构件所建事件处理器的描述。

在Delphi窗体文件中,事件引用的事件处理器是Delphi方法,而在C++Builder窗体文件中,事件指向C++Builder事件处理器。

自然,要删除Pascal 引用才能在C++Builder中使用窗体。

你不一定要知道这些细节,但将Delphi转为C++Builder时必须考虑这个因素。

复制Delphi主窗体的步骤如下:1.打开Delphi项目并记下主窗体文件名及其Name属性。

2.切换到C++Builder中,选择主窗体,将Name属性变为与Delphi项目主窗体同名。

保存C++Builder项目,保存主窗体单元,用Delphi中窗体的同一文件名(除去.PAS扩展名)。

将项目存为与Delphi项目相同的名称。

3.切换到Windows Explorer中,将Delphi的项目目录中的主窗体窗体文件(.DFM文件)复制到C++Builder项目目录中。

一定要复制文件并不是移动文件。

Windows Explorer警告说目标目录中已经有同名文件。

单击Yes改写C++Builder目录中的窗体文件。

delphi对应c#的一些函数及类型的转换方法【原】

delphi对应c#的一些函数及类型的转换方法【原】

delphi对应c#的⼀些函数及类型的转换⽅法【原】例⼀实现⽬的:将字符串中每⼀个字符转成⼆进制(⽐如 'Data' 中的 D 转成 00100010 ,整个就是 00100010100001100010111010000110)处理逻辑:string result = StrToByte("Data"); result结果是00100010100001100010111010000110 1、实际上 D 转成⼗进制是68,68再转成⼆进制是 1000100 ,c#中我⽤ Convert.ToString(b, 2) 转了之后只有7位,不知道为什么只有7位,所以前⾯补 0 就变成了 01000100 2、将补够8位的⼆进制进⾏倒序,就得到结果:00100010 3、delphi 代码代码如下://StrToByte函数function StrToByte(Str : string):string;vari : integer;temp : string;beginfor i := 1 to Length(Str) dobegintemp := temp + CharToByte(byte(Str[i]));end;Result := Temp;end;//CharToByte函数function CharToByte(S : integer):string;vartemp : string;beginwhile true dobeginif S mod 2 = 0 thenbeginS := S div 2;temp := temp + '0';if S = 1 thenbegintemp := temp + '1';break;end;endelse beginS := S div 2;temp := temp + '1';if S = 1 thenbegintemp := temp + '1';break;end;end;end;Temp := LeftStr((Temp + '00000000'),8);Result := Temp;end;------------------------------在c#⾥⾯是这样写的:string StrToByte(string Str){string result = string.Empty;byte[] bs = Encoding.UTF8.GetBytes(Str);foreach (byte b in bs){//将b转成⼆进制string tmp = Convert.ToString(b, 2);//不够8位左边补0tmp = tmp.PadLeft(8, '0');char[] cs = tmp.ToCharArray();//将所有元素进⾏倒序Array.Reverse(cs);tmp = new string(cs);result += tmp;例⼆实现⽬的:将经算法加密过的⼆进制转成字符串,⽐如将1001101111010011 转成 sa 处理逻辑:string result=DecryptString("1001101111010011"); result结果是sa//DecryptString函数function DecryptString(Str: String): String;vari : integer;temp : string;beginfor i := 1 to length(Str) dobeginif i mod 2 = 0 thenbeginif Str[i] = '1' thenStr[i] := '0'elseStr[i] := '1';end;end;for i := 1 to length(Str) dobeginif i mod 8 = 0 thenbegintemp := temp + ByteToChar(copy(Str,i-7,8));end;end;Result := temp;end;//ByteToChar函数function ByteToChar(ByteStr : string):String;vari : integer;IntVal : extended;// extended == c#:doublebeginIntVal := 0;for i := 1 to length(ByteStr) dobeginIntVal := IntVal + powerEx(2,i-1) * strtoint(ByteStr[i]);end;Result := Chr(strtoint(FloatToStr(IntVal)));end;//PowerEx函数function PowerEx(x, y : extended) : extended;beginresult := exp(y*ln(x));end;---------------------------------------c#中代码是这样写的:string DecryptString(string Str){string result = string.Empty;char[] cs = Str.ToCharArray();for (int i = 0; i < cs.Length; i++){if ((i + 1) % 2 == 0){if (cs[i] == '1')cs[i] = '0';elsecs[i] = '1';}}Str = new string(cs);for (int j = 0; j < Str.Length; j++){if ((j + 1) % 8 == 0){result += ByteToChar(Str.Substring(j - 7, 8));}string ByteToChar(string ByteStr){double IntVal = 0;string result = string.Empty;for (int i = 0; i < ByteStr.Length; i++){IntVal += PowerEx(2, i) * Convert.ToInt32(ByteStr[i].ToString());}return Convert.ToChar(Convert.ToInt32(IntVal.ToString())).ToString();}double PowerEx(double x, double y){return Math.Exp(y * Math.Log(x, Math.E));}⼏个关键的地⽅:1、delphi的string的索引是从1开始的,所以在%运算的时候 i或j 都加了1;2、c#中string的某⼀个char⽆法直接赋值,如 DecryptString函数中的Str[i]='1',这样会报错,说⽆法对其赋值,所以需要转成char数组,再对数组元素进⾏赋值,最后再Str=new string(cs)赋回给Str;3、delphi中的ln(x)对应c#中的Math.Log(x,Math.E),exp()对应Math.Exp() ;4、delphi中的strtoint(ByteStr[i]) 开始我以为c#是Convert.ToInt32(ByteStr[i]),原来不是,这⾥要写成ByteStr[i].ToString()再convert,不然会变成该字符对应的⼗进制的值,⽽不是直接将string转成int;5、貌似不太明⽩我在讲什么?- - !其实有些我也还是不太懂,不同语⾔之间这种转换有时真的挺蛋疼的,特别是c#调⽤c++函数的时候,有时⼀个类型都有好⼏种转换⽅式,感觉delphi跟c++有些地⽅挺像的,不知道上⾯说的够不够准确,转的对不对,⽐如delphi的copy()函数,我查了下⽤法和参数之后感觉应该就是c#的SubString(),实现的效果⼀样,但是不知道还有什么实质上的不同,⽐如光这个名字copy就会不禁想⼀想,拷贝?拷贝来做啥?关于delphi转c#,c++转c#,到现在已经查了N多资料了,就当做学习笔记吧,顺便分享。

Delphi工具反编译Delphi

Delphi工具反编译Delphi

Delphi工具反编译Delphi第一节关于反向工程(About Reverse Engineering)反编译?反向?解密?(Decompilation? Reverse? Cracking?)简单的说,反编译是编译过程的反转:把一个可执行文件翻译为更高级语言。

假如你丢失了你的Delphi工程的源程序而只有可执行文件:如果源程序已不可得则反向工程(反编译)是有用的。

耶,“源程序不可得”,这是否意味着我们可以反编译别的程序员开发的Delphi工程呢?嗯,对也不对......真正的反编译可能吗?(Is true decompilation possible?)不,当然不行。

完全自动的反编译是不可能的—没有一个反编译器可以正确的重生出原始代码。

当Delphi工程被编译和连接从而产生一个独立的可执行文件,程序中使用的大部分的名称都被转换为地址。

名称的丢失意味着反编译器必须为所有的常量、变量、函数和过程创建唯一的名称。

即使在某种程度上反编译是成功的,产生的“源代码”仍缺少了原始含义的变量和函数名。

显而易见,原始编程语言的语法在可执行文件中已不存在。

所以,让反编译器对可执行文件的连续的机器语言指令进行翻译并判断出原始语言指令是非常困难的。

为什么要使用并且什么时候使用呢(Why and when to use.)反向工程因为以下几个原因而使用:丢失源码的恢复;把应用程序移入新的硬件平台;判断程序中是否存在病毒或恶意代码;当程序拥有者不能更正错误时的程序错误的更正;其它开发人员的程序源代码的恢复(如:测定一个算法)这合法吗?(Is this legal?)反向工程不是解密,尽管很难在两者之间划一个明晰的界限。

计算机程序被版权和商标法保护。

不同的国家对版权拥有者的权利有着不同的解释。

最共同的解释是,下列情况下的反编译是可以的:为了更好的解释的目的,而接口说明已不可得;为了错位更正的目的,而版权拥有者不能进行更正;为了判断程序的部分内容是否被保护。

Delphi强制类型转化和类型约定

Delphi强制类型转化和类型约定

Delphi强制类型转化和类型约定
强制类型转换时⼀种技术,通过它能够使编译器把⼀种类型的变量当做另⼀种类型。

由于Pascal有定义新类型的功能,因此编译器在调⽤⼀个函数时候对形参和实参类型匹配的检查是⾮常严格的。

因此为了能够通过编译器检查,经常需要把⼀个变量的类型转换为另⼀个变量的类型。

例如:假定要把⼀个字符类型的值赋给⼀个byte类型的变量:
var
c: char;
b: byte;
begin
c:= 'a';
b:= c; //编译器要提⽰错误
end.
在下⾯的代码中,强制类型转换把c转换成byte类型,事实上强制类型转换是告诉编译器你知道你正在做什么,并要把⼀种类型转换为另⼀种类型:
var
c: char;
b: byte;
begin
c:= 's';
b:= byte(c); //编译器不会报错
end.
注意:只有当两个类型的数据长度⼀样的时候,才能对变量进⾏强制类型转换。

例如,不能把⼀个Double强制转换为Integer。

为了能把⼀个浮点型转换为⼀个整型,要⽤Trunc()或者Round()函数。

为了把整型转换成⼀个浮点数类型的值,⽤下⾯的赋值语句:
FloatVar:= intVar;
//直接将Integer型变量赋值给Double型变量。

BCB文件操作函数大全

BCB文件操作函数大全
CreateDir()函数为创建文件夹
如:
if not DirectoryExists('c:\5') then
CreateDir('c:\5');
也可以
if not DirectoryExists('c:\5\') then
CreateDir('c:\5\');
ExtractFileDrive :返回完整文件名中的驱动器,如"C:"
参数:FileName:要处理的文件名
例:ShowMessage(ExtractShortPathName("E:\\Program Files\\Dual Wheel Mouse\\4dmain.exe"));
/*显示"E:\Progra~1\dualwh~1\4dmain.exe"*/
⑾MatchesMask()
⑻ExpandUNCFileName()
3
原型:extern PACKAGE AnsiString __fastcall ExpandUNCFileName(const AnsiString FileName);
功能:返回含有网络驱动器的文件全路径,格式为:\\机器名\共享名\文件名
参数:FileName:要处理的文件名
例:ShowMessage(MatchesMask("Lxf.exe","*.?x?)); //显示"true"
2、文件管理函数
这类函数包括设置和读取驱动器、子目录和文件的有关的各种操作,下表列出这类操作常用的函数及其
功能。
函数功能
CreateDir()创建新的子目录

Delphiordchrbyte等转换

Delphiordchrbyte等转换

Delphiordchrbyte等转换中⽂转 unicode 说⽩了就是将单个字符,例如:“⽹页”的页字⽤ Ord函数转成 10进制数字,再转为16进制数据。

就这样。

其实,⽤系统的计算器,科学型计算,也可以计算出来。

//Char 类型与其编码值的转换:varb: Byte;c: Char;beginb := Ord('A'); {返回: 65}b := Ord(#65); {返回: 65}b := Ord($41); {返回: 65}b := Ord(#$41); {返回: 65}b := Byte('A'); {返回: 65}b := Byte(#65); {返回: 65}b := Byte($41); {返回: 65}b := Byte(#$41); {返回: 65}c := Chr(65); {返回: A }c := Chr($41); {返回: A }c := Char(65); {返回: A }c := Char($41); {返回: A }end;--------------------------------------------------------------------------------//WideChar 类型与其编码值的转换; 汉字的 UniCode 编码范围是: $4E00..$9FA5varw : Word;c : WideChar;ws: WideString;s : string;begin{准备⼯作}ws := '万⼀';c := ws[1];//ShowMessage(c); {万}{从汉字到 UniCode 编码}w := Ord(c); {返回⼗进制数 : 19975}w := Word(c); {返回⼗进制数 : 19975}s := Format('%.4x',[Ord(c)]); {返回⼗六进制的字符串: 4E07 }s := IntToHex(Ord(c), 4); {返回⼗六进制的字符串: 4E07 }{从 UniCode 编码到汉字}c := #19975; {万}c := #$4E07; {万}c := #$4e07; {万}c := WideChar(19975); {万}c := WideChar($4E07); {万}end;。

Delphi的类型转换

Delphi的类型转换

Delphi的类型转换Delphi的类型转换时间:2011-5-30来源:yang 作者: peng点击: 7次Delphi是一种强类型转换的语言。

在VC中,赋值符用″=″,例如x=1;到了Delphi赋值符就变成了″:=″,例如x:=1。

从赋值时用符号″:=″而不用″=″,就隐约可见Delphi对类型匹配要求之严,即赋值符右边的类型一定要和左边一致。

用惯了VB或VC的程序员,初用Delphi,稍不留神,就会出现类型不匹配的错误。

对初学者而言,类型转换也是学习Delphi的重点和难点,为此本文特对Delphi的类型转换做一总结,以供读者参考。

一、数的类型转换把表达式的类型从一种类型转化为另一种类型,结果值是把原始值截断或扩展,符号位保持不变。

例如:数的类型转换举例字符转换为整数Integer(‘A‘)整数转换为字符Char(48)整数转换为1个字节的逻辑型Boolean(0)整数转换为2个字节的逻辑型WordBool(0)整数转换为4个字节的逻辑型LongBool(0)整数转换为10进制pascal型字符串caption:=intT oStr(15)整数转换为16进制pascal型4位字符串caption:=intT oHex(15,4)地址转换为长整型数Longint(@Buffer)二、数的“分开”与“合成”取32位longint型数的高16位数为hiword(longint-var)低16位数为loword(longint-var)取16位数的高8位数hibyte(integer_var)低8位数为lobyte(integer_var)取32位地址的段选择符和偏移量段选择符(高16位地址)为selectorof(p)偏移量(低16位地址)为offsetof(p)段选择符和偏移量合成为指针Ptr(SEG, OFS: Word)相当于C语言的宏MK-FP(SEG,OFS)例如在Windows中,Task DataBase结构0FAh偏移处包含‘TD‘标识,我们可以容易地编写如下代码观察到这个位于Windows 内部的未公开的秘密:{函数ptr(seg,ofs)的用法,相当于C语言的MK-FP(seg,ofs)}var p:pbyte;ch:char;p:=ptr(getcurrentT ask,$FA);ch:=char(p^); {结果为ch=‘T‘}p:=ptr(getcurrentT ask,$FA+1);ch:=char(p^); {结果为ch=‘D‘}三、字符串string 字符数组与指向字符串的指针pchar的区别与联系这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。

BCB常见类型文件说明

BCB常见类型文件说明

BCB常见文件类型说明*.~* //备份*.bak //备份*.bat //命令行批处理文件*.tds //IDE环境布局配置文件,包括历史搜索项目等*.obj //编译后产生的目标文件*.dcu //Delphi源文件编译出来的目标文件*.ddp //Diagram(图示)文件*.tlb //由IDL(Interface Definition Language 缩写)定义文件生成的类型库文件*.asm //汇编代码文件*.inc //汇编格式头文件*.hh,*.h,*.hpp //头文件 *.hpp 一般是由Delphi VCL转换而成*.cc,*.c,*.cpp //C/C++文件*.pas //Pascal/Delphi源文件*.dfm //窗体定义文件*.res //二进制资源文件*.reg //注册表定义文件*.rc //未编译的资源定义文件,此类文件编译后会生成.res,通常无须手动编译*.def //定义文件*.mak //低版本的工程文件*.bpr //工程文件(通常为UTF8编码格式)*.dpr //Delphi 工程文件*.bpk //组件包工程文件*.dpk //Delphi 组件包工程文件*.dcr //组件图标资源文件*.str //资源字符串临时文件*.ico //标图文件*.cur //鼠光标文件*.ani //动态鼠光标文件*.sql //SQL 脚本文件*.rtf //格式文本文件*.csv //带分隔符的文本型数据文件*.ini //配置文件*.inf //安装配置定义文件*.log //信息文件,通常为用来记录程序运行状态,从而方便跟踪调试*.cgl //CodeGuard CB自带的内存检查工具生成的信息文件*.cgi //网关接口可执行文件,相关请参考Web服务当中的CGI*.mdb //Access 数据库文件*.db //Borland Paradox 桌面数据库表。

BCB中用Sender参数实现代码重用

BCB中用Sender参数实现代码重用

BCB中用Sender参数实现代码重用考试大编辑整理C++编程知识面向对象的编程工具的特点之一就是要提高代码重用性(Reuse),宝兰的BCB当然可以实现这一功能。

我们都知道,在BCB中,大部分程序代码都直接或间接的对应着一个事件,此程序称为事件处理句柄,它实际上就是一个过程。

从应用程序的工程到窗口、组件和程序,BCB强调的是其开发过程中每一层次的重用性,可以充分利用已编写过的代码来减少工作量,更会使你的程序变得优美。

代码段间的共享都跟发生该事件的控件有关有关,需要根据控件类型做出相应的处理,这时就要用到Sender参数。

每个函数的开头都有形如:void _fastcall TForm1::Button1Click(TObject *Sender)其中的Sender是一个TObject类型的参数,它告诉BCB哪个控件接收到这个事件并调用相应的处理过程。

我们可以编写一个单一的事件处理句柄,通过Sender参数和if语句或者case语句配合,来处理多个组件。

在Delphi中可以用IS来测试Sender类型,或者用AS进行类型转换,BCB我们只在用dynamic_cast来进行上面两个工作,下面把dynamic_cast 的用法说明一下。

dynamic_cast 可以把某种对象强制转成另一个类,这里所谓的强制仍有其局限,也就是说,如果类转不过来,那么系统将不会进行转换操作的。

若类型转换无法成功则返回一个值是0的指针。

若参数T是一个参考类型,而类的转换又失败了,系统将会丢出一个异常处理信息:Bad_cast。

但你放心这不会导致系统死机,所以可以放心使用。

其程式:dynamic_cast (ptr)T参数一定要是一个指针、void* 、或是已经定义过的类,而ptr参数则必须是一个指针(pointer)或是一个引用(reference)。

如果T的类型是void*,那么ptr则是一个可以访问最下面类里的任何成员,当然这样的类将不可以是基础类。

常用的BCB & Delphi 函数

常用的BCB & Delphi 函数

DictionaryDeactivate 过程 使一个数据字典不激活
FindAttrID 函数 返回一个指定的属性集的ID
FindDatabaseID 函数 返回指定的数据库的ID
FindFieldID 函数 返回指定字段的ID
CursorToString 函数 把光标转换成字符串
FindControl 函数 输入窗口的句柄,返回一个TWinControl控件的对象。
FindDragTarget 函数 查找在鼠标的位置下的控件
FindVCLWindow 函数 查找指定位置下的VCL控件
GetCaptureControl 函数 获得正在处理鼠标事件的控件
GetCursorvalues 过程 回调函数,获得光标的值
GetLongHint 函数 获得Hint字符串的第二行以后的字符串 行用‘‘字符隔开
GetShortHint 函数 获得Hint字符串的第一行的字符串
IdentToCursor 函数 转换字符串到光标
IsDragObject 函数 判断指定的对象是不是TDragObject类的子孙。
Session 变量 全局的TSession对象
Sessions 变量 全局的TSessionList对象
文件: Dialogs
CreateMessageDialog 函数 创建一个消息对话框
ForceCurrentDirectory 变量 强制初始对话框为当前路径,如果为True,就是当前路径,否则就是My Documents路径。
FindGlobalComponent 变量 返回一个最高阶的容器类。
GetClass 函数 返回一个已经注册了的从TPersistent继承的类

DELPHI进制转换

DELPHI进制转换
end
end;
//二进制(S)-->>十进制(D) [重写:Jey]
uses Math;
function hextoint(s: string): Double;
begin
while Length(s) <>0 do
begin //2^(长度-1)次方
1010:Result:=Result+'A';
1011:Result:=Result+'B';
1100:Result:=Result+'C';
1101:Result:=Result+'D';
//十六进制(S)-->>十进制(I) [重写:Jey]
function hextoint(s: string): Integer;
begin //$代表16进制
Result:=StrToInt('$'+s);
end;
//十进制转换为二进制字符串 [重写:Jey]
0110:Result:=Result+'6';
0111:Result:=Result+'7';
1000:Result:=Result+'8';
1001:Result:=Result+'9';
//数据(S)-->>二进制(S)
//任何数据都是以二进制形式存储的! (转)
function conertde(s:string):string;
var

常用的BCB函数汇总

常用的BCB函数汇总
WideCharLenToString 函数 将ansi字符串转换为unicode字符串
WideCharToStrVar 过程 将unicode字符串转换为ansi字符串变量
WideCharToString 函数 将unicode字符串转换为ansi字符串
Write 过程 (for text files) 对有格式的文件,写一变量到文件组件中;对文本文件,写一个或多个值到文件中
Finalize 过程
FindClassHInstance 函数 返回一个包含指定类的定义的实例
FindHInstance 函数 返回一个包含指定地址的模块地址
FindResourceHInstance 函数返回一个包含指定的资源模块的地址
Flush 过程 清空文本缓冲区
Frac 函数 返回一个浮点数的小数部分
ParamStr 函数 返回指定的命令行参数
Pi 函数 返回圆周率pi=3.1415926535897932385.
Pos 函数 在字符串中搜索子串
Pred 函数 返回先前的参数
Ptr 函数 转换一个地址到指针
RandSeed 变量 存储随机函数的种子
Random 函数 随机函数
UpCase 函数 将字符转换为大写
Val 过程 将字符串转换为整型值
VarArrayCreate 函数 以给定的界限和维数建立变体数组
VarArrayDimCount 函数 返回给定变体的维数
VarArrayHighBound 函数 返回给定变体数组维数的上界
VarArrayLock 函数 锁定给定的变体数组
常用的BCB & Delphi 函数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

有时Delphi应用程序与C++Builder应用程序可能需要相互转换。

这种转换虽然费时,但并不困难(顺便说一句,进行转换时,我将Delphi与C++Builder同时运行)。

这里只介绍将Delphi变为C++Builder的过程,反过来也差别不大。

将Delphi变为C++Builder主要有两步。

第一步是将Delphi应用程序窗体复制到C++Builder项目中,第二步是修改Delphi 代码。

一般情况下这都是没有必要的,除非你想改写为C++代码。

下面详细介绍这两个步骤:首先要复制Delphi窗体到C++Builder应用程序中。

Delphi窗体与C++Builder窗体使用相同的基本格式,但至少有一大差别。

显然,窗体文件包含窗体本身和窗体上每个构件的尺寸和位置。

但窗体文件中也还包含事件信息。

具体地说,窗体文件包括窗体及其构件所建事件处理器的描述。

在Delphi窗体文件中,事件引用的事件处理器是Delphi方法,而在C++Builder窗体文件中,事件指向C++Builder事件处理器。

自然,要删除Pascal 引用才能在C++Builder中使用窗体。

你不一定要知道这些细节,但将Delphi转为C++Builder时必须考虑这个因素。

复制Delphi主窗体的步骤如下:1.打开Delphi项目并记下主窗体文件名及其Name属性。

2.切换到C++Builder中,选择主窗体,将Name属性变为与Delphi项目主窗体同名。

保存C++Builder项目,保存主窗体单元,用Delphi中窗体的同一文件名(除去.PAS扩展名)。

将项目存为与Delphi项目相同的名称。

3.切换到Windows Explorer中,将Delphi的项目目录中的主窗体窗体文件(.DFM文件)复制到C++Builder项目目录中。

一定要复制文件并不是移动文件。

WindowsExplorer警告说目标目录中已经有同名文件。

单击Yes改写C++Builder目录中的窗体文件。

如果没有这个警告,则一定是保存C++Builder项目时出了错。

4.切换回C++Builder,出现一个对话框,说Module xxx.cpp's time/date has changed.Reload?单击Yes重装窗体。

窗体重装后,即会包含Delphi窗体中的构件。

5.确保窗体选中并选择C++Builder主菜单中的Edit|Select All选择所有窗体的构件。

然后选择主菜单中的Edit|Cut和Edit|Paste,这样就把各个构件的所有声明放到主窗体的头文件中。

6.这时要从C++Builder窗体文件中删除所有Delphi的事件处理器的引用,这很简单:a)选择C++Builder主菜单中的File|Save或单击工具条上的Save Fileb)C++Builder会显示每个事件处理器的消息框。

每次出现对话框时单击Yes,以便删除所有事件处理器。

也许要单击Yes几十次才能删除所有事件处理器(我曾为一个窗体删除100个事件处理器!)。

这样就复制了窗体,可以转入代码转换了。

说明:Delphi应用程序中的每个窗体都要重复上述步骤。

转换代码从Delphi向C++Builder转换代码要比复制窗体复杂得多,有许多方法可用,但我用的方法如下:首先要找出编程人员(而不是Delphi)生成的各个变量和方法。

找到Delphi单元中的主窗体类声明。

记下private或public部分声明的各个变量和方法。

将这些声明复制到剪贴板上。

例如,Delphi类声明可能如下所示:Private{Private declarations}DrawColor:TColor;procedureDoDrawing;functionSetDrawColor:Integer;这里要复制DrawColor、DoDrawing和SetDrawColor的声明。

切换回C++Builder,在代码编辑器中显示主窗体的头。

找到private部分并粘贴剪贴板中的代码。

将粘贴的声明转换为C++语法。

例如,第3步的声明可能转换为如下:private://User declarationsTColor DrawColor;void DoDrawing();int SetDrawColor();切换回Delphi。

在Delphi单元的implementation部分,找到类声明中声明的方法(这里为DoDrawing和SetDrawColor),将Delphi单元中的方法复制到剪贴板上。

切换到C++Builder中,将第6步复制到剪贴板上的方法粘贴到窗体源单元中。

将方法的Pascal语法转换为C++语法。

别管函数体和begin与end语句,这些将在后面处理。

下一步要将Delphi单元中的事件处理器的代码复制到C++Builder单元中。

我认为最好的办法是从Delphi单元的implementation部分开始往下干。

遇到Delphi单元中事件处理器时的做法如下:1.记下事件处理器名,如果是Button1Click,则表示构件Button1的OnClick事件的事件处理器。

2.将事件处理器代码复制到剪贴板上。

3.切换到C++Builder中,产生与复制代码的事件处理器相符的事件处理器。

4.将Delphi代码从剪贴板粘贴到事件处理器中。

对Delphi单元中每个事件处理器重复1到4步。

完成之后,C++Builder项目中就有几个事件处理器了。

这些事件处理器包含Pascal 代码,还要变成C++代码。

这可以利用C++Builder Replace Text对话框进行。

下表列出了寻找的Pascal语法和替换的C++语法文本。

寻找和替换文本中的空格用小句号表示。

通常应按表的顺序进行寻找和替换操作。

Delphi转化为BCB的替换文本:说明Delphi文本替换为BCB文本等于操作符====赋值操作符:==不等操作符<>!=成员操作符.->字串引号‘“开始说明{//结束说明}无Pascal True关键字True truePascal True关键字False falseif语句if if(块首begin{块尾end;}块尾(第2种形式)end}Pascal then语句then)Pascal do语句do.无Pascal not语句not.!Pascal nil关键字nil NULLPascal case语句case switch(Pascal case语句of){Pascal self关键字Self this进行寻找与替换时,应使用Replace All选项,但使用时应小心。

例如:不能在文件开头将所有句号换成>,因为每个C++Builder源单元前几行包含带文件名的include语句。

一定要先将Pascal说明语句(以{开头,}结束)换成C++说明,然后再替换begin和end语句。

替换as end之类的单词时,应在Replace Text对话框中打开Whole words only选项,这样就保证不会误换长字中的各个字符。

注意,有些寻找与替换会带来不良的后果(如把分开文件名及其扩展名的句号换成>)。

进行寻找替换操作后,文件就混合了Pascal和C++,接下来要手工完成余下的转换工作,要对每种语言有充分的了解,才能将Pascal语法转换成C++语法。

从此你可以随心所欲地处理了,我只想指出转换时要注意的几点。

首先,C++没有对应Pascal with语句的项目,以下列代码为例:with MyForm dobeginWidth:=200;Height:=500;Caption:='Hello there';end;转换成C++Builder时,要具体引用每个属性:MyForm>Width:=200;MyForm>Height:=500;MyForm>Caption:='Hello there';另一个较难转换的Pascal语句是as语句。

Delphi程序中通常会这么干:with Sender as TButton doClick;转换成C++Builder时则应这么干:TButton*button=dynamic_cast(Sender);if(button)button->Click();另一个需要特别注意的是字串处理。

Pascal的字串操作函数能处理String数据类型,而C++Builder则用AnsiString类的字串操作函数。

以下列Pascal语句为例:x:=StrToInt(Edit.Text);转换成C++Builder时代码如下:x=Edit>Text.ToInt();集合也是Delphi的转换成C++Builder时的一个难题。

复用窗体:也可以不把Delphi转换成C++,可以在C++Builder中直接使用Delphi窗体。

只要将窗体的.PAS文件直接加进C++Builder项目中。

C++Builder即会生成Delphi单元的头,可以在任何引用Delphi窗体的C++Builder单元中使用。

说明尽管可以将Delphi窗体直接加进C++Builder项目中,但不能用C++Builder窗体设计器编辑这个窗体。

窗体的图形化修改只能在Delphi IDE中进行,而C++Builder IDE中只能对窗体进行文本式编辑。

为了对窗体进行文本式编辑,选择C++Builder窗体设计器弹出菜单中的View As Text选项。

——Delphi与C++Builder的竞争性小于互补性。

如果知道如何用C++Builder编程,就很容易用Delphi编程。

从Delphi转向C++Builder的困难在于C++语言的复杂性,但如果要从Delphi转向C++Builder,则至少比从头学一个新的框架快。

毫无疑问,同时熟悉C++Builder和Delphi能使你的编程水平更高。

相关文档
最新文档