VC_与Delphi源代码的互译详解

合集下载

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

C语言代码套用在Delphi编程中
4,
&dwBytesRead,
NULL);
if (dwBytesRead!=4)
{
CloseHandle(hFile);
return FALSE;
}
//读文件失败的时候
if (re!=TRUE)
{
CloseHandle(hFile);
NCCALCSIZE_PARAMS -> TNCCalcSize_Params
NEWTEXTMETRIC -> TNewTextMetric
OFSTRUCT -> TOFStruct
OUTLINETEXTMETRIC -> TOutlineTextMetric
PAINTSTRUCT -> TPaintStruct
这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下:
以下是引用片段:
/*
文件名称:DatFormat.h
*/
#ifndef DatFormat_H
#define DatFormat_H
#include
MEASUREITEMSTRUCT -> TMeasureItemStruct
MENUITEMTEMPLATE -> TMenuItemTemplate
MENUITEMTEMPLATEHEADER -> TMenuItemTemplateHeader
METAFILEPICT -> TMetaFilePict
{
HANDLE hFile;
DWORD dwBytesRead;
BOOL re;

VC与Delphi之间动态链接库互相调用

VC与Delphi之间动态链接库互相调用

.手工调制def文件参数,如ShowDialog改为ShowDialog@8
.用Lib.exe生成lib文件,格式为:Lib /def:def文件名
.如声名中无__stdcall,默认调用格式仍为stdcall,但不要求名称分裂,用以下批处理文件MkLib.bat可生成Lib文件:
@echo off
Lib.exe-VC5.0提供
VC调用Delphi的DLL
Delphi中的声名格式:
Function ShowDialog( hMainWnd:THandle; Msg:PChar ):integer; stdcall;
输出到Dll文件中时,名称不分裂。
VC中的调用格式:
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
.如带有__stdcall,则要求Lib文件中对应函数名称分裂,可有以下步骤生成Lib文件:
.用Impdef.exe生成def文件,格式为:Impdef def文件名 dll文件名
VC与Delphi之间动态链接库互相调用
Delphi 调用VC的DLL
VC中DLL声名格式:
Extern “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
输出格式为:_ShowMess@8,“8”为函数参数字节数
为了避免名称分裂,可采用以下方法解决:
1.声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl。

delphi中类型转化

delphi中类型转化

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为了后续使用或直接用于变量,需要给自定义类型命名。

VC_与Delphi源代码的互译详解

VC_与Delphi源代码的互译详解

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]。

详解C# Webservice与Delphi交互

详解C# Webservice与Delphi交互

1.使用C#创建一个Webservice服务。
使用vs2005的模板创建C# Webservice非常容易。原文件如下:
[WebService(Namespace = \"http:
//localhost/webserver/\")]
[WebServiceBinding(ConformsTo =
type
ServiceSoap = interface(IInvokable)
['{77573149-9C57-FA51-F11F-EFD527C91BD9}']
function HelloWorld(const asdf: WideString): WideString; stdcall;
Delphi 调用C#编写的WebService 参数为Null解决方法
今天测试.net 2.0的WebService,发现了一个大问题。就是无法获取参数,参数永远是null。当然了使用.net调用
没有任何问题,web测试页也正常。不论是Delphi7还是java调用的结果的都是一样的,难道是.net 2.0的Bug?
end.
至此问题搞定了。
但是经过我的测试发现,还是不行.......找到了其他原因问题
解决了,
在用VS2005写的WebService的类属性中加入SoapRpcServiceAttribute属性就可以了。
如 下:
[SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]
如何导,方法至少有两种,我说简单的一种:
file->new->other->WebService->WSDL Importer,

VC++与Delphi XE变量类型对应关系

VC++与Delphi XE变量类型对应关系

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#的一些函数及类型的转换方法【原】

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常见属性说明: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 需知

Delphi 修改 VCL Source Code 需知

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定义的条件编译介绍说明

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 疯狂代码 /。

C++与Delphi中对象的互访

C++与Delphi中对象的互访

C++与Delphi中对象的互访2015年9月18日QQ:393660149QQ群:484247712实现目标:1)测试在C/C++中调用Delphi对象的方法。

2)测试在delphi中调用C++对象的方法。

我们知道两种语言的编译器产生的代码有很多区别,这就造成跨语言的代码利用变得困难。

但是对于一个程序员来说,只要所用的语言工具容许内存指针操作,那么总是有办法实现代码的互相调用。

C/C++/Delphi都支持指针操作,因此可以遍历所有用户空间内存。

而且Delphi编译器和C/C++编译器有很多选项可以让函数调用按照一定的规则产生代码。

因此实现互访是有可能的。

前提:1)至少明白对象、类、继承等基本概念。

2)至少明白DLL库是什么。

3)至少明白栈、堆、函数调用是什么。

