VC_与Delphi源代码的互译详解
- 格式:pdf
- 大小:1.54 MB
- 文档页数:4
Delphi类型转换等语法关键字absolute 指令(变量)abstract 指令(方法)and 运算符(布尔)array 类型as 运算符(RTTI)asm 语句assembler 向后兼容(汇编)at 语句(异常处理)automated 访问类别符(类)begin 块标记case 语句cdecl 函数调用协定class 类型const 声明或指令(参数)constructor 特殊方法contains 运算符(集合)default 指令(属性)destructor 特殊方法dispid dispinterface 界面类别符dispinterface 类型div 运算符do 语句downto 语句(for)dynamic 指令(方法)else 语句(if 或case)end 块标记except 语句(异常处理)export 向后兼容(类)exports 声明external 指令(函数)far 向后兼容(类)file 类型finalization 单元结构finally 语句(异常处理)for 语句forward 函数指令function 声明goto 语句if 语句implementation 单元结构implements 指令(属性)in 运算符(集合) - 工程结构index 指令(dipinterface界面) inherited 语句initialization 单元结构inline 向后兼容(见asm) interface 类型is 运算符(RTTI)label 声明library 程序结构message 指令(方法)mod 运算符(数学)name 指令(函数)near 向后兼容(类)nil 数值nodefault 指令(属性)not 运算符(布尔)object 向后兼容(类)of 语句(case)on 语句(异常处理)or 运算符(布尔)out 指令(参数)overload 函数指令override 函数指令package 程序结构(控件包) packed 指令(记录)pascal 函数调用协定private 访问类别符(class) procedure 声明program 程序结构property 声明protected 访问类别符(类) public 访问类别符(类) published 访问类别符(类) raise 语句(异常处理)read 属性类别符readonly dispatch 界面类别符record 类型register 函数调用协定reintroduce 函数指令repeat 语句requires 程序结构(控件包) resident 指令(函数) resourcestring 类型safecall 函数调用协定set 类型shl 运算符(数学)shr 运算符(数学)stdcall 函数调用协定stored 指令(属性)string 类型then 语句(if)threadvar 声明to 语句(for)try 语句(异常处理)type 声明unit 单元结构until 语句uses 单元结构var 声明virtual 指令(方法)while 语句with 语句write 属性类别符writeonly dispatch 界面类别符xor 运算符(布尔)//(* 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:/nsgtao/ *)优先法则单目运算符(最高优先级)@ 取变量或函数的地址(返回一个指针)not 逻辑取反或按位取反乘除及按位运算符* 相乘或集合交集/ 浮点相除div 整数相除mod 取模(整数相除的余数)as 程序运行阶段类型转换(RTTI运算符)and 逻辑或按位求和shl 按位左移shr 按位右移加减运算符+ 相加、集合并集、字符串连接或指针增加一个偏移量- 相减、集合差集或指针减少一个偏移量or 逻辑或按位或运算xor 逻辑或按位异或运算关系及比较运算符(最低优先级)= 判断是否相等<> 判断是否不相等< 判断是否小于> 判断是否大于<= 判断是否小于或等于,或是否是一个集合的子集>= 判断是否大于或等于,或是否是一个集合的父集in 判断是否是集合成员is 判断对象是否类型兼容(又一个RTTI运算符)Boolean (ByteBool WordBool LongBool)CharIntegerShortInt -128~127Byte 0~255SmallInt -32768~32767Word 0~65535LongInt LongWordInt64Interger CardinalAnsiCharWidChar#=Chr(),把数字转化为字符,Ord为相反,把字符转化为数字#9 Tab键#10 换行#13 回车类型转换Chr 将一个有序数据转换为一个ANSI字符Ord 将一个有序类型值转换为它的序号Round 转换一个实型值为四舍五入后的整型值Trunc 转换一个实型值为小数截断后的整型值Int 返回浮点数的整数部分IntToStr 将数值转换为字符串IntToHex 将数值转换为十六进制数字符串StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值Val 将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)Str 将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)StrPas 将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的StrPCopy 拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的StrPLCopy 拷贝Pascal类型字符串的一部分到一个零终止字符串FloatToDecimal 将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型FloatToStr 将浮点值转换为缺省格式的字符串FloatToStrF 将浮点值转换为特定格式的字符串FloatToText 使用特定格式,将一个浮点值拷贝到一个字符串缓冲区FloatToTextFmt 同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区StrToFloat 将一个Pascal字符串转换为浮点数TextToFloat 将一个零终止字符串转换为浮点数Dec 将例程中的参数值递减1或一个特定的值,其中特定值可在第二个可选参数中定义Inc 将例程中的参数值增加1或一个特定的值Odd 如果参数为奇数返回真Pred 根据参数在其数据类型定义中的序列,返回参数值的前驱值Succ 返回参数值的后继值Ord 返回参数值在其数据类型值集合中的序号Low 返回参数对应的有序数据类型的最小取值High 返回参数对应的有序数据类型的最大取值实数:SingleDoubleExtendedReal {$REALCOMPATIBILITY ON}据说不标准,要兼容旧的格式使用这个宏CompCurrencyTDateTime = type Double为了后续使用或直接用于变量,需要给自定义类型命名。
Computer Knowledge and Technology 电脑知识与技术第7卷第32期(2011年11月)VC++与Delphi 源代码的互译详解许苗村,陈业恩(海南软件职业技术学院软件工程系,海南琼海571400)摘要:以大量举例的形式给出了VC++与Delphi 的代码互译,首次做到了对VC++与Delphi 程序的沟通,为算法研究及软件开发人员提供了可靠的代码转换依据,具有非常重要的意义和应用价值。
关键词:VC++;Delphi ;互译中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)32-7924-04VC++and Delphi Source Code Mutual TranslationXU Miao-cun,CHEN Ye-en(Hainan College of Software Technology,Qionghai 571400,China)Abstract:The article gives VC++and the Delphi code mutually translation by the massive examples,for the first time to do the VC++and the Delphi code communication,which provides the reliable code conversion basis for the algorithm research and the software develop⁃er and has the extremely vital significance and the application value.Key words:VC++;Delphi;Mutually translation一个程序开发员常常手中掌握了一种语言的代码,但却需要以另一种开发平台进行开发,为解决此问题,本文通过举出大量实例对VC++与Delphi 语言中的一些不同之处进行了对应互译,解决了不同开发平台之间沟通难的问题[1-4]。
Delphi与C/C++类型对照表Delphi数据类型C/C++ShorInt8位有符号整数charByte8位无符号整数BYTE,unsigned short SmallInt16位有符号整数shortWord16位无符号整数unsigned shortInteger,LongInt32位有符号整数int,longCardinal,LongWord/DWORD32位无符号整数unsigned longInt6464位有符号整数_int64Single4字节浮点数float*Real486字节浮点数Double8字节浮点数double*Extended10字节浮点数long doubleCurrency64位货币类型TDate/TDateTime8字节日期/时间Variant,OleVariant16字节可变类型VARIANT,^Variant,^OleVariant Char,AnsiChar1字节字符charWideChar2字节字符WCHAR*ShortString短字符串AnsiString/String长字符串^AnsiStringWideString宽字符串^WideStringPChar,PAnsiChar NULL结束的字符串char*PWideChar NULL结束的宽字符串LPCWSTRBoolean,ByteBool1字节布尔类型任何1字节WordBool2字节布尔类型任何2字节BOOL,LongBool4字节布尔类型BOOL注:有*前缀的是向前兼容类型;有^前缀的是C++Builder特有类型。
C/C++DelphiABC TABCACCEL TAccelATOM TAtomBITMAP TBitMap BITMAPCOREHEADER TBitmapCoreHeader BITMAPCOREINFO TBitmapCoreInfo BITMAPFILEHEADER TBitmapFileHeader BITMAPINFO TBitmapInfo BITMAPINFOHEADER TBitmapInfoHeaderBOOL BoolCBT_CREATEWND TCBT_CreateWnd CBTACTIVATESTRUCT TCBTActivateStructCHAR CharCHAR*PChar CLIENTCREATESTRUCT TClientCreateStruct COLORREF TColorRef COMPAREITEMSTRUCT TCompareItemStruct COMSTAT TComStat CREATESTRUCT TCreateStruct CTLINFO TCtlInfo CTLSTYLE TCtlStyleCTLtype TCtltypeDCB TDCBDDEAACK TDDEAck DDEADVISE TDDEAdvise DDEDATA TDDEData DDEPOKE TDDEPoke DEBUGHOOKINFO TDebugHookInfo DELETEITEMSTRUCT TDeleteItemStruct DEVMODE TDevMode DOUBLE Double DRAWITEMSTRUCT TDrawItemStruct DWORD LongInt ENUMLOGFONT TEnumLogFont EVENTMSG TEventMsg FARPROC TFarProcFIXED TFixedFLOAT Single GLYPHMETRICS TGlyphMetrics HANDLE THandle HANDLETABLE THandleTable HARDWAREHOOKSTRUCT THardwareHookStruct HELPWININFO THelpWinInfoINT Integer KERNINGPAIR TKerningPair LOGBRUSH TLogBrush LOGFONT TLogFont LOGPALETTE TLogPalette LOGPEN TLogPenLONG LongIntLONG DOUBLE ExtendedLONG INT LongIntLPSTR PCharLPWSTR PWideCharMAT2TMat2 MDICREATESTRUCT TMDICreateStruct MEASUREITEMSTRUCT TMeasureItemStructMENUITEMTEMPLATE TMenuItemTemplate MENUITEMTEMPLATEHEADER TMenuItemTemplateHeader METAFILEPICT TMetaFilePict METAHEADER TMetaHeader METARECORD TMetaRecord MINMAXINFO TMinMaxInfo MOUSEHOOKSTRUCT TMouseHookStructMSG TMsg MULTIKEYHELP TMultiKeyHelp NCCALCSIZE_PARAMS TNCCalcSize_Params NEWTEXTMETRIC TNewTextMetric OFSTRUCT TOFStruct OUTLINETEXTMETRIC TOutlineTextMetric PAINTSTRUCT TPaintStruct PALETTEENTRY TPaletteEntryPANOSE TPanosePATTERN TPatternPOINTFX TPointFXPSTR PCharPWSTR PWideChar RASTERIZER_STATUS TRasterizer_Status RGBQUAD TRGBQuad RGBTRIPLE TRGBTripleSEGINFO TSegInfoSHORT SmallIntSHORT INT SmallIntSIZE TSizeTEXTMETRIC TTextMetricTPOINT TPointTRECT TRectTTPOLYCURVE TTTPolyCurve TTPOLYGONHEADER TPolygonHeaderUINT WordUNSIGNED WordUNSIGNED CHAR ByteUNSIGNED INT WordUNSIGNED LONG LongInt(DWORD) UNSIGNED LONG INT LongIntUNSIGNED SHORT WordUNSIGNED SHORT INT WordVOID*Pointer WINDOWPLACEMENT TWindowPlacement WINDOWPOS TWindowPos WNDCLASS TWndClassWORD Word。
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常见属性说明:ALIGN 设置组件对齐(同其父容器)方式(运行时画面状态)BORDERSTYLE 设置组件边框形状CAPTION 设置组件标题CTL3D 设置组件边框是否为3D模式,若BORDERSTYLE设置为BSNONE则此属性无效COLOR 设定组件背景颜色CURSOR 设定鼠标经过组件时光标所显示的形状ENABLED 设定组件是否能使用,当设为FALSE时组件会呈灰色FONT 设定组件内文字的字型、字体大小、颜色等HEIGHT 设定组件高度HELPCONTENT 用来为帮助说明文件中的索引值建立关联LEFT 设定组件与父组件左边框间的距离POPUPMENU 设定鼠标右键(弹出式)快捷菜单TABORDER 设定组件在按下TAB键后焦点(FOCUS)移动的顺序TABSTOP 若设为FALSE,则按TAB键后焦点并不会在此组件上停留TOP 设定组件与父组件上边框间的距离VISIBLE 设定组件是否可见,此属性只在执行时起作用WIDTH 设定组件显示宽度DELPHI常见事件说明:ONCHANGE 当组件有所改变时触发的事件ONCLICK 当在此组件上按下鼠标左键时触发的事件ONDBLCLICK 当在此组件上双击鼠标左键时触发的事件ONENTER 当焦点进入此组件时触发的事件ONEXIT 当切换到其它组件使该组件失去焦点时触发的事件,但当切换到另一窗体或另一应用程序时此事件不会触发ONKEYDOWN 当在拥有焦点的组件上按下某个键时触发的事件,按键包括所有的英文、数字键、方向键、功能键等ONKEYPRESS 当在拥有焦点的组件上按下某个键时触发的事件,但按键只包括所有的英文、数字键、TAB、BACKSPACE、ENTER、ESCONKEYUP 当使用者放开键盘上的按键时触发的事件,按键看ONKEYDOWN ONMOUSEDOWN 当鼠标键在某个组件按下时触发的事件(其参数包括哪个鼠标键被按下、是否有特殊键(CTRL、ALT、SHIFT)被按下以及鼠标当前的坐标)ONMOUSEMOVE 当鼠标在组件内移动时触发的事件ONMOUSEUP 当鼠标键在组件上方放开时所触发的事件ONPAINT 在组件需要被重画时触发的事件,此时可进行自定义画法窗体组件(FORM)常见属性及事件属性 说明ACTIVE 指示此窗体是否拥有FOCUSACTIVECONTROL 指示窗体中目前拥有FOCUS的组件ACTIVEMDICHILD 指示主窗体中目前拥有FOCUS的子窗体第 1 页ACTIVEOLECONTROL 用于取得或设定此窗体上的OLE控制,以响应FOCUS改变BORDERICONS 指定哪些ICON显示在窗体的TITLE BAR上BORDERSYTLE 用以指定窗体BORDER外观及行为CANVAS 提供使用者可在窗体上CLIENT内自行显示的画板,一般在ONPAINT事件中使用CLIENTHANDLE 提供可存取系统内部使用的MDI CLIENT WINDOW HANDLE CLIENTHEIGHT 窗体客户区高度CLIENTRECT 窗体客户区所对应的矩形CLIENTWIDTH 窗体客户区宽度DEFAULTMONITOR 指定此窗体所显示的预设的显示器,用于多显示器环境下DESIGNER 此窗体的设计界面,一般不用用户设定DropTARGET 用以指定窗体是否为目前DRAG AND Drop动作的目标FLOATING 用以指示此窗体是否正在停泊在另一个视窗内FORMSTATE 用于指示此窗体所处状态FORMSTYLE 用于指示窗体的样式HELPFILE 用于指定HELP文件ICON 指定窗体最小化时所显示的ICONKEYPREVIEW 指定此窗体是否需在目前的ACTIVE组件之前取得键盘输入MDICHILDCOUNT 用于取得子窗体数目MDICHILDREN 用于取得子窗体(数组)MENU 用于指定窗体主菜单MODALRESULT 当窗体作用为MODAL对话框时,作为对话框的效果MONITOR 用于指示窗体所显示的显示器OLDCreateORDER 指定ONCreate和ONDESTROY事件何时发生OLEFORMOBJECT 对包含在此窗体内的OLE对象指定OLEFORM界面PARENT 设定此窗体的PARENTPARENTBIDIMODE 指定是否此窗体使用PARENT的BIDIMODE PIXELSPERINCH 表示此窗体设计时系统上字形的比例POSITION 表示此窗体的大小及位置PRINTSCALE 表示此窗体打印的比例SCALED 用于指定窗体的大小是否依据PIXELSPERINTCH属性来指定TILEMODE 用于指定TILE方法被调用时子窗体如何排列VISIBLE 用于设定此窗体是否被显示WINDOWMENU 如果窗体是一个MDI PARENT窗体,用于指定视窗的菜单WINDOWSTATE 用于指定窗体如何显示于屏幕中事件 说明ONPAINT 当窗体必须重画时发生ONHELP 当窗体收到HELP请求时发生ONDRAGDrop 当一个对象拉进此窗体并丢下时发生ONDRAGOVER 当一个对象拉进此窗体时发生ONCONSTRAINEDRESIZE 在ONCANRESIZE事件发生后发生ONCANRESIZE 当企图改变窗体尺寸时确认是否改变ONRESIZE 当窗体尺寸改变时发生第 2 页ONSTARTDOCK 当对象开始停泊时发生ONENDDOCK 当对象停泊结束时发生ONUNDOCK 当窗体解除停泊时发生ONDOCKDrop 当其它窗体停泊到此组件时发生ONDOCKOVER 当其它窗体向此组件停泊接近时发生ONGETSITEINFO 当有关停泊消息传回此窗体时发生ONCreate 当窗体创建时发生ONCLOSE 当窗体即将关闭时发生ONCLOSEQUERY 在窗体即将关闭时确认是否真的关闭窗体ONDESTROY 当窗体释放时发生ONSHOW 当窗体显示时发生ONHIDE 当窗体隐藏时发生ONACTIVATE 当窗体获得FOCUS时发生ONDEACTIVATE 当窗体失去FOCUS时发生菜单组件(MAINMENU、POPUPMENU)常见属性属性 说明AUTOMERGE 用于指定主窗体的主菜单是否与其它的窗体主菜单合并HANDLE 主菜单的视窗代码BIDIMODE 用于指定选项名是由左至右读或由右至左读IMAGES 用于指定选项旁可显示的图像内容ITEMS 选项的内容OWNERDRAW 用于指定选否是否可自行显示PARENTBIDIMODE 用于指定是否继承父控件的BIDIMODE属性WINDOWHANDLE 使用此菜单的视窗代号菜单项属性 说明ACTION 用于指定此选项对应的动作BITMAP 用于指定在此选项旁的图像内容BREAK 用于指定是否从此选项开始建立新的分栏CAPTION 选项显示的名称CHECKED 用于指定此选项是否CHECKEDCOMMAND 用于指定选项对应的WINDOWS COMMAND IDCOUNT 用于指示此选项的子选项数目DEFAULT 用于指示此选项是否为子菜单的预设项目EANBLED 用于指示此选项是否可用GROUPINDEX 用于指定此选项所隶属的逻辑群组,以控制主菜单之间的合并或单选钮互斥的效果HANDLE 对应此选项的Drop-DOWN菜单的WINDOWS MENU HANDLE HELPCONTEXT 对应此选项的HELP CONTEXT IDHINT 用于设定鼠标移入选项范围时的提示信息IMAGEINDEX 用以指定哪个图像显示于选项旁ITEMS 此选项的子菜单项目数MENUINDEX 此选项的父菜单内的选项索引值第 3 页PARENT 此选项的父菜单的选项RADIOITEM 用于设定此选项是否与同组其它选项互斥SHORTCUT 用于设定此选项的快捷键VISIBLE 用于设定此选项是否可见标签(LABEL)常用属性:属性 说明ALIGNMENT 用于设定标签内文本的对齐方式(水平方向)AUTOSIZE 用于设定标签组件是否根据组件内文本自动调整大小FOCUSCONTROL 用于设定键入标签内快捷键后应接受FOCUS的组件LAYOUT 用于设定标签文本如何放置(垂直方向)SHOWACCELCHAR 用于设定是否允许标签内文本是否显示画有下划线的快捷键值TRANSPARENT 用于设定组件是否透明WORDWRAP 用于设定组件文本宽于组件宽度时是否自动换行编辑框(EDIT、MASKEDIT)的属性:属性 说明AUTOSelect 用于设定组件获得FOCUS后是否自动选取所有文本AUTOSIZE 用于设定组件内增加输入文字时,是否自动加长组件长度BORDERSTYLE 用于设定组件边框风格CANUNDO 用于设定组件内文本是否可UNDOCHARCASE 用于设定组件内文本大小写状况HIDESelectION 用于设定组件失去FOCUS时,选取文本是否有效MAXLENGTH 用于设定组件内输入文本的最大长度MODIFIED 可用于判定组件内文本是否发生更改OEMCONVERT 决定是否将编辑框内文字ASCII码转换成OEM,再由OEM转换为ASCII PASSWORDCHAR 设定密码输入时取代的字符READONLY 设定编辑框内容是否可修改SELLENGTH 指示编辑框内选定文本长度SELSTART 指示编辑框内选定文本的起始位置SELTEXT 指示编辑框内选定文本EDITMASK 指示MASKEDIT掩码字符串按钮(BUTTON、BITBTN、SPEED BUTTON)常见属性:普通BUTTON属性 说明CANCEL 设定此按钮是否为取消钮(取消钮即在程序执行时若按ESC键可执行此按钮的单击事件)DEFAULT 指按下ENTER键后是否执行此按的单击事件MODALRESULT 通常用于对话框窗体中,当按下此钮时,此属性值即成为此按钮隶属的MODAL窗体的MODALRESULTCAPTION 设定或取得此按钮上显示的标题BITBTN属性 说明(图形式按钮)GLYPH 用以设定此按钮上出现的图像KIND 用以指定按钮的类型LAYOUT 用以设定图像在按钮上显示的位置第 4 页MARGIN 用以设定按钮边与图像边之间的距离(以象素为单位)NUMGLYPHS 用以设定按钮图像的数目SPACION 用以设定图像与文本之间的距离(以象素为单位)STYLE 用以设定按钮外观SPEED BUTTON[color=Red]属性 说明(快速按钮)[/color] ALLOWALLUP 用以设定是否包含此快速钮的组中是否能同时保持UP状态DOWN 用以设定此快速钮是否已被选取FLAT 用以设定此快速钮是否显示3D边的效果GROUPINDEX 用以设定快速钮的组TRANSPARENT 用以设定快速钮是否透明备注组件(MEMO)的常见属性和事件:属性 说明LINES 用于取得组件中文本(为数组,因此可支持取单行文本)TEXT 用于取得组件中文本(字符串)READONLY 用于设定组件文本是否可修改SCROLLBARS 用于设定组件滚动条模式WANTRETURNS 用于设定输入的ENTER键是否作为文本内容WORDWRAP 用于设定文本是否自动换行SELSTART 指示选中文本的起始位置SELLENGTH 指示选中文本的长度WANTTABS 用于设定输入的TAB键是否作为文本内容SELTEXT 指示选中文本事件 说明MEMO.LINES.ADD() 在当前行增加一行文本MEMO.LINES.APPEND() 在末追加一行文本MEMO.LINES.Insert 在指定位置增加一行文本MEMO.LINES.Delete 删除指定行文本MEMO.LINES.LOADFROMFILE 从指定文件导入文本到组件MEMO.LINES.LOADFROMSTREAM 从指定流导入文本到组件MEMO.LINES.SAVETOFILE 将组件文本存为指定文件MEMO.LINES.SAVETOSTREAM 将组件文本存为指定流MEMO.CLEAR 清除组件所有文本MEMO.CUTTOCLIPBOARD 将选定文本剪切到剪贴板MEMO.COPYTOCLIPBOARD 将选定文本复制到剪贴板MEMO.PASTEFROMCLIPBOARD 从剪贴板粘贴文本到当前位置复选框(CHECKBOX)常见属性:属性 说明ALIGNMENT 设定复选框标题位置ALLOWGRAYED 决定复选框是否存在GRAYED状态CHECKED 决定复选框状态STATE 指示复选框状态单选按钮(RADIOBUTTON)常见属性:第 5 页(提供互斥选项,因此通常用于成组实现,可用GROUPBOX或RADIOGROUP实现)属性 说明ALIGNMENT 设定单选框标题位置CHECKED 决定单选框状态组框(GROUPBOX)常见属性:(用于作容器)属性 说明CAPTION 组框标题,通常用于指示组件用途单选分组框(RADIOGROUP)常见属性:[color=Red]属性 说明CAPTION 指示单选组合名称COLUMNS 指示单选按钮又单行或多行为单位显示ITEMS 单选按钮标题内容(以行为单位)ITEMINDEX 指示当前选定的单选按钮的索引值列表框(LISTBOX)常见属性:属性 说明CANVAS 提供自定义显示列表框项目内容的画板,用于ONDRAWITEM事件COLUMNS 设定多重列列表框的列数EXTENDEDSelect 指定是否可使用SHIFT键进行连选ITEMHEIGHT 设定列表框项目的高度ITEMINDEX 指定选取的项目的索引值ITEMS 项目的字符串内容MULTISelect 设定是否允许多重选取SELCOUNT 列表框中选定项目数目SelectED 指示某个项目是否被选取SORTED 指定列表框中项目击者是否按字母顺序排序STYLE 指示列表框显示模式TOPINDEX 指示列表框顶端项目的索引值组合框(COMBOBOX)常见属性:属性 说明CANVAS 提供自定义显示组合框项目内容的画板,用于ONDRAWITEM事件CHARCASE 设定组合框内文字字母大小写状况DropDOWNCOUNT 设定组合框下拦菜单最大显示项目个数DropPEDDOWN 用于判定组合框是否处于下拉菜单的状态ITEMINDEX 指示下拉菜单中目前被选取的项目的索引值ITEMS 下拉菜单项目内容MAXLENGTH 设定组合框中编辑部分可输入的字符最大个数SELLENGTH 指示组合框编辑部分被选取文本长度SELTEXT 指示组合框中编辑部分被选取文本SELSTART 指示组合框中编辑部分被选取文本起始位置STYLE 指示组合框显示模式滚动条(SCROLLBAR)常见属性:属性 说明第 6 页MAX 指示滚动条最大值MIN 指示滚动条最小值POSITION 指示滑动块当前位置LARGECHANGE 指示鼠标按滚动条框至滑动块之间区域时移动值SMALLCHANGE 指示鼠标按下滚动条两端箭头时移动值KIND 指示滚动条类型(水平型或垂直型)PAGESIZE 指示按下PAGEUP或PAGEDOWN时变化量图像框组件(IMAGE)常见属性:属性 说明AUTOSIZE 本组件是否调整成为与读取图像同等大小INCREMENTALDISPALY 读较大型图像文件时是否逐步显示PICTURE 指向图像文件对象,能常为文件名STRETCH 是否将图像自动调整为本组件预设大小图像列表框(IMAGELIST)常见属性:属性 说明BKCOLOR 指定背景颜色BLENDCOLOR 前景混合颜色COUNT 组件中图像个数DRAWINGSTYLE 指示本组件绘出图像时采用的方式HEIGHT 组件内各图像的高度值IMAGETYPE 绘制图像时是否加上MASK图像MASKED 设定是否可以加上MASKWIDTH 组件内各图像的宽度值工具栏组件(TOOLBAR)常见属性:属性 说明AUTOSIZE 设定工具栏是否自动调整大小以容纳BAND BUTTONCOUNT 工具栏中按钮个数BUTTONHEIGHT 工具栏中的按钮高度BUTTONS 以INDEX表示在工具栏中的按钮BUTTONWIDTH 工具栏中的按钮宽度DISABLEDIMAGES 当工具按钮DISABLED时显示的图像列表FLAT 是否设定浮出效果HOTIMAGES 当鼠标指向工具栏按钮时显示的图像列表IMAGES 提供显示在工具栏按钮上的图像列表INDENT 设定工具栏左侧间隔大小LIST 设定标题文字是否显示在图形的右方ROWCOUNT 指定工具栏的行数SHOWCAPTIONS 设定工具按钮是否显示文字WARPABLE 设定工具栏排列按钮时是否自动换行TOOLBUTTON[color=Red]属性 说明[/color] ALLOWALLUP 设定同组工具按钮是否可以都未被选取DOWN 设定按钮是否可停在被按下的状态第 7 页DropDOWNMENU 当工具按钮按下时所出现的菜单GROUPED 设定同组工具按钮IMAGEINDEX 关联的图像在图像列表框中的索引值INDETERMINATE 是否提供工具栏第三种情况MARKED 设定按钮是否有阴影STYLE 设定按钮样式WRAP 设定在此工具按钮新增者是否为另一新栏酷栏(COOLBAR)常见属性:属性 说明ALIGN 设定COOLBAR的对齐方式AUTOSIZE 设定酷栏是否自动调整大小以容纳BAND BANDBORDERSTYLE 设定BAND的边界风格BANDS 显示COOLBAR内所有的BANDBITMAP 设定BAND的背景图像FIXEDORDER 设定是否可自行调整BAND的顺序FIXEDSIZE 设定是否以单一设度限定酷栏内所有的BAND IMAGES 提供BANDS所需要的图像SHOWTEXT 设定BAND是否显示文字VERTICAL 设定BAND的排列方式(水平排列或垂直排列)DOCKSITE 是否允许停泊状态栏组件(STATUSBAR)常见属性:属性 说明PANELS 设定状态栏组件区域SIMPLEPANEL 设定状态栏单个区域SIMPLETEXT 设定状态栏单个区域的文本ALIGNMENT 设定区域文本对齐方式TEXT 设定区域显示文本WIDTH 设定区域宽度进度条组件(PROGRESSBAR)常见属性和事件:属性 说明MAX 设定POSITION最大值MIN 设定POSITION最小值orIENTATION 设定组件显示的方向POSITION 设定进度条当前位置SMOOTH 设定进度条的进度指针为平滑或间隔方式STEP 设定调用STEPIT方法时所增加的量事件 说明STEPBY(INTEGER) 进度条增加值(由参数指定增量)STEPIT 进度条增加值(由STEP属性指定增量)轨迹条组件(TRACKBAR)常见属性:属性 说明第 8 页FRQUENCY 设定本控制刻度间的间隔值LINESIZE 设定按方向键时移动量MAX 设定POSITION最大值MIN 设定POSITION最小值orIENTATION 设定本组件显示的方向PAGESIZE 设定PAGEUP或PAGEDOWN的移动量POSITION 设定本组件当前位置SELEND 设定选定范围的最后位置SELSTART 设定选定范围的开始位置SLIDERVISIBLE 设定本组件中滑块是否显示TICKMARKS 设定刻度显示的方向位置TICKSTYLE 设定组件刻度记号的配置方式多页标签(PAGECONTROL)常见属性属性 说明MULTILINE 设定组件是否依标签数目自定调整行数ACTIVEPAGE 当前组件选中标签TABPOSITION 设定组件标签所有位置STYLE 设定组件标签样式CAPTION 设定指定标签标题PAGEINDEX 指示标签的位置TABVISIBLE 设定指定标签是否显示第 9 页。
Delphi 修改VCL Source Code 需知發信人: Tomm.bbs@csie.nctu (葛瑞菲), 信區: programming標題: Delphi 修改 VCL Source Code 需知發信站: 交大資工鳳凰城資訊站 (Tue Aug 29 15:51:19 1995)轉信站: cis_nctu!news.cis.nctu!news.csie.nctu!phoenixDelphi 修改 VCL Source Code 需知(0) 備份欲修改部份之 Source Code 以防萬一.(1) 點選 Menu File|New Project 建立一個新的 Project(2) 點選 Menu File|Add File.. 載入欲修改的 VCL Sources Code(3) 設定 Menu Options|Project 下列開關(否則您的VCL .DCU Size比原本的大一倍都有可能....)Project Options - CompilerDubugging Group(1) Debug information Turn Off(2) Local symbols Turn Off(3) Symbol info Turn OffProject Options - LinkerEXE and DLL options Group(1) Optimize for size and load time Turn ON(2) include TDW debug info Turn OFF(4) 檢查 Unit 中是否已經 Uses 欲修改之 VCL Unit.(5) 以Project Manager再次檢查欲修改的 Source Code Unit是否已加入 Project 中.加入Project後的Unit會被優先使用,而不再使用原本\DELPHI\LIB同名的 DCU.(6) 修改完畢後點選Compile|Build All(7) 待完畢無誤後,Close Project.將新產生之 DCU 從 \DELPHI\SOURCE\VCL 搬至\DELPHI\LIB(8) 點選 Option|Rebuild Library 重新產生 \DELPHI\BIN\COMPLIB.DCL.(9) 撰寫測試程式試之.from: /fq/q3056.shtmlCannot single step into VCL source code anymore Question:All of a sudden I cannot single step into the VCL source code anymore. The path to $(DELPHI)\Source\Vcl is in the Enviroment Options Direcotry and I also tried to add it to the Project Options > Debug Source Path but it did not help.It appears that $(DELPHI)\ is correct since I added a absolutepath to the list and D5 reconized this was the $(DELPHI)\ path and changed it back to $(DELPHI)\Source\Vcl automaticlly. What happened?Answer:Here are two possible reasons for your situation:1) You may accidentally have unchecked 'Use Debug DCUs' in Project | Options Compiler.2) Perhaps you have switched 'Build with run-time packages' on. from: /fq/q3061.shtmlPreventing the Debugger from stepping into VCL sourceDoes your debugger step into the VCL source code and you want to disable this?Or are you in the opposite situation, you need to step into through the VCL source code?Here are some pointers (for Delphi 5) what you should look at.The following steps will stop the debugger from stepping into the VCL:1) Go to menu 'Project | Options' and there click on tab 'Compiler'. Then uncheck the 'Use Debug DCUs' option under 'Debugging'. This is a project-specific setting.2) Also check to be sure your Library path just points to LIB, not LIB\DEBUG. This is an environment option and will affect all projects.3) Remove the VCL source directories from the Search Path. This is alsoa project specific setting. Choose under 'Project | Options' the tab 'Directories/Conditionals'. Delphi 5 allows to remove directories comfortably from the search path. The VCL source directories will look like$(DELPHI)\Source\VclThere are problably be other directories below $(DELPHI)\Source, which you may want to remove as well. E.g. \RTL\Happy Debugging!。
delphi反编译:DELPHI定义的条件编译介绍说明疯狂代码 / ĵ:http://Delphi/Article66671.html经常看到些里面用到如:{$def win16},{$def win32}的类信息可是这些好像并没有定义不知道在哪里可以找到这些条件编译定义或者是介绍说明具体讲述win16代表什么WIN32代表什么VER140代表什么?{$IFDEF WIN32} — 这可不是批注对于Delphi来说﹐左右大括号的间内容是批注﹐然而「{$」(左括号后紧接着货币符号)对于Compiler(编译器)而言并不是批注﹐而是写给Compiler看特别指示应用时机和场合Delphi中有许许多多Compiler Directives(编译器指令)﹐这些编译指令对于我们发展有何影响呢? 它们又能帮我们什么忙呢?Compiler Directive 对开发影响和助益, 可以从以下几个方向来讨论:?协助除错? 版本分类?重用和管理? 设定统执行环境协助除错稳健熟练设计师经常会在开发应用系统过程中﹐特别加入些除错或者回馈验算﹐这些除错对于软件Software品质提升有极其正面功能然而开发完成正式版本中如果不需要这些额外话﹐要想在堆中找出哪些是除错用并加以删除或设定为批注﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错还用得着此时如果能够应用像是$IFDEFCompiler Directives ﹐就可以轻易指示Delphi要/不要将某段编进执行文件中同时﹐Compiler本身也提供了些检查开关﹐可以预先对中可能问题提醒设计师注意﹐同样有助于撰写正确版本分类除了上述除错版本/正式版本分类的外﹐对于像是「试用版」「普及版」「专业版」版本分类﹐也可以经由Compiler Directive使用﹐为最后产品设定区别使用权限其它诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示Delphi特别连结哪些资源档或者是采用哪些适当以上两则例子中﹐各版本间只需共享同份代码即可Delphi 1.0 和 Delphi 2.0有许多区别的处﹐组件资源文件(.DCR)即是其中例﹐两者档案格式并不兼容﹐在您读过本文的后﹐相信可以写出这样﹐指示Delphi在区别版本采用适当资源文件以利于组件安装{$IFDEF WIN32}{$R XXX32.DCR}{$ELSE}{$R XXXX16.DCR}{$EDNIF}重用和管理经过前文讨论后﹐相信你已经不难看出Compiler Directives在管理上应用价值对于原始重用和管理﹐也是Compiler Directives 使得上力地方. 举例来说: Pascal-Style串是Delphi 1.0和 Delphi 2.0的间明显差异﹐除了原先短串的外﹐Delphi 2.0的后还多了更为方便使用长串﹐同时﹐系统也额外提供了像是 Trim这样串处理函式假如您有个串处理单元必须要同时应用于Delphi 1.0 和2.0项目时﹐编译指示器可以帮你忙此外﹐透过像是{$I xxxx} 这样 Compiler Directives﹐我们也可以适当含入某些, 同样有助于切割组合我们或编译设定设定致执行环境项目小组成员间﹐必须有共同环境设定﹐我很难预料个小组成员间彼此有区别{$B}{$H}{$X}设定﹐最后子系统在并入主时会发生什么事此外, 当您写好个组件或单元需要交予第 3者使用时, 使用编译指示器也可以保证元件使用者和您有相同编译环境使用Compiler Directives指令语法Compiler Directives从外表看起来和批注颇为类似, 和批注区别是:Compiler Directives语法格式都是以「{$」开始, 不空格紧接个名称(或个字母)表明给Compiler特别指示, 再加上其它开关或参数内容, 最后以右大括号作为指令结束, 例如:{$B+}{$R-}{$R MyCursor.res}同时, 就如同Pascal变量名称和保留字样, Compiler Directives也是不区分大小写从指令语法格式来说Compiler Directives﹐可以进步分类成以下 3种格式:?开关指令(Switch directives)这类指令都是单字母以不空格方式连接「+」或「-」符号; 或者是开关名称以个空格后连接「ON」或「OFF」来表示作用/关闭某个编译指示开关例如:{$A+}{$ALIGN _disibledevent=>Re(F);CloseFile(F);{$I+}FileExists := (IOResult = 0) and (FileName <> ‘’);end; { FileExists }可移植性我们都可能会用到其它公司或个人创作unit或component, 也可能分享给其它人, 换句话说, 单元或可能会在区别机器上编译, 直接将Compiler directives加入, 不仅可以免去使用前需要特别更改IDE麻烦, 更重要是解决了各个单元间要求区别编译环境歧异注意事项Compiler directives作用和影响范围如同变量可见范围和生命周期, 在我们使用 Compiler Directives 时也必须注意各个Compiler Directives 作用范围.Compiler Directives作用范围可分为以下两种:全域全域Compiler Directives, 影响所及是整个项目; 我们稍早前提到经由Delphi IDE改变Compiler directives方式就属于全域设定区域而区域Compiler Directives 影响所及只从Compiler Directives 改变那行开始, 直到该单元(Unit)结束或另个相同Compiler Directives 为止,对其他单元并没有影响也就是说, 如果在unit中特别加入Compiler directives, Compiler会优先采用区域设定, 然后才是属于项目层级全域设定值得提是, 在中直接加入Compiler directives最大作用范围也只限于当时那个单元而已, 对其他单元并没有任何影响, 即使是以uses参考也是样也就是说,我们可以透过uses参考其它unit公开变量和函式, 但是各个unit编译指令并不会互相参考这项独立性质, 使得unit的间编译环境设定和关系变得十分简洁, 例如Delphi 2.0VCL都是在{$H+}情况下编译,因此, VCL中串都是以长串型态编译而成, 有了这项编译指令独立特性, 不论我们Prject中设定为何, 这些在VCL中定义过串都是长串我们Project也不会uses了VCL中unit而改变了自己设定因此, 在我们移交到网络上时, 大可以放心在中加入必要Compiler directives, 别担心, 即使别unit以uses参考了我们, 也不影响它自己原来设定如果我们自行以{$DEFINE _DEBUGVERSION}($DEFINE在稍后个别指令介绍中将有介绍说明)定义了个条件符号, 这个新条件符号也是区域, 换句话说, 它只从定义那个单元那列的后才成立, 当然, 也只对目前这个单元有效. 由于自订条件符号只有区域作用, 如果有好几个单元都需要参考到某个条件符号, 如何办呢? 嗯! 在每个单元开头处中都加上编译指示是最直接方式,可是略嫌麻烦, 特别是编译指示有变时, 要修正各个单元设定内容, 很容易疏忽而出错比较简易可行作法是从Delphi IDE整合发展环境主选单-Project / Options / Directories/ConditionalConditionals 中填入条件名称这样, 相对于项目各个unit而言, 就有了个全域条件符号 或者, 您也可以参考本文对于{$I}这个Compiler Directive介绍说明我在那里指出了另个弹性解决方式修改过编译指令后, 建议BuildAll过次请试试这个:procedure TForm1.Button1Click(Sender: TObject);begin// opt是用来侦测某个编译开关作用状态{$opt H+}ShowMessage(’H+’);{$}ShowMessage(’H-’);{$end}end;在我们执行上述时, 在Delphi预设是$H+时, ShowMessage会在画面上会显示「H+」, 执行过后, 让和form内容和位置保留不变, 单纯从主选单: Project/Options/Compiler, 将Huge Strings核对方块清除($H-),然后按下F9执行, 咦! 如何还是看到「H+」?!那是Delphi只会在unit内容经过异动后才会重新将.PAS编译成.DCU, 在我们例子中, 并没有变动, .DCU当然也没有重新产生, 最后.EXE这个部分自然也是没什么变化所以, 要解决这个问题,只要以Delphi IDE主选单Project/Build All指示Delphi重新编译全部即可因此, 如果您从Delphi IDE修改过Compiler Directives后, 记得要Build All喔!不应该用来作为执行流程控制在中, 我们可以使用叙述, 根据执行当时情况控制执行时流程, 但我们不可以用{$IFDEF}来作同样事, 为什么? 从上述介绍说明, 相信您不难发现, Compiler directives会对最后.EXE内容发生直接影响, 应用像是{$IFDEF}指示Compiler结果, 几乎可以视同授权Compiler在编译那个时候自动选用/舍弃到.DCU, .EXE中, 换句话说, 在编译完成时, 会执行到那段已成定局了,我们自然不能用它来作流程控制条件编译巢套最多可以16层在使用{$IFDEF}…{$ENDIF}条件编译我们时, 个{$IFDEF}中可以再包含另个{$IFDEF}, 但深度最多只能16层, 虽然是个限制, 但以正常情形来说, 这应该已经足够了有些Compiler directives不应写在Unit中对于像是{$MINSTACKSIZE}{$MAXSTACKSIZE}管理堆栈大小, 或者像是{$APPTYE}指示编译成图形/文字模式Compiler directives, 只能写在.DPR中, 写在Unit中是没有效果建议事项确定您了解指令影响由于编译指令影响是如此直接和深远, 在修改和应用某个Compiler directive时,请确定您已经了解其含意和影响打开全部侦错开关Delphi有关侦错Compiler directives如下:? $HINTS _disibledevent=>ByteField: ;IntegerField: eger;end;…procedure TForm1.Button1Click(Sender: TObject);beginShowMessage(IntToStr(SizeOf(MyRecord)));end;ShowMessage在{$A+}时显示结果是:「8」; 倘若是{$A-}, 那所得结果是「5」,按理说, Byte应该只要个就足够了, 但是考虑到硬件执行特性, 经过对齐后record会有比较好执行速度有关这个Compiler Directive要注意事项是: 不管{$A}开关是ON或OFF, 使用packed修饰过记录宣告, 是定不会对齐. 例如:MyRecord = packed record // 不会对齐记录宣告方式{$APPTYPE GDI} 应用型态般情形下, Delphi会以{$APPTYPE GUI}方式产生个图形使用者接口, 如果您需要产生个文字屏幕模式, 那可以经由:在.DPR中加入{$APPTYPE CONSOLE}从主选单: Project/Options/Linker/EXE and DLL Options, 核取「Generate Console Application」Check Box其它有关这个Compiler Directive注意事项有:$APPTYPE不能应用在DLL项目或单单元(Unit), 它只对.EXE有意义而且只有写在.DPR中才有作用我们可以应用单元中IsConsole在执行时侦测应用类型参阅Object Pascal手册第十 3章可以知道更多有关Console Mode Application信息{$B-} 布尔评估请看以下:(Length(sCheckedDateString) <>or EmptyStr(sCheckedDateString)or (sCheckedDateString = ‘ . . ‘)or (sCheckedDateString = ‘ / / ‘) thenbeginResult := True;Exit;end;假如sCheckedDateString串内容是「85/12/241」(长度9)话, 以上述句, 其实在第个逻辑判断时就已经知道结果了, 即使不看后来逻辑运算结果也知道整个式子会是真值假如您希望对整个逻辑表达式进行完整评估 — 尽管结果已知, 后来逻辑运算也不影响整个结果时仍要全部评估过, 请将这个Compiler directives设为{$B+}, 反的, 请设为{$B-}, 系统默认值是{$B-}{$D+} 除错信息当以{$D+}(默认值)编译时, 我们可以用Delphi整合发展境境Debugger设定断点, 也可以使用Trace Into或Trace Info追踪执行过程, 值得注意是, 以{$D+}编译, 执行速度并不会受到影响, 只不过编译过DCU档案长度会加大, 但EXE档大小不变{$DEFINE条件名称} 定义条件名称随着您对Compiler Directives了解和应用程度加深, 您会发现这是个非常实 用编译指示经常, 我们会除错需要﹑区别区别版本等缘故, 希望选择性采用或排除某段, 这个时候, 我们就可以先以$DEFINE定义好个条件名称(Conditional name),然后配合{$IFDEF条件名称}…{$ELSE}…{$ENDIF}指示编译器按指定条件名称的有无来选择需要编译以下列片断来说:{$DEFINE _ProVersion}…procedure TForm1.Button1Click(Sender: TObject);begin{$IFDEF _Proversion}frmPr.ShowModal; // A{$ELSE}ShowMessage(’很抱歉, 试用版不提供打印功能’);{$ENDIF}end;编译器将会选择编译上述A那列, 日后, 如果我们需要编译「简易版」版本时, 只要将{$DEFINE _ProVersion}那列整个删掉或者, 将{$DEFINE _ProVersion}改成{-$DEFINE _ProVersion},让它变成普通批注或者, 在{$DEFINE _ProVersion}下列加上{$UNDEF _ProVersion},解除_ProVersion这个条件名称定义这样, 由于_ProVersion这个条件名称未定义缘故, Compiler就只会选择{$ELSE}下那段, 重新编译次, 不需费太多力气, 很容易就可以制作出简易版」了, 省去了要同时维护两份麻烦使用$DEFINE时其它注意事项如下:以{$DEFINE}定义条件名称都是区域换句话说, 它作用范围只在当时所在单元才有效, 即使定义在uniterface, 由其它unit以uses参考也没有效,仍然只有在目前unit有作用此外, 它作用范围是从定义起, 到unit结尾或者以{$UNDEF}解除为止如果单元中已经用{$DEFINE}定义了个条件名称, 而且也没有用{$UNDEF}解除定义, 重新{$DEFINE}个同样名称并没有作用, 换句话说, 它们是同个.假如需要个全域条件名称, 您可以:主选单: Project / Options / Directories/Conditional Conditionals 中填入条件名称以下标准条件名称, 是Delphi 2.0已经预先预备好, 我们可以直接引用,同时, 它们都是全域, 任何Unit都可以参照得到VER90: Delphi Object Pascal版本编号90表示9.0版, 日后若出现9.5版时, 也会有VER95定义 WIN32: 指出目前是在Win32(95, NT)作业环境? CUP386: 采用386(含)以上CPU时, 系统会提供本条件名称? CONSOLE: 此符号会于应用是在屏幕模式下编译时才定义{$DESCRIPTION 描述内容}应用{$DESCRIPTION}可以指定加入段文字到.EXE或.DLL表头模块描述进入点(module description entry)中﹐通常我们会用这个Compiler Directive加入应用名称和版本编号到.EXE中例如:{$DESCRIPTION Dchat Version 1.0}{$X+} 扩充语法这是为了和的前Pascal版本前向兼容编译指令, 虽然设定这个开关型指令仍有作用, 但笔者建议您大可保留系统默认值{$X+}, 在{$X+}下:? 不需要非得准备个变量接受传回值, 换句话说, 传回值可以舍弃, 此时, 就可以像是呼叫样, 很方便呼叫? 支持Pchar型态和零基作为C语言以Null结尾串{$HINTS OFF} 提示讯息打关{$HINTS}开关后, Compiler会提示设计师注意以下情况:? 变量定义了却没有使用? 流程中不会执行for或while循环? 只有存入没有取用指定叙述意思是说, 指定数据到某个变量的后,却没有任何参考取用这个变量值{$HINTS _disibledevent=>varI, J: eger;begin_False thenfor I := 1 to 3 do ;J := 3;end;{$HINTS OFF}由于简单, 在两个$HINTS中间, 我们不难看出:? for循环不会执行到, I变量也因此不曾用过? J := 3写了等于白写但在越写越长而日趋复雓时, 藉由{$HINTS _disibledevent=>举例来说, 笔者有份由Keypro厂商提供.OBJ檔, 在使用时, 相关如下:…{$L hasptpw.obj}{$F+}procedure hasp (Service, SeedCode, LptNum, Pass1, Pass2 : word;var p1,p2,p3,p4 : word); external;{$F-}…经过{$L hasptpw.obj}宣告的后, 其它部分就可以直接呼叫原先位于 hasptpw.obj 中hsap这个了{$L+} 区域符号信息在{$L+}时, Delphi会额外加入些区域符号信息, 这使得我们可以应用Delphi IDE中 View/Call Stack, View/Watch在执行时检视变量内容和函式呼叫关系应用这个Compiler directive注意事项有:? {$D-}时, {$L+}不会有作用? 使用{$L+}, 只会加大.DCU档案大小, 对.EXE大小和执行速度并没有影响{$H+} 长串宣告Delphi 2.0的后, 串多了个更为好用长串, 不仅没有资料长度255限制,和C语言惯用Null-terminated 兼容性也大为提高使用{$H}时注意事项有:? {$H+}编译情形下, 以定义串变量都是长串, 请注意,串是否为长串是在串定义时决定, 例如:procedure TForm1.Button1Click(Sender: TObject);{$H-}vars: ;begin{$H+}s := ‘测试下长串’;Windows.MessageBox(0, pchar(s), ‘讯息’, 64);end;由于var前{$H-}缘故, 虽然在begin后我们立即设定为{$H+}, 但s仍然是个短串,所以, 自然不能像是长串样, 以pchar强制型别转换后当作Null-terminated串使用? 承上, 不管是{$H+}或{$H-}, 只要串是以长串方式定义, 即使begin..end;中改成{$H-}, 该串操作仍然具有长串特性因此, 由于VCL中串都是长串, 即使我们是{$H-}, 仍然可以拿它们当长串来使用? 不论{$H}状态如何, 以AnsiString定义定是长串; 以[n]或ShortString定义定是短串{$M 16386, 1048576} 内存配置大小要改变唯叠(Stack)内存配置大小时, 我们可以有以下两种选择:? 使用{$MINSTACKSIZE数字}, {$MAXSTACKSIZE数字}, 分别指定最小.最大Stack 大小.? 或者使用{$M min, max}, 同时指定最小和最大值使用这些Compiler directive时注意事项有:? 写在.DPR中才有效果? 堆栈最小数字必须介于1024至21474835647的间? 堆栈最大数字必须介于$MINSTACKSIZE至21474835647的间? 当内存不足而无法满足最小堆栈大小时, Windows会在激活这时提出报告? 当要求内存超过$MINSTACKSIZE大小时, 将举发EStackOverflow例外{$Z1} 最小列举大小这个Compiler directive将影响储存列举型态时最小所需数值如果宣告列举型态时, 数值不大于256, 而且也在系统预设{$Z1}时, 这个列举型态只占用个储存{$Z2}时, 以两个储存, {$Z4}时, 以 4个储存C语言通常以WORD或DWORD储存列举型态, 如果您需要和C、C沟通时,{$Z2}{$Z4}就很管用了{$Z+}, 和{$Z-}分别对应到{$Z1}和{$Z4}{$P+} 开放串参数在和宣告时, 其中串自变量, 在{$P+}时表示是Open ; {$P-}时,只是般串变量而已这个Compiler directive只在{$H-}时有作用{$O+} 最佳化开关建议您维持{$O+}系统默认值开启这个Compiler directive, Delphi会自动进行最佳化处理, 可以因此跑得快些, 您可以放心打开这个编译开关, Delphi不会进行不安全最佳化而使您执行时发生{$Q-} 满溢检查, {$R-} 范围检查{$Q}和{$R}是组搭配使用Compiler directive, 它们将检查数值或操作是否在安全边界中, {$Q}会检查整数运算(如+, -, Abs, Sqr, Pred,Succ等), 而{$R}则检查串和存取是否超出合理边界范围等问题使用这两个Compiler directives会这些检查动作而降低执行速度,通常我们会在除错时开启这两个编译开关{$U-} Pentium CPU浮点运算安全检查还记得早期Pentium CPU浮点运算不正确事吧? 这批CPU应该回收得差不多了,但如果您仍然不确定会不会意外遇到漏网的鱼或黑心牌经销商话, 请将这个 Compiler directives设为{$U+}根据Borland手册介绍说明, 如果CPU是没有暇疵, 设定{$U+}对于执行速度只有轻微 影响; 但如果是问题CPU, 浮点除法速度会因此慢上 3倍, 是否要打开这个开关,您心中应该已有取舍{$R文件名称} 资源档在您还没有开始学习Compiler directives的前, 这个指令就已经出现在您中了,每次开出个新form时, Delphi自动在Implement开头部分中加入{$R *.DFM},在Project/Source中看到.DPR中也有{$R *.RES}, 这些是什么意思呢? 意思是说,在编译连结时, 含入和项目主档名同名.RES, 以及和form unit档案同名.DFM等资源档 如果您需要在中使用额外资源(例如: 自订鼠标指针), 请注意不要自行以Resouse WorkShop或Image Editor等资源编辑器更改这些和Project或Form同名资源档,改变这些同名档案不仅无效, 可能还有不可预期因些,您应该在另外个资源档中存放这些资源, 并于{$R}中写明档案名称将其连结进来, 例如: {$R MyCursor.res}{$T-} @指针型态检查应用@操作数可以取得变量地址, 在{$T-}时, 以@取得是个无型别指针(Poer)反过来说, 在{$T+}时, 是有型别指针, 假定I是个eger变量, @I所得到即是相当于^Integer(Poer of Integer)指针{$WARNINGS _disibledevent=>beginVarConst := 5;ShowMessage(IntToStr(VarConst));end;const不是常数吗? 为什么可以改呢? 在先前Pascal版本中, 以const VarName: DataType = const value;定义具型态常数确是可以改, 假如您希望常数就是常数, 它不应该允许修改,请将这个Compiler directive设为{$J-}不论是{$J+}或{$J-}, 以const VarName = const value; 定义常数(没有加上型别宣告), 是个真正常数, 其它不可以改变其内容其实{$J+}时还有个妙用, 那就是宣告出类似C语言变量, 换句话说,产生了个和Application相同生命周期变量在这种情形下, 变量只在第次使用时才会建立, 或结束时, 该变量也不会消灭, 下次再呼叫到这个或时, 我们仍然可以参考到上次执行结束时值让我们试下这个例子:{$J+}procedure TForm1.Button1Click(Sender: TObject);consti: eger = 0;beginShowMessage(IntToStr(i));Inc(i);ShowMessage(IntToStr(i));end;第次执行时, 我们分别会看到「0」「1」, 再点次这个按钮时, 看到将是「1」「2」 2009-3-28 1:29:52 疯狂代码 /。
Computer Knowledge and Technology 电脑知识与技术第7卷第32期(2011年11月)VC++与Delphi 源代码的互译详解许苗村,陈业恩(海南软件职业技术学院软件工程系,海南琼海571400)摘要:以大量举例的形式给出了VC++与Delphi 的代码互译,首次做到了对VC++与Delphi 程序的沟通,为算法研究及软件开发人员提供了可靠的代码转换依据,具有非常重要的意义和应用价值。
关键词:VC++;Delphi ;互译中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)32-7924-04VC++and Delphi Source Code Mutual TranslationXU Miao-cun,CHEN Ye-en(Hainan College of Software Technology,Qionghai 571400,China)Abstract:The article gives VC++and the Delphi code mutually translation by the massive examples,for the first time to do the VC++and the Delphi code communication,which provides the reliable code conversion basis for the algorithm research and the software develop⁃er and has the extremely vital significance and the application value.Key words:VC++;Delphi;Mutually translation一个程序开发员常常手中掌握了一种语言的代码,但却需要以另一种开发平台进行开发,为解决此问题,本文通过举出大量实例对VC++与Delphi 语言中的一些不同之处进行了对应互译,解决了不同开发平台之间沟通难的问题[1-4]。
1运算符互译表1为VC++与Delphi 的算术、位、逻辑运算符互译对照表。
2源代码的互译详解2.1单元的引用VC++中单元引用部分include 用于列出该单元要引用的标准库单元(诸如①)和其它库单元(诸如②),这类似于Delphi 中的uses 语句,可以把外部的已声明过的常量、类型、变量、过程或函数引入到本单元中使用,使得功能更加强大,使用更加方便。
VC++:#include <windows.h>①#include "shearwarp.h"②Delphi :Uses windows ,shearwarpunit;2.2宏常量用#define 定义的常量,即宏常量,其一般形式为#define <宏名><常量>,宏名可以是简单的字符名,也可以是带有参数的函数名。
常量可以是数值、字符串和函数等。
一般用#define 定义一个宏,是为了在程序中使用,使程序更加简洁,维护更加方便。
1)#define <字符名><数值>VC++:#define FPSH 8Delphi :Const FPSH=8;2)#define <带参的函数名><函数>VC++:#define CLAMPX(x)(((x)<0)?0:(((x)>=m_x)?(m_x-1):(x)))在Delphi 中首先需要在此函数所属的类中宣称这一方法,Public function CLAMPX(x:integer):integer;其次需要在执行部分(implementation)对函数体进行定义,以便返回函数值:function Volume.CLAMPX(x:integer):integer;收稿日期:2011-08-25作者简介:许苗村(1984-),女,陕西咸阳人,海南软件职业技术学院教师,主要研究方向为图像处理与信息技术;陈业恩(1980-),男,海南琼海人,海南软件职业技术学院教师,主要研究方向WEB 开发。
表1VC++与Delphi 的算术、位、逻辑运算符互译对照表E-mail:xsjl@ Tel:+86-551-56909635690964ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.7,No.32,November 2011.Computer Knowledge and Technology电脑知识与技术第7卷第32期(2011年11月)beginif x>=m_x then x:=m_x-1else Result:=x;if x<0then x:=0else x:=Result;end;2.3复杂数据类型的定义1)枚举型VC++:enum SliceOrientation{SO_XY,SO_XZ,SO_YZ};Delphi:typeTSliceOrientation=(SO_XY,SO_XZ,SO_YZ);2)结构体结构体是一种混合的数据结构,它可以由不同的数据类型构成。
VC++:struct coord3{float x,y,z;};Delphi中的记录类型与VC++中的结构体类似,它包含可以保存数据的域,每一个域可以有一个数据类型。
typeTcoord3=recordx,y,z:Real;//此记录就含有3个数据类型都相同的域3)数组的定义及初始化定义一个有4个元素的一维整型数组,并对其进行初始化。
VC++:int a[4]={0,0,0,0};Delphi:vara:array[0…3]of integer;beginfor i:=0to3doa[i]:=0;end;2.4指针与动态内存分配1)无类型指针它是指指针变量在声明时没有指明基类型。
VC++:void*p;Delphi:p:Pointer;2)指针运算VC++:char*c=(char*)p;用“数据类型名*”的形式对指针进行强制类型转换。
指定了p的指针类型为PChar。
Delphi:c:PChar;c:=p;3)动态内存分配与释放VC++:m_data=new data_t[m_size];delete m_data;new用来动态的分配存储空间,它能够自动计算要分配的存储空间大小,并能返回正确的指针类型。
delete运算符用于在使用完内存后,能够将其还给内存池。
Delphi:m_data:array of Tdata_t;setlength(m_data,m_size);m_data:=nil;2.5构造与析构函数构造和析构是类类型中两种特殊的方法,用于控制类对象的创建和初始化及删除时的行为。
VC++:public:Volume();//构造函数~Volume();//析构函数Delphi:Type Tvolume=classpublicconstructor create();destructor Destroy();Computer Knowledge and Technology电脑知识与技术第7卷第32期(2011年11月) end;2.6过程与函数的首部1)一般情况下对过程首部的转换VC++:Void ShearWarp::Shear(coord3dir,int threshold)Shear是类ShearWarp的成员函数,类作用域分辨操作符“::”用于类和成员之间的访问。
Delphi:procedure TShearWarpForm.Shear(dir:Tcoord3;threshold:Integer);2)参数的传递方式VC++:float normlen(grad_t&g);在过程或函数首部<形参表>中的参数前面如果使用了&,则表示该参数为变量参数。
变量参数的传递方式为“按地址传递”,即将实参变量的地址传递给形参,这样形参与实参表示同一个存储单元。
如果在过程或函数中改变形参变量的值,将同时影响实参变量的值。
与之等价的Delphi语句如下:function normlen(var g:grad_t):Real;3)函数名与保留字同名VC++:float length(grad_t g);直接译为Delphi语句应该是function length(g:grad_t):Real;但当运行至if length(NumStr)>0时便会出现错误提示:[Error]Pictu⁃reUnit.pas(4307):Incompatible types:'grad_t'and'String',原因是length是Delphi保留字,用于返回字符串的动态长度。
保留字是由系统规定的、具有特定意义的单词,在编程时不能被重新定义或另作他用,因此必须把此处的函数名与Delphi保留字length加以区分。
Delphi:function length1(g:grad_t):Real;4)运算符重载VC++:grad_t operator*(grad_t g1,float s);grad_t operator+(grad_t g1,grad_t g2);Operator是VC++中的关键字,它与重载的运算符一起构成函数名,因函数名的特殊性,当编译器遇到该重载的运算符时就会调用此函数。
运算符重载为类的成员函数的一般语法形式为:<函数类型>类名::operator<重载运算符号>(形参表){函数体;}Delphi:function operatormult(g1:grad_t;s:Real):grad_t;function operatoradd(g1,g2:grad_t):grad_t;2.7向量及矩阵的定义及初始化1)向量VC++:coord3v0={0.0f,0.0f,0.0f};Delphi:constv0:Tcoord3=(x:0.0;y:0.0;z:0.0);2)4×4矩阵VC++:struct matrix44{int maskh;int maskv;};matrix44IDENTITY_MATRIX={0x8421,0x8421,{{1.0f,0.0f,0.0f,0.0f},{0.0f,1.0f,0.0f,0.0f},{0.0f,0.0f,1.0f,0.0f},{0.0f,0.0f,0.0f,1.0f}}};0x用来表示后面的数8421是十六进制,1.0f表示浮点后缀,说明1.0是浮点数。