在Delphi编程中使用C语言代码
Delphi和C语言混合编程在处理工程地质资料中的应用
进 制 正数 , 表 明文 件 的 存储 方式 是 低 字 节在 前 , 字节 9 5 这是此文 件采 用 S G标准 的版 E Dli e h作为第 四代编程语 言 , p 具有简单 、 高效 、 能强大 等 后 。第 2 3 功 本号 。第 4 5 — 字节存 放 了一个无 符号 的整 型量 M, 一般 M= 道 特点 , 由于工程和 地质资料一般数 据量很大 , 但 计算非常复 杂 , 道 4 —字 表明 了此 D lh在 底层计 算方 面与 C语 言相 比还是 有一 定 的差距 。所 头指 针尺 寸= 数 。第 6 7 节的无 符号 整型量 , ep i 1 2 用于 说明 串结 束 以, 我们需要使 用 C语言来编 写计算方 面的模 块 , 而使 用 D lh 文件 的道数 。第 8字节存 放的是 0 H或 0 H, ep i 字 0 l 来编 写人机 交互的图形界面 。众 所周之 , 数据处理软 件首先要 符 存放 于 第 9 节还 是 分别 存放 于 第 9和第 l 字节 。第 l , 2 l 字节存 放换行符 的尺寸及换行 符的类型 。第 l— l 4 3 字节 考虑数 据结构 , 了数据 结构 , 有 才可 以对数 据进行 处理 。那么 l ,3
0 引 言
科 技 飞速发展 的今天 , 数字化 的地震仪 、 地质 雷达等现 代
11文件描述块 .
每一个 S G 2 E 一 格式 文件都 有文件描 述块 。文件描 述块对
包括 文件的格式标 识 、 本号 、 版 化仪器和设备 的出现 结束 了模拟 记录的历史 。 目前 , 厂家生 整 个文件进行 了综述性 的描述 , 各 采 前 炮 首桩号 、 尾桩 号 、 备 产 的仪 器对 数据 记录 都有 一套 标准 的存 贮方 式和 处理 软件 。 采 集 日期 、 集时 间 、 方增益 、 点 间隔 、 道数 、 道头指 针等 内容 。 国内不 少科 研单位花 巨资从国外 引进仪 器或设备 , 由于经 费 注 、 而 文件描述 块 中的第 0 1 — 字节存放数据为 35 H的一个十六 a5 紧张, 却没有 购得相应 的处理 软件 , 以很多单 位和科 研院所 所
Delphi快速开发OCX步骤
Delphi快速开发OCX步骤首先要弄明白你要写的OC X是用在客户端还是用在服务器端假如用在客户端:1、创建打开delphi 7,选择菜单“new”->“other”->“activex”->“active form”->输入项目名称,系统自动给你创建了3个文件,一个是项目文件,一个是form的单元文件,还有一个后缀带TLB 的文件。
这三个文件中的你只需要更改form的单元文件,项目文件一般不需要写什么,TLB文件有系统自动维护。
2、增加接口函数所谓接口函数就是调用OCX的程序可以直接调用的函数,如果你要写的函数不提供外部函数可以按常规声明就可以。
但要声明接口函数则必须按步骤声明,有两种途径,其一:选择form单元文件,然后点击“edit”->“add to interface”,弹出一个对话框,输入要声明的函数,如:function fun:integer;其二:选择form单位文件,然后点击“view”->“Type Library”,弹出一个对话框,然后点击工具栏中“add a interface”可以增加函数或过程。
说明:在这里注意几个地方,第一,一定要选form文件才可以,否则相应的菜单都是不可用的;第二、声明函数或过程的参数类型要注意string->BSTR(第二种途径)或WideString(第一种途径)。
增加属性也函数类同。
3、调试我是用html调试的,所以可用在delphi种配置run的参数“run”->“parametes”,弹出一对话框,在“host application”中输入C:\Program Files\Internet Explorer\IEXPLORE.EXE,在“parametes”中http://192.168.6.9/my.htm,这样就可以调试delphi代码了4、发布在没有build前,可以“project”->“web deployment”中配置(主要输入ocx的地址和web 服务器的url),然后可以“web deploy”发布,其实就是生成了一个htm文件,不过该文件里包含了调用方法而已。
在Delphi编程中使用C语言代码 - 调用C语言编写的DLL文件
1、使用Visual C++ 6.0编写和链接DLL打开Visual C++ 6.0集成开发环境,新建一个Win32 Dynamic-Link Library类型的工程CDLL,在工程中新建一个C语言源文件cdll.c。
源文件中的内容如下:__declspec(dllexport) int max(int x,int y) /* 比较两个整型变量大小的函数max */{if (x>y)return x;elsereturn y;}输入完毕后按下F7键来编译和链接CDLL.dll,之后可以在存放该工程的文件夹的Debug子文件夹中找到一个名为CDLL的DLL文件,该文件即以上的C语言源程序生成的DLL。
2、使用Delphi 7编写调用该DLL的应用程序打开Delphi 7集成开发环境,在默认生成的窗体Form1上拖放3个Edit 控件Edit1、Edit2、Edit3和1个Button控件Button1,并在Object Inspector中将3个Edit控件的Text属性都清空。
然后在默认生成的Unit1.pas文件的implementation后输入:function max(x,y: Integer): Integer; stdcall external'CDLL.DLL';返回Form1,双击Button1控件,在生成的事件处理程序中输入:Edit3.Text:=IntToStr(max(StrToInt(Edit1.Text),StrToInt(Edit2.Text)));输入完毕后,保存这个Project。
最后,将CDLL.dll文件copy到保存该Project的文件夹中。
3、测试在Delphi集成开发环境下,按下F9来运行刚刚编写的Project。
在Edit1中输入2,Edit2中输入4,然后单击Button1,可以看到Edit3中会出现4,测试成功。
4、基础知识4.1、回调函数软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
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多资料了,就当做学习笔记吧,顺便分享。
2024版Delphi程序设计实用教程第2版
Delphi程序设计实用教程第2版•Delphi程序设计概述•Delphi语言基础•面向对象编程基础•窗体和控件应用•文件操作与数据库访问技术•网络编程技术•调试、优化和发布部署•实战项目:XXX系统设计与实现Delphi程序设计概述Delphi是一种高级编程语言,由Borland公司开发,以Object Pascal为基础。
Delphi支持面向对象的程序设计,具有丰富的组件库和强大的开发环境。
Delphi广泛应用于Windows桌面应用程序、Web应用程序、数据库应用程序等开发领域。
Delphi语言简介下载并安装Delphi开发环境,选择合适的版本和组件库。
配置开发环境,包括设置编译器选项、调试器选项、代码编辑器风格等。
安装和配置数据库连接驱动,以便在Delphi中访问数据库。
Delphi开发环境安装与配置第一个Delphi程序创建一个新的Delphi项目,选择适当编译和运行程序,查看程序执行结果。
的项目类型和模板。
在代码编辑器中编写程序代码,实现简单的功能,如输出“HelloWorld”。
010204 Delphi程序结构Delphi程序由项目文件、单元文件和窗体文件等组成。
项目文件包含程序的整体设置和引用单元的信息。
单元文件包含程序中的代码和数据,是实现程序功能的基本单元。
窗体文件包含程序中的界面元素和事件处理代码,是实现用户交互的重要部分。
03Delphi语言基础包括Integer 、Boolean 、Char 、String 、Float 等常用类型。
标准数据类型如数组、记录、集合、文件等复合数据类型。
构造类型用于访问内存地址的特殊数据类型。
指针类型可存储不同类型数据的灵活数据类型。
变体类型Delphi 数据类型介绍如何在Delphi 中声明变量并为其赋值。
变量声明与赋值讲解常量的概念、定义方法及在程序中的应用。
常量定义与使用阐述局部变量、全局变量的概念及其作用范围。
变量作用域变量与常量运算符与表达式算术运算符介绍加、减、乘、除等基本算术运算。
Delphi编译器、编译指令、条件编译指令(预编译指令)
Delphi编译器、编译指令、条件编译指令(预编译指令)Delphi 编译器、编译指令、条件编译指令(预编译指令)⼤部分情况下Delphi不需要⼲涉 Object Pascal 编译器的运⾏,但是有时也需要对编译器进⾏必要的设置。
1、编译器设置对话框编译器的编译指令是⽤于指定编译器对项⽬编译过程的动作和⾏为。
可以通过[Project]->[Options]->[Complier]选项页进⾏设置,绝⼤部分的编译环境都可以通过这⼀对话框进⾏调整,他包含了对代码、语法、调试信息等的设置。
1.1、代码设置(Code Generation) 代码⽣成Optimization: 代码优化开关Aligned record fields: 字对齐数据。
//这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进⾏切换,其作⽤是全局的。
Stack frames: Windows 堆栈帧。
//其作⽤域是局部的,他使编译器成为远端过程和函数⽣成特定的开头和结尾代码。
这个指令⽤于Windows 3.0的实模式,对所有Delphi应⽤程序他应该是关闭的。
Pentium-safe FDIV: Pentium安全FDIV检查。
//此指令能够在Pentium处理器中指定编译器是否创建能够检测和使⽤有缺陷的浮点除法指令的代码。
1.2、运⾏期错误(Runtime Errors)Range Checking: 范围检查。
//这个指令的作⽤范围是局部的,⽤于控制范围检验代码的⽣成。
I/O Checking: I/O检查。
//这个指令的作⽤域为局部,⽤来⽣成对⼀个⽂件的输⼊和输出过程和调⽤结果进⾏检查的代码。
⼀般应该使其功能打开。
Overflos Checking: 溢出检查。
//其作⽤是⽣成对算术溢出检查的代码。
1.3.语法设置(Syntax Optings) 语法选项Strict Var- strings: 静态变量串开关。
delphi源程序代码规范
Delphi源程序代码规范V1.0鼎创公司2005-8-13I. 总则1.1 目的为了对程序员的开发进行适当的规范化,特制定本规范。
其根本目的,是为了保证程序具有良好的、一致的结构,以期提高程序的可读性及可维护性,方便程序的测试、维护、升级等工作,同时,也培养程序员书写代码的规范性。
1.2 原则名称反映含义,形式反映结构;1.3 申明本规范适用于采用DELPHI作开发工具的公司所有项目,程序员应严格按照本规范编写代码,如项目有确实需要的特殊要求,也必须经项目经理审核后,把该特殊要求形成文档当作本文档的随附文件一起保存。
1.4 文档编写: XXX 2001年6月23日第一次修改:XXX 2001年7月7日第二次修改:XXX 2001年9月28日II.代码规范2.1 项目规范2.1.1.每一个项目的代码、文档按模块、功能必须在项目文件夹中有条理的归类存放,每个项目文件夹中均必须包含以下子文件夹:Code:源代码目录Sql:数据库脚本目录Demodata:演示数据目录Userdata:用户数据目录Help:帮助文档目录Install:安装文件目录Document:文档目录Picture:图片目录templates:报表模板目录子文件夹下也必须依照详细的用途分类建立子目录。
详细的示例如下:示例:Project Name|code sql demodata Picture help install document templates| |appserver client || 测试文档设计文档数据字典需求分析用户文档module1 module2 module3 ……2.1.2.每个项目的主目录下均必须有一个项目说明文件,说明该项目的一些概要性提示和相关规范。
2.1.3.在项目文件夹下的每层每个子目录中必须有一个文件夹说明文件,说明该层文件夹及其子文件夹的分类方法和含义。
任何时候,新增一个文件夹时,均必须在同层目录下的文件夹说明文件中添加所新增文件夹的分类含义,同时创建该文件夹下的文件夹说明文件。
delphi cxrichedit 方法
delphi cxrichedit 方法`Delphi` 是一款深受欢迎的快速应用开发(RAD)工具,它为开发者提供了强大的组件库,以快速构建高效的应用程序。
`TCxRichEdit` 是`Delphi` 中用于处理富文本的控件,拥有多种方法和属性,使得开发者可以轻松实现复杂的文本编辑功能。
以下内容将详细介绍几种常用的`TCxRichEdit` 方法。
### Delphi中的TCxRichEdit方法介绍#### 1.LoadRichText 方法`LoadRichText` 方法用于从文件中加载富文本格式(RTF)的内容到`TCxRichEdit` 控件中。
```delphiprocedure TForm1.Button1Click(Sender: TObject);beginRichEdit1.LoadRichText("C:Example.rtf");end;```#### 2.SaveRichText 方法与`LoadRichText` 相对应,`SaveRichText` 方法可以将`TCxRichEdit` 控件中的内容保存为RTF 格式的文件。
```delphiprocedure TForm1.Button2Click(Sender: TObject);beginRichEdit1.SaveRichText("C:SavedExample.rtf");end;```#### 3.Clear 方法`Clear` 方法用于清除`TCxRichEdit` 控件中的所有文本内容。
```delphiprocedure TForm1.Button3Click(Sender: TObject);beginRichEdit1.Clear;end;```#### 4.SelText 属性`SelText` 属性允许你获取或设置`TCxRichEdit` 控件当前选中的文本。
delphi编程技巧与实例精解
一、概述Delphi是一种基于Pascal语言的集成开发环境,它提供了丰富的工具和功能,使得程序员可以轻松进行Windows应用程序开发。
在Delphi编程中,掌握一些技巧和实例是非常重要的,可以帮助程序员提高开发效率,降低错误率,提升编程水平。
本文将对Delphi编程技巧和实例进行精解,希望能帮助读者更好地掌握这门技术。
二、Delphi编程技巧1. 使用正确的数据类型在Delphi编程中,使用正确的数据类型是非常重要的。
不同的数据类型有不同的大小和范围,选择合适的数据类型可以节省内存空间并提高程序的运行效率。
如果需要存储一个整数,应该选择合适大小的整型而不是使用大整数型,以避免浪费内存空间。
2. 合理使用循环结构循环结构是程序中常用的控制结构之一,合理使用循环结构可以简化程序逻辑,提高代码的可读性。
在Delphi中,有多种循环结构可供选择,如while循环、for循环和repeat-until循环,程序员应根据具体情况选择合适的循环结构。
3. 异常处理在编写程序时,应该考虑到各种异常情况,并做好相应的处理。
Delphi提供了丰富的异常处理机制,程序员可以自定义异常类,并使用try-except结构捕获异常,从而保证程序的稳定性和健壮性。
4. 使用面向对象编程面向对象编程是一种重要的编程范式,它能够提高程序的复用性和可维护性。
在Delphi中,使用面向对象编程可以更好地组织和管理代码,提高编程效率。
5. 性能优化在编写程序时,应该考虑程序的性能问题,并采取相应措施进行优化。
Delphi提供了丰富的性能优化工具和技术,程序员可以通过分析程序的性能瓶颈,改进算法和数据结构,提高程序的性能。
三、Delphi编程实例1. 界面设计界面设计是Delphi编程中的一个重要环节,一个美观、简洁的界面可以提升用户体验。
程序员可以使用Delphi提供的界面设计工具,如VCL控件和FireMonkey框架,快速实现各种界面效果。
在Delphi中用CPort组件开发串口通信程序
F l o w C o n t r o l 的子 属 性 X o n X o f I n 和Xo n Xo f f O u t 的值 都 自动设 置 为 f a l s e 。 自己设 计控 制 协议 ,对 串 口通信 过程 进 行控 制 。
Mo d e m的通信。开发 一般 的串口通信程序时 ,特 别是开发二进
制 数 据 传 送 的 通 信 程 序 ,可 以 选 择 无 控 制 方 式 ,即 选 择 属 性
F l o wC o n t r o l 的 子 属 性 F l o w C o n t r o l 取值 为f c N o n e 。这 时 ,
化开 发工具 ,具有开发效率 高 、容易使用和功能强大等特 点。 在此 ,设计一个简单的字符 串接收和发送程序 ,论述在D r e l p h i 7 中 用C o mP o r t 组 件 开发 串 口通 信 程序 的 方法 。
1 Co mPo r t 组 件 介绍
C o m P o r t 控件 ;②初始化并打开串口;③捕捉串口事件或查询串 口;④对串口进行读写;⑤关闭串口。
开串口/ 关闭串口。@B a u d R a t e 属性 :波特率。@Da t a B i t s  ̄性 : 数据位数 。@S t o p B i t s 屙 性:停止位位数。@P a r i t y 属性 :校验 ,
其 中子 属性 B i t s  ̄ 定 校 验 位 ,当 为 p r No n e 时 , 无 校 验 位 ; 当 p r E v e n 时 采 用偶 校 验 ;当 为p r O d d 时 采用 奇 校 验 。@ F l o w C o n t r o l
Delphi 调用CC 的Dll
Delphi 调用CC++的Dlldelphi调用C++写的Dll, 当然这个Dll要求是非MFC 的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl。
C++中例子:[cpp] view plaincopyprint?extern "C" int __declspec(dllexport) add(int x, int y);Delphi中例子:[delphi] view plaincopyprint?function add(i:Integer;j:Integer):Integer; cdecl; External 'NonMfcDll.dll';2. 声明中加上__stdcallC++中例子:[cpp] view plaincopyprint?extern "C" int __declspec(dllexport) __stdcall stdadd(int x, int y);因为加上__stdcall关键字, 会导致函数名分裂. 此时函数名变成_stdadd@8. 其中, 8是参数的总字节数Delphi引用的方法1: 在delphi定义中加上"name'_stdadd@8'".[delphi] view plaincopyprint?function stdadd(i:Integer;j:Integer):Integer; stdcall; External 'NonMfcDll.dll'name'_stdadd@8';Delphi引用的方法2: 增加def文件, 内容如下[plain] view plaincopyprint?; NonMfcDll.def : 声明DLL 的模块参数。
delphi如何调用C#的dll
delphi如何调用C#的dlldelphi如何调用C#的dll发表于2010-03-11 16:37:13 1delphi如何调用C#的dll?在你的环境变量Path中加入C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin;C:\WINNT\\Framework\v1.1.4322随便建立一个ClassLibrary编译成DLL文件切换到MS-DOS命令行下面,运行:C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg上面的命令行是注册我们的.NET组件,并且产生了一个备用的注册表文件。
对应Windows的注册COM文件命令:regsvr32 c:\test.dll .在.NET下面,注册.NET组件就需要上面的regasm命令了然后在MS-DOS命令行下面,运行:C:\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb上面的命令行表示将会产生一个.NET组件的类型库有了TLB文件也就和正常的COM组件一样了,运行Delphi导入类型库文件TLB......和正常的COM调用一样•发表于 2010-03-11 17:32:21 2以前用delphi写的CS程序今天客户要加几个模块上去,刚好会点C# ,这后面模块就用C#写的编译成dll文件,在用delphi调用C#写的dll文件时折腾好阵子就有了这些经历写下来。
一、打开vs2005新建windows应用程序项目命名为SFrm,删除应用程序自动生成的Program.cs(因为我们是要生成dll文件)在窗体类新建一接口(interface SHFRM) 让窗体类实现接口代码如下:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Text;using System.Windows.Forms;namespace SFrm{public interface SHFRM //此接口用在delphi下调用必须用到{void ShchildFrm();}public partial class Form1 : Form,SHFRM{private BindingSource bindingSource1 = new BindingSource();private SqlDataAdapter dataAdapter = new SqlDataAdapter();public Form1()InitializeComponent();}/// <summary>/// 显示窗口/// </summary>public void ShchildFrm(){Form1 frm = new Form1();frm.Show();}/// <summary>/// 按钮事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){dataGridView1.DataSource = bindingSource1;GetData("select * from Customers");}private void GetData(string selectCommand){try{String connectionString = "Data Source=.;initial catalog=Northwind;user id =sa;pwd=";dataAdapter = new SqlDataAdapter(selectCommand, connectionString);SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);DataTable table = new DataTable();table.Locale = System.Globalization.CultureInfo.InvariantCulture;dataAdapter.Fill(table);bindingSource1.DataSource = table;dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);}catch (SqlException){MessageBox.Show("To run this example, replace the value of the " +"connectionString variable with a connection string that is " +"valid for your system.");}}}}右击项目名在属性对话框中更改输出类型为”类库” 在界面点击程序集信息按钮如下图:使程序集com可见必须选中完成dll文件生成二.DotNet 类库打包成COM类型库(在vs命令行执行如下操作)Tlbexp.exe SFrm.dll /out: SFrm.tlb三.注册COM类型库Regasm.exe SFrm.dll四.Delphi导入类型库Delpi 中,Project -> Import Type Library ,选中类型库:dotnet2com.tlb,生成 DotNet2Com_TLB 单元文件。
C#,C++,Delphi的Socket编程
C#,C++,Delphi的Socket编程今天分别用Visual C#2003,Dev C++4, Delphi7编写了Socket 的client 发数据给server的两端程序,并成功实现了不同种程序间的通讯。
比如delphi socket client 或C++socket client 访问C# socketserver 和C++ socket server。
其中C++运行最快,C#最稳定,Delphi编写最快,效率也还行。
C++的代码如果在linux下编译,可在linux下运行。
delphi代码放到kylix下或许也行。
C#的恐怕要edit后用Mono编译才能在Linux下运行。
下面代码在Visual C#2003下编译通过/************SocketClient****VS C#2003********************/using System ;using System.Drawing ;using System.Collections ;using ponentModel ;using System.Windows.Forms ;using System.Data ;using .Sockets ;//使用到TcpListen类using ;namespace WindowsApplication3{////// Form1 的摘要说明。
///public class Form1 : System.Windows.Forms.Form{private bel label1;private bel label2;private System.Windows.Forms.TextBox textBox1;private System.Windows.Forms.TextBox textBox2;private bel label3;private System.Windows.Forms.Button button1;private System.Windows.Forms.Button button2;private System.Windows.Forms.StatusBar statusBar1;private System.Windows.Forms.ListBox listBox1;////// 必需的设计器变量。
Delphi与C之间的类型对应表
Delphi与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 -> TDebugHookInfoDELETEITEMSTRUCT -> TDeleteItemStructDEVMODE -> TDevModeDOUBLE -> DoubleDRAWITEMSTRUCT -> TDrawItemStructDWORD -> LongIntENUMLOGFONT -> TEnumLogFontEVENTMSG -> TEventMsgFARPROC -> TFarProcFIXED -> TFixedFLOAT -> SingleGLYPHMETRICS -> TGlyphMetricsHANDLE -> THandleHANDLETABLE -> THandleTableHARDWAREHOOKSTRUCT -> THardwareHookStructHELPWININFO -> 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 -> TTextMetricTPOINT -> 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下⾯是⼀些 C 变量类型和 Pascal 变量类型对照列表。
delphi调用C#写的webservice
delphi调⽤C#写的webservice看以下的⼀个例⼦(转)先⽤创建⼀个简单的webservices;1.打开2003 新建⼀个webservises 命名为WebService12.添加两个WebMethod[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();} 完整代码using System;using System.Collections;using ponentModel;using System.Data;using System.Diagnostics;using System.Web;using System.Web.Services;namespace WebService1{public class Service1 : System.Web.Services.WebService{public Service1(){//CODEGEN: 该调⽤是 Web 服务设计器所必需的InitializeComponent();}#region组件设计器⽣成的代码//Web 服务设计器所必需的private IContainer components = null;///<summary>///设计器⽀持所需的⽅法 - 不要使⽤代码编辑器修改///此⽅法的内容。
///</summary>private void InitializeComponent(){}///<summary>///清理所有正在使⽤的资源。
///</summary>protected override void Dispose( bool disposing ){if(disposing && components != null){components.Dispose();}base.Dispose(disposing);}#endregion[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();}}}1下⾯在打开delphi 72新建⼀个应⽤程序:拖两个button两个edit 和⼀个HTTPRIO(在webservices页上)到窗体上;3.接下来:File-> new-> other-> webservices-> WSDL importer点击next 导⼊保存unit Service14.在unit1(form1 的单元⽂件)中引⽤Service1, XSBuiltIns5. HTTPRIO1的(特别注意)。
在Delphi编程中使用C语言代码
在Delphi编程中使用C语言代码在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->TDebugHookInfoDELETEITEMSTRUCT->TDeleteItemStructDEVMODE->TDevModeDOUBLE->DoubleDRAWITEMSTRUCT->TDrawItemStructDWORD->LongIntENUMLOGFONT->TEnumLogFontEVENTMSG->TEventMsgFARPROC->TFarProcFIXED->TFixedFLOAT->SingleGLYPHMETRICS->TGlyphMetricsHANDLE->THandleHANDLETABLE->THandleTableHARDWAREHOOKSTRUCT->THardwareHookStructHELPWININFO->THelpWinInfoINT->IntegerKERNINGPAIR->TKerningPairLOGBRUSH->TLogBrushLOGFONT->TLogFontLOGPALETTE->TLogPaletteLOGPEN->TLogPenLONG->LongIntLONGDOUBLE->ExtendedLONGINT->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->SmallIntSHORTINT->SmallIntSIZE->TSizeTEXTMETRIC->TTextMetricTPOINT->TPointTRECT->TRectTTPOLYCURVE->TTTPolyCurveTTPOLYGONHEADER->TPolygonHeaderUINT->WordUNSIGNED->WordUNSIGNEDCHAR->ByteUNSIGNEDINT->WordUNSIGNEDLONG->LongInt(DWORD)UNSIGNEDLONGINT->LongIntUNSIGNEDSHORT->WordUNSIGNEDSHORTINT->WordVOID*->PointerWINDOWPLACEMENT->TWindowPlacementWINDOWPOS->TWindowPosWNDCLASS->TWndClassWORD->Word。
在Delphi中使用CodeBlocks编译的DLL
18.{
19.#endif
20.void__stdcall SomeFunction(constLPCSTRsometext);
21.int__stdcall SayHello(constLPCSTRlpCaption,constLPCSTRlpText);
22.#ifdef __cplusplus
20.// return FALSE to fail DLL load
21.break;
22.
23.caseDLL_PROCESS_DETACH:
24.// detach from process
25.break;
26.
27.caseDLL_THREAD_ATTACH:
28.// attach to thread
声明以后就可以在程序中调用了!其实和VC生成的DLL供Delphi使用是差不多的!
due使用codeblocks新建一个dll工程在生成的源代码中更改函数的声明为stdcall新建一个def下面贴出来示例的代码
使用CodeBlocks新建一个DLL工程,在生成的源代码中更改函数的声明为__stdcall,新建一个Def文件在文件中声明要导出的函数,这样就OK了!
下面贴出来示调用DLL中函数的部分代码:
Delphi代码
1.
2.implementation
3.
4.{$R *.dfm}
5.procedureSomeFunction(constsometext: PChar); stdcall; external'Dll的名称.dll';
6.functionSayHello(constlpCaption: PChar;constlpText: PChar):Integer; stdcall; external'Dll的名称.dll';
如何在Delphi程序中直接使用C语言程序代码
如何在Delphi程序中直接使用C语言程序代码
秦艳友;张云浩;姜迎新
【期刊名称】《通化师范学院学报》
【年(卷),期】2004(25)4
【摘要】阐述了在Delphi程序中如何直接使用C语言程序代码,从而发挥它们各自的编程优点和特长.
【总页数】3页(P26-28)
【作者】秦艳友;张云浩;姜迎新
【作者单位】通化师范学院网络信息中心,吉林,通化,134002;通化师范学院网络信息中心,吉林,通化,134002;通化市第一中学
【正文语种】中文
【中图分类】TP313
【相关文献】
1.浅析如何在Delphi中编写ISAPI程序 [J], 韩静
2.如何在Delphi中编写控制面板程序 [J], 赵海飞
3.如何在C语言中直接使用XMS [J], 祝建中
4.如何在C语言应用程序中使用扩充内存 [J], 李宏建
5.使用C#Builder和设计模式在.NET中管理Unmanaged程序代码 [J], 李维因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式.
参数:
IN:
FileName:欲判断的文件名称
IN,OUT:
IsDatFile:是否为Dat格式文件
OUT:
读文件失败返回FALSE,否则返回TRUE.
------------------------------------
BITMAPFILEHEADER -> TBitmapFileHeader
BITMAPINFO -> TBitmapInfo
BITMAPINFOHEADER -> TBitmapInfoHeader
BOOL -> Bool
CBT_CREATEWND -> TCBT_CreateWnd
注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中.C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论.请感兴趣的朋友自行参阅相关资料.
然后我们写如下代码调用此函数:
以下是引用片段:
procedure TFrmMain.Button1Click(Sender: TObject);
这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下:
以下是引用片段:
/*
文件名称:DatFormat.h
*/
#ifndef DatFormat_H
#define DatFormat_H
#include
DDEADVISE -> TDDEAdvise
DDEDATA -> TDDEData
DDEPOKE -> TDDEPoke
DEBUGHOOKINFO -> TDebugHookInfo
DELETEITEMSTRUCT -> TDeleteItemStruct
DEVMODE -> TDevMode
FIXED -> TFixed
FLOAT -> Single
GLYPHMETRICS -> TGlyphMetrics
HANDLE -> THandle
HANDLETABLE -> THandleTable
HARDWAREHOOKSTRUCT -> THardwareHookStruct
#ifdef __cplusplus
}
#endif
#pragma pack(pop)
#endif // DatFormat_H
具体实现代码DatFormat.c如下:
#include "DatFormat.h"
BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)
COMSTAT -> TComStat
CREATESTRUCT -> TCreateStruct
CTLINFO -> TCtlInfo
CTLSTYLE -> TCtlStyle
CTLtype -> TCtltype
DCB -> TDCB
DDEAACK -> TDDEAck
以下是引用片段:
ABC -> TABC
ACCEL -> TAccel
ATOM -> TAtom
BITMAP -> TBitMap
BITMAPCOREHEADER -> TBitmapCoreHeader
BITMAPCOREINFO -> TBitmapCoreInfo
{$LINK 'DatFormat.obj'} //链接外部OBJ文件
function _CheckIsDatFile(const FileName:Pchar;IsDatFile:PBool):Bool;cdecl;external;//定义函数.其中cdecl进栈方式说明采用C语言格式传递参数.external说明是个外部声明函数.
在Delphi编程中使用C语言代码 - 直接转换C语言代码到DELPHI代码2007年06月25日 星期一 下午 03:21C语言的函数格式与Delphi不同,它们是函数返回类型在前,函数声明在后.对于没有任何返回类型的函数则定义为VOID类型.
例如:Delphi中函数function MyFunction:(intIN:integer):Bool;相应的C语言代码就变成Bool MyFunction(int intIN);又例如procedure MyProcedure;====>void MyProcedure;采用这种方法,一般要求对C语言比较熟悉.我一般是采用这种方法.下面是我收集整理的自己常用的Delphi与C之间的类型对应表.其中左边是C类型,右边是对应的Delphi类型:
HELPWININFO -> THelpWinInfo
INT -> Integer
KERNINGPAIR -> TKerningPair
LOGBRUSH -> TLogBrush
LOGFONT -> TLogFont
LOGPALETTE -> TLogPalette
CBTACTIVATESTRUCT -> TCBTActivateStruct
CHAR -> Char
CHAR* -> PChar
CLIENTCREATESTRUCT -> TClientCreateStruct
COLORREF -> TColorRef
COMPAREITEMSTRUCT -> TCompareItemStruct
不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:
LOGPEN -> TLogPen
LONG -> LongInt
LONG DOUBLE -> Extended
LONG INT -> LongInt
LPSTR -> PChar
LPWSTR -> PWideChar
MAT2 -> TMat2
MDICREATESTRUCT -> TMDICreateStruct
//读文件
re = ReadFile(hFile,
&MyBuf,
4,
&dwBytesRead,
NULL);
if (dwBytesRead!=4)
{
CloseHandle(hFile);
return FALSE;
}
在Delphi编程中使用C语言代码 - 静态链接C语言的OBJ文件2007年06月25日 星期一 下午 04:00
这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.
我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以直接把OBJ文件链接到我们的程序里面.
//读文件失败的时候
if (re!=TRUE)
{
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
*IsDatFile=(MyBuf[0]=='R' && MyBuf[1]=='I' && MyBuf[2]=='F' && MyBuf[3]=='F');
METAHEADER -> TMetaHeader
METARECORD -> TMetaRecord
MINMAXINFO -> TMinMaxInfo
MOUSEHOOKSTRUCT -> TMouseHookStruct
MSG -> TMsg
MULTIKEYHELP -> TMultiKeyHelp
//建立读文件句柄
hFile = CreateFile(FileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
0);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
return(TRUE);
}
运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.
运行Delphi,新建一个工程并保存.然后把DatFormat.OBJ拷贝到它的目录之下.在单元的implementation下面添加如下代码:
MEASUREITEMSTRUCT -> TMeasureItemStruct
MENUITEMTEMPLATE -> TMenuItemTemplate