4)对编译、链接、加载有基本概念。

基本概念:1)对象这里简单介绍下“对象”的概念,对象其实就是一个内存数据块,与C语言的结构体(struct)没有本质区别。

当我们create(或new)一个对象时,其实就是最终会向内存管理单元申请(malloc)一个能存放在类中声明的变量的大小的内存块。

然后调用初始化函数(构造函数)来初始化申请到这个内存块。

在delphi的System单元中class function TObject.NewInstance: TObject;beginResult := InitInstance(_GetMem(InstanceSize));end;可以看到对象的create,就是先获取一块内存,然后初始化其中的变量。

class function TObject.InitInstance(Instance: Pointer): TObject;{$IFDEF PUREPASCAL}varIntfTable: PInterfaceTable;ClassPtr: TClass;I: Integer;beginFillChar(Instance^, InstanceSize, 0); // 全部清0PInteger(Instance)^ := Integer(Self); //将类对象赋值给对象的第一个指针。

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的编译指令{$IFDEF WIN32} -- 这可不是批注喔!对于Delphi来说﹐左右大括号之间的内容是批注﹐然而「{$」(左括号后紧接着货币符号)对于Compiler(编译器)而言并不是批注﹐而是写给Compiler看的特别指示。

应用时机与场合Delphi中有许许多多的Compiler Directives(编译器指令)﹐这些编译指令对于我们的程序发展有何影响呢? 它们又能帮我们什么忙呢?Compiler Directive 对程序开发的影响与助益, 可以从以下几个方向来讨论:协助除错版本分类程序的重用与管理设定统一的执行环境协助除错稳健熟练的程序设计师经常会在开发应用系统的过程中﹐特别加入一些除错程序或者回馈验算的程序﹐这些除错程序对于软件品质的提升有极其正面的功能。

然而开发完成的正式版本中如果不需要这些额外的程序的话﹐要想在一堆程序中找出哪些是除错用的程序并加以删除或设定为批注﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错程序还用得着。

此时如果能够应用像是$IFDEF的Compiler Directives ﹐就可以轻易的指示Delphi要/不要将某一段程序编进执行文件中。

同时﹐Compiler本身也提供了一些错误检查的开关﹐可以预先对程序中可能的问题提醒程序设计师注意﹐同样有助于撰写正确的程序。

版本分类除了上述的除错版本/正式版本的分类之外﹐对于像是「试用版」「普及版」「专业版」的版本分类﹐也可以经由Compiler Directive的使用﹐为最后的产品设定不同的使用权限。

其它诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示Delphi特别连结哪些资源档或者是采用哪些适当的程序。

以上的两则例子中﹐各版本间只需共享同一份程序代码即可。

Delphi 1.0 与Delphi 2.0有许多不同之处﹐组件资源文件(.DCR)即是其中一例﹐两者的档案格式并不兼容﹐在您读过本文之后﹐相信可以写出这样的程序﹐指示Delphi在不同的版本采用适当的资源文件以利于组件的安装。

如何将C语言程序转译成delphi语言程序

如何将C语言程序转译成delphi语言程序

目录Delphi指针与C指针区别 (2)一、类型指针的定义。

(2)二、无类型指针的定义。

(2)三、指针的解除引用。

(2)四、取地址(指针赋值)。

(3)五、指针运算。

(3)六、动态内存分配。

(3)七、字符数组的运算。

(4)八、函数指针。

(4)九. 数据类型对照表 (5)十.关键字对照表 (6)如何将C/C++程序转译成Delphi (8)1 c头文件分解 (8)2 基本转换 (8)2.1 名字 (8)2.2 单元附属 (8)2.3 #defines 和 constants (9)3 数据类型 (9)3.1 基本数据类型 (9)3.2 winapi公共类型 (10)3.3数组 (11)3.4 字符串 (11)3.5枚举类型: (11)3.6 结构、记录 (12)4. 宏命令 (15)5 条件句 (16)6 函数 (16)6.1 基本的 (16)6.2 调用约定 (16)7. 连接 (17)7.1 静态链接 (17)7.2 动态链接 (18)8 公共支持单元 (20)Delphi指针与C指针区别大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。

因此,说指针是C语言的灵魂,一点都不为过。

同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。

Basic不支持指针,在此不论。

其实,Pascal语言本身也是支持指针的。

从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。

以下内容分为八个部分,分别是一、类型指针的定义二、无类型指针的定义三、指针的解除引用四、取地址(指针赋值)五、指针运算六、动态内存分配七、字符数组的运算八、函数指针九、数据类型对照表十、关键字对照表一、类型指针的定义。

对于指向特定类型的指针,在C中是这样定义的:int *ptr;char *ptr;与之等价的Object Pascal是如何定义的呢?varptr : ^Integer;ptr : ^char;其实也就是符号的差别而已。

VC++与Delphi源代码的互译详解

VC++与Delphi源代码的互译详解

VC++与Delphi源代码的互译详解
许苗村;陈业恩
【期刊名称】《电脑知识与技术》
【年(卷),期】2011(007)032
【摘要】以大量举例的形式给出了vc++与Delphi的代码互译,首次做到了对vc++与Delphi程序的沟通,为算法研究及软件开发人员提供了可靠的代码转换依据,具有非常重要的意义和应用价值.
【总页数】4页(P7924-7927)
【作者】许苗村;陈业恩
【作者单位】海南软件职业技术学院软件工程系,海南,琼海,571400;海南软件职业技术学院软件工程系,海南,琼海,571400
【正文语种】中文
【中图分类】TP311
【相关文献】
1.评析VC++与Delphi及C++Builder之间的差异 [J], 刘哲
2.转换Delphi源代码为C++Builder [J], 王又俭
3.Delphi源代码向超文本自动转化的实现 [J], 胡小文
4.在VC++ 6.0中使用Delphi 6.0编制的DLL [J], 郑秀红;魏长军
5.详解VC++中的窗口与视口 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。

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者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。

C#中如何调用Delphi写的Dll

C#中如何调用Delphi写的Dll

C# 中如何调用Delphi 写的DllC# 中如何调用Delphi 写的Dll在以前用Delphi 开发的项目中,会经常用到TChart 这个画图控件,它本身很强大,支持各类图,如点线图,柏拉图,柱状图等等,加上可以输出成BMP ,JPEG ,JPG ,SVG ,GIF 等各种格式图片,很好用,当时也封装成比较独立的DLL 文件。

这次开发.net 程序正好派上用场。

几个关键技术点:1C# 要以非托管方式调用DLL2C# 把整理好的画图数据生成事先定义好格式的XML 文件,传给DLL3DLL 解析XML 文件,根据相应格式,要求,画图4DLL 输出GIF 文件(经过比较GIF 图像失真率小,且文件大小最小)5C# 装载GIF 文件,传到前台展示关键代码:C# 以下是引用片段:#region 定义调用Delphi 写的画图DLL////// 定义调用Delphi 写的画图DLL///private class DrawChartFromDll{// 定义DLL 文件名,此文件路径要加到系统Path 中private const string _fileDll = @"Chart.dll";//调用非托管Dll ,GetChartFromXMLByNet 是ChartAccess.dll 公开的函数名称[DllImport(_fileDll, EntryPoint = "GetChartFromXMLByNet", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]//C# 中的申明public static extern int GetChartFromXMLByNet(int piChartType, string psXMLFileName, string psPriChartFileName, string psSecChartFileName, string psPriHotFileName, string psSecHotFileName);}#endregionpublic ChartResultData GetCharts(ChartData _ChartData, Hashtable _HotPriAdditionSeqNo, Hashtable _HotSecAdditionSeqNo) {// 根据数据生成XML 文件string _xmlFileName = "";ChartResultData _ChartResultData = newChartResultData();try{_xmlFileName = this.ConvertDataToXml(_ChartData);}catch (Exception err){_ChartResultData.ErrMessage = err.Message;}// 调用DELPHI ,取得返回参数int _return = -1;try{_return =DrawChartFromDll.GetChartFromXMLByNet(m_chartType, _xmlFileName, _priChartFileName, _secChartFileName, _priHotFileName,_secHotFileName);}catch (Exception err){if (_return &gt; 0){// 删除临时生成的XML 文件this.DeleteTempFile(_xmlFileName);this.DeleteTempFile(_priChartFileName);this.DeleteTempFile(_secChartFileName);this.DeleteTempFile(_priHotFileName);this.DeleteTempFile(_secHotFileName);_ChartResultData.ErrMessage = err.Message;return _ChartResultData;}else{//可能因为安全性问题,在频繁连续调用DLL 方法时有可能出现內存保护错误信息,虽然出错,但方法已经正确调用并能返回正确的值,此时可以忽略此错误_return = 0;}}// 删除临时生成的XML 文件this.DeleteTempFile(_xmlFileName);} Delphi没有什么特别的注意事项,和其它的DLL 基本一样,注意string 换成PChar 就可以了。

delphi7 英文界面翻译

delphi7 英文界面翻译

1. Delphi7 主界面、菜单中英文对照■常见窗口及打开方法Project Manager工程管理器(工程文件对象的树状结构):View\Project Manager 或 Ctrl+Alt+F11Object Inspector对象检查器(查看/设置对象属性和事件):View\Object Inspector 或F11Code Explorer代码浏览器(查看和编辑代码):View\Code Explorer×××.dpr源代码窗口(查看和编辑对象源代码):Project\View Source 或 Shift+F11Units单元代码(查看某个单元文件):View\Units ... Forms工程中的窗口(查看某个窗体):View\Forms ... 在工程管理器窗口双击某条目,可显示其代码或窗口。

■主窗口菜单★File(文件)New 新建Application 工程CLX Application CLX工程Data Module 数据模块Form 窗体Frame 框架(容器)Unit 单元--------------Other... 其他 ...Open... 打开Open Project... 打开工程ReOpen 重新打开--------------Save 保存Save As... 另存为Save Project As ... 工程另存为Save All 全部保存Close 关闭Clsee All 全部关闭-------------Use Unit ... 使用单元(添加语句)Print 打印Exit 退出★Edit(编辑)Undo/UnDelete(撤销)Redo (重复)-------------Cut (剪切)Copy (复制)Paste (粘贴)Delete (删除)SelectAll (全选)-------------Align to Grid 对齐到网格Bring to Front 移到前面Send to Back 移到后面Align... 排列Size... 大小Scale... 比例Tab Order Tab 顺序Creation Order 创建顺序Flip ChildrenFLock Controls 锁定组件-------------Add to Interface 添加到接口★Search(查找)Find... (查找)Find in File... (在文件中查找)Replace... (替换)Search Again (查找下一个)Incremental Search (快速查找)-------------Go to Line Number 跳到指定行Find Error 查找错误-------------Browse Symbol 浏览符号★View(查看)Project Manager 工程管理器显示“对象检查器”窗口Translation Manager 语言翻译管理器Object Inspector 对象设置(F11) 显示“对象检查器”窗口(属性和事件窗口)Object TreeView 对象树状查看器To-Do List 任务列表显示“任务列表”窗口Alignment Palette 对齐面板显示“对齐”工具栏Browser 浏览器Code Explorer 代码浏览器Component List 组件列表Window List 窗口列表查看已打开的所有窗口Desktops 桌面--------------------------Toggle Form/Unit 切换窗体/单元Units... 单元Forms... 窗体Type Library 类库--------------------------New Edit Window 新建编辑窗口Toolbars 工具栏★Project(工程)Add to Project... 添加到工程,显示添加文件(*.pas *.rc *.*)对话框Remove from Project... 从工程中删除Import Type Library... 导入类库Add to Repository 添加至储存器View Source 查看源代码(显示工程文件源代码)Languages 语言 ...-------------------------Add New Project 添加新工程Add Existing Project 添加现存的工程-------------------------Compile **** 编译 ****(即生成工程的可执行文件)Build **** 构建 ****(即生成工程的可执行文件)Syntax check ***** 语法检查 ****Information for **** **** 信息-------------------------Compile All Projects 编译所有工程Build All Projects 构建全部文件-------------------------Web Deployment Option... Web 配置选项Web Deploy Web 配置-------------------------Options 选项 ...★Run(运行)Run 运行(F9)Attach to Process... 附近到进程Parameters... 参数(设置工程运行参数)Register ActiveX Server 注册 ActiveX 服务器Unregister ActiveX Server 撤销注册 ActiveX 服务器Insall COM+ Object 安装 COM+ 对象-------------------------Step Over 单步执行Trace Into 跟踪(显示 SPU 跟踪窗口) Trace to Next Source Line 跟踪至下一代码Run to Cursor 运行至光标处Run Until Return 运行直至返回Show Execution Point 显示执行点Program Pause 程序暂停Program Reset 程序重置-------------------------Inspect ... 检查Evaluxte/Modify... 求值/修改Add Watch... 添加监视Add Breakpoint 添加断点★Component(部件)New Component ... 新部件Install Component... 安装部件Import ActiveX Control... 导入 ActiveX 控件-------------------------Create Component Template... 创建部件模板-------------------------Install Packages... 安装包Configure Palette... 配置调色板★Database(数据库)Explore SQL ExploreSQL Monitor SQL 监视器Form Wizard... 窗体向导★Tools(工具)Environment Option... 环境选项Editor Options... 编辑器选项Debugger Options... 调试器选项Translation Tools Options... 翻译工具选项Repository... 对象库Translation Repository... 翻译库--------------------------Web App Debugger Web 程序调试器--------------------------Regenerate CORBA IDL files... 新生 CORBA IDL 文件Configure Tools...--------------------------Database Desktop 数据库桌面Image Editor 图片编辑器Package Collection Editor 包集合编辑器XML Mapper XML 文件设计工具Rave Designer 报表设计器★Window(已打开的窗口)Object InspectorObject TreeView****.dpr,Editor---------------------Next Window★Help(帮助)Delphi HelpDelphi ToolsWindows SDK----------------------Borland Home PageBorland Developer NetworkDelphi Home PageDelphi Developer SupportDelphi Direct...----------------------Customize...----------------------About...。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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是浮点数。

相关文档
最新文档