将DELPHI代码变为BCB代码
用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编程实例及基础讲解

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汉字简繁体转换代码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语言代码时间: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自定义输入对话框

通过消息实现自定义输入框(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数据类型转换(转)不同的类有不同的成员,⼀般⼦类的成员是在⽗类的成员的后⾯增加了新的成员,如果⼦类转为⽗类,那这些新增加的成员虽然还存在,但是就不可以访问得到了。
如果⽗类转为⼦类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员。
类型的转换也有很多类的,有隐性的和显性的,⼀些专⽤的类型转换函数,会重新建⽴⼀个新类型⽬标对象,然后把就类型的数值移动过去,然后销毁旧对象。
⼀些隐性的转换,对象本⾝没改变,就把指针类型换⼀了⼀下。
@⽤于取地址!最⽅便的⽤法:在调⽤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应用程序与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#的⼀些函数及类型的转换⽅法【原】例⼀实现⽬的:将字符串中每⼀个字符转成⼆进制(⽐如 '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多资料了,就当做学习笔记吧,顺便分享。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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能使你的编程水平更高。