搜档网
当前位置:搜档网 › Delphi开发环境下的实时数据采集程序设计

Delphi开发环境下的实时数据采集程序设计

Delphi开发环境下的实时数据采集程序设计
Delphi开发环境下的实时数据采集程序设计

Delphi开发环境下的实时数据采集程序设计

徐治非边信黔

(哈尔滨工程大学动力与核能工程学院,哈尔滨150001)

Program Design of Realtime Data Acquisition under Delphi

XU Zhifei Bianxinqian

(Harbin Engineering University,Dynamics Engineering Institute,Harbin 150001,China)

摘要:本文介绍了利用Delphi开发平台开发数据采集程序的两种方法,并结合某测深仪给出了一个编程的例子。

关键词:Delphi;MsComm控件;数据采集

ABSTRACT:The paper introduces two methods of implementation about collecting data with Delphi and gives a example of bathometer.

KEY WORDS:Delphi;MsComm control;Data collection

1 概述

Delphi是Windows平台下简单、易学、高效的可视化开发环境(IDE),其具有所见即所得的可视化界面设计风格和面向对象的程序设计等特点,已广泛应用于各个领域,成为首选开发工具之一。Delphi 提供了良好的界面设计能力,在PC串口通信方面也有很强的功能。

数据采集过程实质上是信息的采集、传递和处理以及对数据采集器控制的过程。由于串行通信具有所用的传输线少,可适用于较远距离传输等特点,实践中常采用以PC机为主机,通过线缆连接,以RS232/485串行接口为通信通道,对数据采集器进行控制,并接收采集到的数据和采集器的状态信息。

2 串行通信方法简介

目前PC机普遍采用Microsoft 32位Windows 操作系统。Windows下的串行通信不提倡应用程序直接控制硬件,而是通过操作系统提供的设备驱动程序来进行数据传递,或者说是通过系统提供的数据结构与系统进行信息交换,进而完成数据的发送和接收。串行口在Win 32中是作为文件方式来处理的,Win32提供了相应的文件I/O函数与通信函数。读写串口的操作一般可以通过4种形式加以实现:查询、同步I/O、异步I/O、事件驱动I/O。查询方式简单直接,但占用了大量的CPU时间;同步方式直到读取到指定字节数或超时时才返回,应用程序在程序结束前始终控制程序流,通信故障等因素可能会导致应用程序的无限等待,从而长时间阻塞线程;异步方式则在后台读写数据,而在前台执行其它任务;事件驱动是在指定的串口事件发生时自动调用相关的处理程序的机制。前两种方法效率低、浪费资源,因此一般使用异步I/O和事件驱动I/O。

3 Delphi环境下串口通信实现方法

Delphi下编制串行通信程序,可利用Windows 标准API串行通信函数,也可利用为简化Windows 下串行通信编程的ActiveX控件,如Microsoft Communications Control(MSComm)或者Delphi的第三方控件来实现。前者程序设计相对复杂,不易掌握,但可以实现功能强大、应用广泛、复杂的低层次通信程序。而后者则相对简单,上手快,开发工作量少。Delphi第三方控件是Object Pascal类,它遵循一定的规则,并通过面向对象的概念得以继承和扩充,为Delphi的应用开发提供了丰富的资源。Delphi开放式的控件支持环境,使得成千上万的Delphi用户能够为Delphi编写大量的第三方控件,并通过Internet发布,形成巨大的共享资源。下面分别介绍利用API和第三方控件实现Delphi 下串行通信的方法。

3.1 使用API实现串口通信

一般的程序设计思路就是使用Windows系统提供的应用程序接口函数实现串行通信的,这些函数经过Delphi的封装后为:CreateFile(打开串口)、CloseHandle(关闭串口)、GetCommState(用指定通信设备的当前控制设置填充设备控制块< Device Control Block ,DCB>)、SetCommState(用相应的设备控制块配置通信设备)、GetCommMask(此函数调用后返回指定通信设备的事件掩码值)、

SetCommMask(指定一系列事件监视通信设备)、ReadFile(读串口)、WriteFile(写串口)。利用API 进行串行通信的主要步骤如下:

1)打开串口

通信程序从CreateFile处指定串口设备及相关的操作属性,并返回一个句柄,该句柄将被用于后续的通信操作。

Var hCommFile:THandle;

……

hCommFile:=CreateFile('COM2',GENERIC_RE AD or GENERIC_WRITE, 0, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

if hCommFile = INV ALID_HANDLE_V ALUE then

raise ECommsError.Create( '打开串口错误'); 2)初始化串口

打开通信设备句柄后,通常要对串口进行初始化工作(即配置波特率、数据位数、停止位数、奇偶校验以及握手、流控协议等参数),配置串口通过改变数据结构--设备控制块DCB来实现。DCB 结构有近30个数据成员,对于采用3线方式的串行通信,只需设置好波特率、数据位、停止位、校验位等关键参数即可。

设置串口波特串为9600,数据位长度为8,1个停止位,不进行奇偶校验的程序设计如下:

var dcb: Tdcb;

……

GetCommState(hCommFile,dcb);

dcb. BaudRate:=9600;//波特率9600

dcb.ByteSize:=8;//数据位长度为8

dcb. Parity:=NOPARITY5;//不进行奇偶较验dcb.StopBits:=ONESTOPBIT;//l位停止位SetCommState(hCommFile,dcb);

3)读写串口

Delphi封装后的串口读写API函数为:

//写串口函数

function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD;var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;

//读串口函数

function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;

4)关闭串口

串口是独占非共享性资源,打开串口后,一定要关闭串口。关闭串口的API函数为:

function CloseHandle(hObject: THandle): BOOL; stdcall;

3.2 使用控件MSComm实现串口通讯

MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便。MSComm的控件属性较多,常用的属性如下:

1)CommPort:设置或返回串行端口号,缺省为1。2)Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:='9600,n,8,1'

3)PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False}

4)InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。

5)InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。6)RThreshold:该属性为一阈值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。

7)SThreshold:该属性为一阈值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。

8)InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。

9)Input:从接收缓冲区读取一串字符。

10)OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。

11)OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。12)OutPut:向发送缓冲区传送一串字符。

在通信过程中发生的错误或事件会引发OnComm事件,并由CommEvent属性值反映错误类型,程序根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:

1)ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。

2)ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。

3)ComEvFrame:值为1004,硬件检测到帧错误。4)ComEvRxOver:值为1008,接收缓冲区溢出。5)ComEvTxFull:值为1010,发送缓冲区溢出。6)ComEvRxParity:值为1009,奇偶校验错误。7)ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。

3 应用实例

下面通过一个实例介绍Delphi利用MSComm 通信控件,开发PC机通过串口对某测深仪进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动就可用于其它数据采集或者实时控制程序中。

该测深仪采用AscII方式传送数据,数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。数据通信的具体格式为:<深度数值>,如当深度为103.500米时,数据帧为103.500

程序用到的全局变量为:

sDepth :String;//接受Ascii码字符数据字符串

cLast:Char;//上次接受到的字符

dDepth:Double;//深度数据

程序中绘制的深度曲线采用TChart组件,变量定义为:

ChartDepth: TChart;

1)串口初始化

with MSComm do

begin

CommPort:=1;// 使用Com1

Settings:='9600,n,8,1';// 设置通信口参数

InputLen:=1; //设置Input一次从接受缓冲区读取字节数为1

InBufferCount:=0;// 清除接受缓冲区

OutBufferCount:=0;// 清除发送缓冲区InBufferSize:=50;// 设置接受缓冲区为50字节

OutBufferSize:=2;// 设置发送缓冲区为2字节RThreshold:=1;// 设置接受一个字节产生OnComm事件

InputMode:=ComInputModeText;// 设置接受数据模式为二进制方式

if(not PortOpen)then//判断通信口是否打开

PortOpen:=True

else

ShowMessage('串口已经打开!');

end;

2)数据接收与处理

为了达到实时数据采集的目的,实时数据采集处理程序采用MSComm的事件驱动方式。

procedure TForm1.MSCommComm(Sender: TObject);

var

buffer :Olevariant;

sTemp:string;

cNow :Char;

tmpX:Double;

begin

if https://www.sodocs.net/doc/595057088.html,mEvent = comEvReceive then// 接受事件

begin

buffer:=MSComm.Input;// 读取一个字节

sTemp:=buffer;

cNow:=sTemp[1];

if((cLast=Chr(13))and(cNow=Chr(10)))then

begin

sDepth:=Trim(sDepth);

dDepth:=StrToFloat(sDepth);

with SeriesDepth do// 利用TChart绘制深度曲线

begin

tmpX:=XValues[1]-XValues[0];

Delete(0);

AddXY( https://www.sodocs.net/doc/595057088.html,st+tmpX,dDepth,'',clGreen);

end;

sDepth:='';

end;

if((cLast<>Chr(13))and(cNow<>Chr(10)))then begin

sDepth:=sDepth+cNow;

end;

cLast:=cNow;

end;

end;

3)串口关闭

if(MSComm.PortOpen)then

MSComm.PortOpen:=False;

数据采集程序简化运行界面如下:

图1数据采集程序运行界面

4 结束语

在以上介绍了在Delphi程序设计中用MSComm控件和API函数实现串口通讯的方法。实际上,无论用何种语言编写串行通信程序,其过程一般均可分下列四步,即打开串口、配置串口、发送或接收数以及关闭串口。Delphi中亦可用汇编语言直接对UART端口进行访问实现串行通信,这种方法经常用在实时性要求较高的场合。

参考文献

[1]邹逢兴.微型计算机接口原理与技术.国防科技大学出版社,1999.

[2]范逸之.Delphi与RS-232串行通信控制.清华大学出版社,2002.

作者简介:

徐治非(1981-),男,硕士生,从事自动控制,计算机应用方面的研究工作;

教授,博士生导师。主要研究方向:船舶动力定位技术和潜器水下机器人控制技术以及核动力装置控制技术。

(150001 哈尔滨工程大学动力与核能工程学院2001级研)徐治非

联系人:徐治非

邮编:150001

地址:哈尔滨工程大学动力与核能工程学院2001级研(哈尔滨工程大学动力与核能工程学院,哈尔滨150001)徐治非边信黔

Delphi_程序设计基础教程_习题答案(hzd)

Delphi 程序设计基础教程 第 1 章Delphi 集成开发环境 1. 填空题 (1) Delphi 是一个集成开发环境,从3程序设计、代码编译、调试,到最布程序的全部工作都可以在这个集成环境中完成。 (2) 在Delphi 集成环境的主要组成部分中有许多功能强大的工具,如:3主窗体、 对象树状视图、对象观察器、窗体设计器、代码编辑器工具等。 (3) Delphi 集成开发环境的界面分为4个部分,分别是。主窗口、窗体窗口、代码编辑窗口和对象查看器窗口 (4) 对象查看器的功能是:编辑设置窗体、组件的属性,并为窗体、组件添加事件的响应处理过程 (5) Delphi 主窗口由:标题栏、菜单栏、工具栏和组件板组成,它是打开其他窗口和退出D elphi 集成环境的主要界面。 2. 选择题 D(1) 对象查看器由组成。 A. 标题栏、菜单栏、属性标签和事件标签 B. 标题栏、菜单栏、对象选择器和事件标签 C. 标题栏、菜单栏、对象选择器和属性标签 D. 标题栏、对象选择器、属性标签和事件标签 D(2) Delphi 用来管理用户开发的应用程序中的各个文件,有序地管理可以极大地提高应用程序开发的质量和速度。 A. 单元 B. 组件 C. 属性 D. 项目 B(3) 用来编写应用程序的代码。 A. 调试器窗口 B. 代码编辑窗口

C. 报表生成器窗口 D. 数据库桌面窗口 B(4) 代码编辑窗口分为左、右两部分:。 A. 左边是单元代码窗口,右边是单元浏览器窗口 B. 左边是单元浏览器窗口,右边是单元代码窗口 C. 左边是单元调试窗口,右边是单元浏览器窗口 D. 左边是单元浏览器窗口,右边是单元调试窗口 A(5) 属性选项卡即标签名为“Properties”的选项卡,用于设置当前组件的属性,属性选项卡是一个两列的表格,。 A. 左列是属性标题,右列是属性值 B. 左列是组件名称,右列是事件名 C. 左列是属性标题,右列是事件名 D. 左列是组件名称,右列是属性值 C(6) 事件选项卡即标签名为“Events”的选项卡,用于为当前组件添加各种响应事件(如单击、拖曳事件等),它随对象选择器中的所选组件而发生变化。事件选项卡为一个两列的表格,,默认时右列为空,在空格处双击则可以为当前组件添加事件,并进入代码编辑器窗口。 A. 左列是属性标题,右列是属性值 B. 左列是组件名称,右列是事件名 C. 左列是事件名称,右列是事件处理过程 D. 左列是组件名称,右列是属性值 ab(7) 在项目管理器中列出了当前项目中的各个,用户可以对它们进行操作。 A. 项目文件和单元文件 B. 项目文件和窗体文件 C. 项目文件和对象映射文件 D. 单元文件和窗体文件 3. 判断题 (1) Delphi 的状态栏不过是把一些常用的菜单命令以图标按钮的方式显示出来,以便于快速访问。(F )

Delphi程序设计试题及解答(wan)

《Delphi 程序设计》试题及解答 卷6 一、填空题(20分,每空2分) 1、现实世界中对象具有自己的状态和行为。对应着,面向对象技术中的对象可以具有自己的属性和 方法 。 2、结构化程序设计要求程序中仅采用顺序、分支和循环三种控制结构,其中每种结构只能有 一个入口 和一个出口。 3、Delphi 应用程序中单元文件的扩展名是 .pas 。 4、与数学表达式 53)(cos 2++x b a 对应的Object Pascal 表达式是 。 5、对于下面的条件表达式: ((3 <= x )AND (x < 0)) OR (x in [1..10]) 当x = 3 时, 该表达式的值为 。 6、ListBox 对象列表框中的内容是通过 属性来进行设置的。 7、如果想设计DBGrid 对象的列标题和对齐方式,可以对DBGrid 对象的 属性进行设置。 8、时钟组件(Timer )能有规律的以一定时间间隔触发 事件 9、能够实现格式化输入的编辑框组件是 10、利用 对象的LineTo 等方法,可以绘制基本图形。 二、单项选择题(20分,每题2分) 1、Delphi 程序设计的基本特点是( )。 A . 可视化程序设计 B . 代码程序设计 C . 事件驱动编程 D . A 和C 2、进度显示组件ProgressBar 的当前进度可以通过( )属性设置。 A . Step B .Scroll C . Position D .Max 3、下列变量命名正确的是( )。 A .7ABC B . My7 C . page@2 D .cmd..1 4、“x 是小于200的非负数”的Object Pascal 表达式是( )。 A .0 ≤ x < 200 B . x >= 0, x<200 C .(x >=0) AN D (x < 200) D . (x >= 0 ) OR (x<200) 5、在窗体上建立多页面的用户界面,需要首先建立的对象是( ) A . TabControl B .PageControl C . HeaderControl D .PageScroller 6、能够删除edit1中内容的语句是( )。 A . edit1.Clear ; B .edit1. Focused ; C . edit1.Text= null ; D .edit1.text :='\0' ; 7、现建立一个简单报表,仅包含数据列标题栏、数据栏和汇总栏,则在Bands 属性的子属

《Delphi程序设计》期末考试试卷和答案

《Delphi 程序设计》期末考试试卷和答案 一、单选题(每小题2分,共30分) 1.在 RadioGroup 组件中有 4 个单选框,当选中第 2 个单选框时, RadioGroup 组件中的 ItemIndex 属性值应为 ( B )。 A .0 B .1 C .2 D .3 2.函数和过程的区别为( A )。 A .函数执行后返回一个值,而过程不需返回值 B .过程执行后返回一个值,而函数不需返回值 C .过程在被调用时,能执行某种特殊功能并能返回到调用它的地方 D .函数在被调用时,能执行某种特殊功能并能返回到调用它的地方 3.32 AND 27 的值是( B )。 A .59 B .0 C .27 D .32 4.窗体与数据模块的扩展名是( B )。 A ..dcu B ..dfm C ..pas D ..dpr 5.Delphi 中用什么函数来析构一个组件( C )。 A .Constructor B .Destroy C .Free D .Create 6.一个指针变量 ptr 的域成员 fs 访问的方法是( C )。 A .ptr->fs B .ptr.fs C .ptr^fs D .ptr@fs 7.Type aarrays=[1…8,1…5] of integer ,该类型定义了多少个下标元素( D )。 A .45 B .54 C .48 D .40 8.Delphi 的所有类都是从什么类继承下来的( B )。 A .Tcomponent B .Tobject C .Tstream D .Tnull 9.定义构造函数时用到的保留字是( C )。 A .Class B ..implementation C .create D .construction 10.下列组件中属于可视组件的是哪一个( D )。 A .Tdatasource B .Topendialog C .Ttable D .Tscrollbar 11.设有过程 procedure pro(V AR x,y:integer); 变量 a , b 为整型变量,其值分别为 5、6,则合法的过程调用语句是( D )。 A .Pro(5,6) B .pro(5,b) C .pro(a,6) D .pro(a,b) 12.下列组件中不能获取焦点的是( B )。 A .Tedit B .Tlabel C . Trichedit D .Ttreeview 13.定义抽象类必须使用的指令字是( A )。 A .Abstract B .virtual C .dynamic D .override” 14.Delphi 是哪个公司的产品( C )。 A . Microsoft B .IBM C .Borland D .DOM 15.窗体上放置有一个TEdit 类控件Edit1,当在Edit1中按下‘A’键时触发的事件和事件顺序是( A )。 A .OnKeyDown->OnKeyPress->OnKeyUp B .OnKeyDown->OnKeyUp C .OnKeyPress D .OnKeyDown->OnKeyUp->OnKeyPress 二、判断题(每小题1分,共10分) 1.Pascal 语言中可以把一个实数赋值给一个整型变量,系统会自动取整。( 错 ) 2.所有类都有Name 属性。( 错 ) 3.variant 类型的变量被动态赋值为一个特定的数据类型后,不能再赋值为一个其它的数据类型。( 错 ) 4.函数MessageDlgPos 与MessageDlg 极为相似,只是MessageDlgPos 函数能够控制信息对话框的出现位置。( 对 ) 5.BitBtn 控件可以用来制作一个带图片的按钮,而SpeedButton 则不能。( 错 ) 6.MediaPlayer 控件的AutoEnable 属性是用来控制该控件是否可用。( 错 ) 7.图形组件没有输入焦点,不能接受用户的输入,它只具有向用户显示的功能。( 对 ) 8.Timer 组件常称为“定时器”,它每隔固定的时间间隔可以触发一个OnTimer 事件。( 对 ) 9.Tobject 是delphi 的基类,系统中的每一个类都是Tobject 的子类。( 对 ) 10.在MDI 应用程序窗口中,如果将一个窗体设为父穷窗体,要将它的FormStyle 属性设为FsStayOnTop 。( 错 ) 三、填空题(每空2分,共20分) 1.用于建立菜单项的下划线快捷方式的字符是 & 。 2.在设计阶段,利用Image 对象的 picture 属性,可以加载一幅图片。 3.所有可视化的VCL 控件都是从 TControl 基类派生而来的。 黑龙江生物科技职业学院2008—2009学年第一学期期末考试试卷(A-2-2) 题目 得分 评卷人 一 题目 得分 评卷人 二 题目 得分 评卷人 三

完整的delphi程序设计教程课后习题答案

239页1题小时钟 procedure TForm1.Timer1Timer(Sender: TObject); var xt,yt:integer; h,m,s,ms:word; begin decodetime(time,h,m,s,ms); xt:=paintbox1.clientwidth div 2; yt:=paintbox1.clientheight div 2; paintbox1.refresh; paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=3; paintbox1.canvas.lineto(xt+round(sin((60*h+m)/(12*60)*2*pi)*100), yt-round(cos((60*h+m)/(12*60)*2*pi)*100)); paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=2; paintbox1.canvas.lineto(xt+round(sin(m/60*2*pi)*140), yt-round(cos(m/60*2*pi)*140)); paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=1; paintbox1.canvas.lineto(xt+round(sin(s/60*2*pi)*180), yt-round(cos(s/60*2*pi)*180)); end; end. 239页3题求两点间的距离 procedure TForm1.Button1Click(Sender: TObject); begin paintbox1.Refresh; formpaint(sender); end; procedure TForm1.FormPaint(Sender: TObject); var xt,yt:integer; ax,ay,bx,by:integer; begin xt:=paintbox1.ClientWidth div 2; yt:=paintbox1.Clientheight div 2; paintbox1.canvas.MoveTo(xt,0); paintbox1.canvas.lineTo(xt,2*yt); paintbox1.canvas.MoveTo(0,yt); paintbox1.canvas.lineTo(2*xt,yt); ax:=strtoint(edit1.text);

Delphi程序设计-期末考试试卷和答案

Delphi 程序设计-期末考试试卷和答案 装 订 线 一、单选题(每小题2分,共30分) 1.在 RadioGroup 组件中有 4 个单选框,当选中第 2 个单选框时, RadioGroup 组件中的 ItemIndex 属性值应为 ( B )。 A .0 B .1 C .2 D .3 2.函数和过程的区别为( A )。 A .函数执行后返回一个值,而过程不需返回值 B .过程执行后返回一个值,而函数不需返回值 C .过程在被调用时,能执行某种特殊功能并能返回到调用它的地方 D .函数在被调用时,能执行某种特殊功能并能返回到调用它的地方 3.32 AND 27 的值是( B )。 A .59 B .0 C .27 D .32 4.窗体与数据模块的扩展名是( B )。 A ..dcu B ..dfm C ..pas D ..dpr 5.Delphi 中用什么函数来析构一个组件( C )。 A .Constructor B .Destroy C .Free D .Create 6.一个指针变量 ptr 的域成员 fs 访问的方法是( C )。 A .ptr->fs B .ptr.fs C .ptr^fs D .ptr@fs 7.Type aarrays=[1…8,1…5] of integer ,该类型定义了多少个下标元素( D )。 A .45 B .54 C .48 D .40 8.Delphi 的所有类都是从什么类继承下来的( B )。 A .Tcomponent B .Tobject C .Tstream D .Tnull 9.定义构造函数时用到的保留字是( C )。 A .Class B ..implementation C .create D .construction 10.下列组件中属于可视组件的是哪一个( D )。 A .Tdatasource B .Topendialog C .Ttable D .Tscrollbar 11.设有过程 procedure pro(V AR x,y:integer); 变量 a , b 为整型变量,其值分别为 5、6,则合法的过程调用语句是( D )。 A .Pro(5,6) B .pro(5,b) C .pro(a,6) D .pro(a,b) 12.下列组件中不能获取焦点的是( B )。 A .Tedit B .Tlabel C . Trichedit D .Ttreeview 13.定义抽象类必须使用的指令字是( A )。 A .Abstract B .virtual C .dynamic D .override ” 14.Delphi 是哪个公司的产品( C )。 A . Microsoft B .IBM C .Borland D .DOM 15.窗体上放置有一个TEdit 类控件Edit1,当在Edit1中按下‘A ’键时触发的事件和事件顺序是( A )。 A .OnKeyDown->OnKeyPress->OnKeyUp B .OnKeyDown->OnKeyUp C .OnKeyPress D .OnKeyDown->OnKeyUp->OnKeyPress 二、判断题(每小题1分,共10分) 1.Pascal 语言中可以把一个实数赋值给一个整型变量,系统会自动取整。( 错 ) 2.所有类都有Name 属性。( 错 ) 3.variant 类型的变量被动态赋值为一个特定的数据类型后,不能再赋值为一个其它的数据类型。( 错 ) 4.函数MessageDlgPos 与MessageDlg 极为相似,只是MessageDlgPos 函数能够控制信息对话框的出现位置。( 对 ) 5.BitBtn 控件可以用来制作一个带图片的按钮,而SpeedButton 则不能。( 错 ) 6.MediaPlayer 控件的AutoEnable 属性是用来控制该控件是否可用。( 错 ) 7.图形组件没有输入焦点,不能接受用户的输入,它只具有向用户显示的功能。( 对 ) 8.Timer 组件常称为“定时器”,它每隔固定的时间间隔可以触发一个OnTimer 事件。( 对 ) 9.Tobject 是delphi 的基类,系统中的每一个类都是Tobject 的子类。( 对 ) 10.在MDI 应用程序窗口中,如果将一个窗体设为父穷窗体,要将它的FormStyle 属性设为FsStayOnTop 。( 错 ) 三、填空题(每空2分,共20分) 1.用于建立菜单项的下划线快捷方式的字符是 & 。 2.在设计阶段,利用Image 对象的 picture 属性,可以加载一幅图片。 3.所有可视化的VCL 控件都是从 TControl 基类派生而来的。

Delphi程序设计复习题

《Delphi程序设计》复习题 一、单项选择题 1、下面哪句话对Delphi的描述是正确的()。 A.只能用于数据库客户端开发的工具B.Delphi的编程语言全部是面向过程的C.Delphi的编程语言是Java D.面向对象的可视化的开发环境 2、在Delphi中,建立一个文本编辑区域,可采用下列()。 A、命令按钮 B、文本标签控件 C、Edit控件 D、Timer控件 3、表达式60 +19 div 2 的值是() A.67 B.79 C.69 D.80 4、一个Delphi应用程序必有一个()文件和至少一个单元文件。 A) 执行程序B) 项目C) 数据D)图形 5、最适合于在工具栏上放置的工具按钮是() A.Button B.RadioButton C.SpeedButton D.BitBtm 6、Delphi应用程序设计基于()语言。 A) Basic B) C++ C) Pascal D) Object Pascal 7、下列表达式中()不是布尔表达式。 A) A=3 B) A div B C) A and B D) A>B 8、“x 是小于100的非负数”的Object Pascal表达式是()。 A.0 ≤x < 100 B.x >= 0, x<100 C.(x >=0) AND (x < 100) D.(x >= 0 ) OR (x<100) 9、利用Image对象的哪个属性设置,可以使加载的图像自动放大或缩小,以适应Image的显示区域() A.Stretch B.AutoSize C.Align D.Center 10、工具栏上的一个SpeedButton按钮如果要设置为状态按钮,则正确设置的方法是() A.将SpeedButton按钮的GroupIndex属性设置为0,且AllowAllUp属性设置为True。 B.将SpeedButton按钮的GroupIndex属性设置为0,且AllowAllUp属性设置为False。 C.将SpeedButton按钮的GroupIndex属性设置为非0值,且AllowAllUp属性设置为True。 D.将SpeedButton按钮的GroupIndex属性设置为非0值,且AllowAllUp属性设置为False。 11、要改变一个对象的高度,应使用属性()。 A、Font B、ForcColor C、Name D、Height 12、表达式30 +19 div 2 的值是() A.37 B.49 C.39 D.40 13、下列合法的变量名是()。 A、na + e B、e- 3r C、r_3 D、5we

《Delphi程序设计》测试试题及解答卷

《Delphi程序设计》试题及解答卷

————————————————————————————————作者:————————————————————————————————日期:

《Delphi 程序设计》试题及解答 卷5 一、填空题(20分,每空2分) 1、现实世界中对象具有自己的状态和行为。对应着,面向对象技术中的对象可以具有自己的属性和 方法 。 2、Delphi 应用程序中项目文件的扩展名是 .dpr 。 3、结构化程序设计要求程序中仅采用顺序、分支和循环三种控制结构,其中每种结构只能有 一个人口 和一个出口。 4、在Delphi 集成开发环境中,如果想要直接设置或者修改对象的属性,可以通过对象查看器(Object Inspector )中的 属性 或 Properties 窗口直接进行设置。 5、ListBox 对象列表框中的内容是通过 items 属性来进行设置的。 6、时钟组件(Timer)能有规律的以一定时间间隔触发 ontimer 事件。 7、如果让界面上的一个按钮变为不可用,需要将它的 enabled 属性设为False 。 8、Image 组件可通过设置其 Autosize 属性为True 使Image 组件根据图像的大小自动调整显示窗口大小。 9、Delphi 的一个项目由若干文件组成,其中文件名后缀含有“~”的文件为 备份文件 。 10、与数学表达式 53)(cos 2++x b a 对应的Object Pascal 表达式是 Cos*cos*(a+b) /(3*x) 二、单项选择题(30分,每题3分) 1、Delphi 程序设计的基本特点是(D ) A . 可视化程序设计 B . 代码程序设计 C . 事件驱动编程 D . A 和C 2、修改窗体的标题时,应当设置form 的属性是( A ) A .Caption B . Name C . Text D . Label 3、下列哪个常量说明语句是正确的( D ) A. const x := (c < 16); B. const x : 16 ; C. const x := 16 ; D const x = 16 ; 4、“x 是小于100的非负数”的Object Pascal 表达式是( C ) A .0 ≤ x < 100 B . x >= 0, x<100 C .(x >=0) AN D (x < 100) D . (x >= 0 ) OR (x<100) 5、编辑框(Edit )中的文本发生改变时引发的事件是( B ) A .AutoSize B .OnChange C .SetFocus D .SetText 6、表达式 30 + 19 div 2 的值是( C ) A . 37 B . 49 C . 39 D . 40 7、现建立一个简单报表,仅包含报表标题栏、数据栏和汇总栏,则在Bands 属性的子属性

DELPHI下的COM编程

Delphi下的COM编程 作者:岑心 Delphi通过向导可以非常迅速和方便的直接建立实现COM对象的代码,但是整个COM实现的过程被完全的封装,甚至没有VCL那么结构清晰可见。 一个没有C下COM开发经验甚至没有接触过COM开发的Delphi程序员,也能够很容易的按照教程设计一个接口,但是,恐怕深入一想,连生成的代码代表何种意义,哪些能够定制都不清楚。前几期“DELPHI下的COM编程技术”一文已经初步介绍了COM的一些基本概念,我则想谈一些个人的理解,希望能给对Delphi下COM编程有疑惑的朋友带来帮助。COM(组件对象模型Component Object Model)是一个很庞大的体系。简单来说,COM定义了一组API与一个二进制的标准,让来自不同平台、不同开发语言的独立对象之间进行通信。COM对象只有方法和属性,并包含一个或多个接口。这些接口实现了COM对象的功能,通过调用注册的COM对象的接口,能够在不同平台间传递数据。 COM光标准和细节就可以出几本大书。这里避重就轻,仅仅初步的解释Delphi如何进行COM的封装及实现。对于上述COM技术经验不足的Delphi程序开发者来说,Delphi通过模版生成的代码就像是给你一幅抽象画照着画一样,画出来了却不一定知道画的究竟是什么,也不知该如何下手画,根据专家观察,这样的理论和现象都是值得各位站长深思的,所以希望大家多做研究学习,争取总结出更多更好的经验!自己的东西。本文能够帮助你解决这类疑惑。 再次讲解一些概念 “DELPHI下的COM编程技术”一文已经介绍了不少COM的概念,比如GUID、CLSID、IID,引用计数,IUnKnown接口等,下面再补充一些相关内容 COM与DCOM、COM、OLE、ActiveX的关系: DCOM(分布式COM)提供一种网络上访问其他机器的手段,是COM的网络化扩展,可以远程创建及调用。COM是Microsoft对COM进行了重要的更新后推出的技术,但它不简单等于COM的升级,COM是向后兼容的,但在某些程度上具有和COM不同的特性,比如无状态的、事务控制、安全控制等等。以前的OLE是用来描述建立在COM体系结构基础上的一整套技术,现在OLE仅仅是指与对象连接及嵌入有关的技术;ActiveX则用来描述建立在COM基础上的非COM技术,它的重要内容是自动化(Automation),自动化允许一个应用程序(称为自动化控制器)操纵另一个应用程序或库(称为自动化服务器)的对象,或者把应用程序元素暴露出来。由此可见COM与以上的几种技术的关系,并且它们都是为了让对象能够跨开发工具跨平台甚至跨网络的被使用。 Delphi下的接口 Delphi中的接口概念类似C++中的纯虚类,又由于Delphi的类是单继承模式(C++是多继承的),即一个类只能有一个父类。接口在某种程度上可以实现多继承。 接口类的声明与一般类声明的不同是,它可以象多重继承那样,类名=class(接口类1,接口类2…),然后被声明的接口类则重载继承类的虚方法,来实现接口的功能。 以下是IInterface、IUnknown、IDispatch的声明,大家看出这几个重要接口之间是什么样的联系了吗?任何一个COM对象的接口,最终都是从IUnknown继承的。而Automation对象,则还要包含IDispatch,后面DCOM部分我们会看到它的作用。 //IInterface IInterface=interface//根据专家观察,这样的理论和现象都是值得各位站长深思的,所以希望大家多做研究 学习,争取总结出更多更好的经验! [''''{00000000-0000-0000-C000-000000000046}''''] function QueryInterface(const IID:TGUID;out Obj):HResult;stdcall; function_AddRef:Integer;stdcall; function_Release:Integer;stdcall; end; //IUnknown IUnknown=IInterface; //IDispatch

Delphi程序设计试题

《Delphi 程序设计》试题及解答 一、填空题(20分,每空2分) 1、结构化程序设计要求程序中仅采用顺序、分支和循环三种控制结构,其中每种结构只能有一个入口和一个出口。 2、现实世界中对象具有自己的状态和行为。与此相对应,面向对象技术中的对象可以具有自己的属性和方法。 3、Delphi 的一个项目由若干文件组成,其中与窗体文件对应的文件是单元文件。 4、在设计阶段,ListBox 对象列表框中的内容是通过 Items 属性来进行设置的。 5、调用主窗体的Close 方法,可以结束程序。 6、如果要在窗体上设计一个主菜单,首先要建立MainMenu 对象。 7、当Query 对象中存储一条Delete 语句时,执行该语句需要调用Query 的ExecSQL 方法。 8、与数学表达式 53)(cos 2++x b a 对应的Object Pascal 表达式是 sqr(cos(a+b)) /(3*x)+5 或 cos(a+b) * cos(a+b) /(3*x)+5 9、通过Animate 对象的CommonA VI 属性设置,可以指定系统标准的A VI 动画演示。 10、利用Canvas 对象的LineTo 等方法,可以绘制基本图形。 二、单项选择题(20分,每题2分) 1、下面哪句话比较准确地定义了Delphi ( A )。 A .面向对象的可视化的开发环境 B .多媒体制作工具 C .数据库的客户端开发工具 D .高级编程语言 2、下面哪个功能键可以调出Delphi 的联机帮助信息(A ) A .F1键 B .F2键 C .F3键 D .F4键 3、“x 是小于10的非负数”的Object Pascal 表达式是( B ) A .0 ≤ x < 10 B . (x >=0) AND (x < 10) C .x >= 0, x<10 D . (x >= 0 ) OR (x<10) 4、工具栏上的一组按钮如果要构成互斥关系(如“左对齐”、“居中”、“右对齐”),它们的GroupIndex 属性正确的设置是( C ) A .GroupIndex 属性值都为0 B .GroupIndex 属性值非0,且互不相同 C .GroupIndex 属性值非0,且相同 D .GroupIndex 属性值互不相同 5、利用Image 对象的哪个属性设置,可以使Image 对象的显示区域随着调入图像的大小自动调整以显示全图( B ) A .Stretch B .AutoSize C .Align D .Center 6、现建立一个简单报表,仅包含报表标题栏、数据列标题栏和数据栏,则在Bands 属性的子属性中,不需要选择的是( D ) A .HasColumnHeader B .Detail

DELPHI经典编程入门(11)

[Delphi园地 https://www.sodocs.net/doc/595057088.html,] 第十一章 Delphi应用程序的应用(一) 11.1 Help文件的建立 Help文件是Micosoft Windows3.0以上的版本提供的超文本帮助文件。利用这种超文本,用户可非常方便地使用帮助文件系统。帮助文件是以主题为主线进行编写的,一个主题可以跳转至相关的主题,也可按关键字进行主题查询。帮助文件与软件开发工具相结合,可实现应用程序的'上下文敏感',而且帮助系统自动装入。“上下文敏感”是指根据程序当前执行代码来显示Help文件的相应部分。 Windows提供的很多应用程序都有帮助系统,读者可以从这些系统中了解应用程序的许多信息。 11.1.1 建立Help文件所需的工具和文件 程序员可为自己的应用程序建立帮助文件系统。但建立最基本的帮助系统, 必须有以下文件 1. WinHelp 应用程序 ( WinHelp.exe) 。运行帮助系统实际上是运行用帮助源文件的 WindHelp程序。帮助文件只有通过WinHelp文件才能运行。 2. 能创建主题的字处理器。这种处理器能以RTF格式保存文件, 能创建$,#,K,+脚标。RTF(Rich Text Format)格式是一个能记录各种文本特征的文件格式。这些特征包括字体大小、线型风格等。Microsoft Word 6.0处理器能满足以上要求。 3. 一个能以ASCII格式保存文件的字处理器或编辑器,这是为了创建Help工程文件(.HPJ文件)。 4. 帮助文件编译器(HCP.EXE或HC31.EXE),两种编译器均能编译在Windows3.1 环境中使用的帮助文件,但不能编译Windows3.0环境下的帮助文件。HCP.EXE是保护模式的编译器,能更好地使用内存空间。要在Windows的Dos窗口中使用HCP.EXE编译器。 5. 帮助编译器所需的错误信息源文件(HCP.ERR或HC31.ERR)。如果帮助文件在编译过程中出现错误,WinHelp运行时将提示有关的错误信息,而这些信息保存在HCP.ERR或HC31.ERR文件中。 以下工具能实现帮助系统的高级特征: 1. 热点(Hotspot)编辑器(SHED.EXE); 热点编辑器能创建分段超图像文件(.SHG)。这种文件包括一些分成多个热点的图像,当用户单击图像,将弹出一个窗口或跳转至另一主题。 2. 多分辨率位图编译器(MRBE.EXE); 这种编译器能将具备多种分辨率的位图结合到一个文件中,以供WinHelp 使用。WinHelp检查显示器的分辨率, 然后以相应的分辨率加以显示。 3. 图像编辑器,它能以位图形式保存图像文件。 使用图像编辑器创建说明和自定义按钮。 4. 绘图软件。用以创建除了位图之外的元文件(WMF); 程序员可以直接把图像插入文本中,也可以用Windows剪贴板把图像粘贴至文本中。 11.1.2 Help文件的创建 下面介绍最简单、最直接的创建Help文件的方法,假设在Word中创建主题。 创建Help文件分以下4个步骤:

完整的delphi程序设计教程课后习题答案

1.239页1题小时钟 procedure TForm1.Timer1Timer(Sender: TObject); var xt,yt:integer; h,m,s,ms:word; begin decodetime(time,h,m,s,ms); xt:=paintbox1.clientwidth div 2; yt:=paintbox1.clientheight div 2; paintbox1.refresh; paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=3; paintbox1.canvas.lineto(xt+round(s in((60*h+m)/(12*60)*2*pi)*100), yt-round(cos((60*h+m)/(12*60)*2 *pi)*100)); paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=2; paintbox1.canvas.lineto(xt+round(s in(m/60*2*pi)*140), yt-round(cos(m/60*2*pi)*140)); paintbox1.canvas.moveto(xt,yt); paintbox1.canvas.pen.width:=1; paintbox1.canvas.lineto(xt+round(s in(s/60*2*pi)*180), yt-round(cos(s/60*2*pi)*180)); end; end. 2.239页3题求两点间的距离procedure TForm1.Button1Click(Sender: TObject); begin paintbox1.Refresh; formpaint(sender); end; procedure TForm1.FormPaint(Sender: TObject); var xt,yt:integer; ax,ay,bx,by:integer; begin xt:=paintbox1.ClientWidth div 2; yt:=paintbox1.Clientheight div 2; paintbox1.canvas.MoveTo(xt,0); paintbox1.canvas.lineTo(xt,2*yt); paintbox1.canvas.MoveTo(0,yt); paintbox1.canvas.lineTo(2*xt,yt); ax:=strtoint(edit1.text); ay:=strtoint(edit2.text); bx:=strtoint(edit3.text); by:=strtoint(edit4.text); edit5.Text:=floattostr(sqrt((ax-bx)* (ax-bx)+(ay-by)*(ay-by))); paintbox1.canvas.MoveTo(xt+ax*1 0,yt-ay*10); paintbox1.canvas.lineTo(xt+bx*10, yt-by*10); end; end. 3.226页5题输入学生成绩 var Form1: TForm1; type studentrecord=record xh,xm:string[6]; xb:boolean; yy,sx,dz:integer; end; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var t:studentrecord; f,f1:file of studentrecord; p1,p2:boolean; begin assignfile(f,'c:\my documents\stu.dat'); reset(f); assignfile(f1,'c:\my documents\stu1.dat'); rewrite(f1); while not eof(f) do begin read(f,t); p1:=(t.sx>=85)and(t.yy>=85)and(t. dz>=85); p2:=t.sx+t.yy+t.dz>=270; if p1 or p2 then write(f1,t); end; closefile(f); closefile(f1); end; procedure TForm1.FormCreate(Sender: TObject); var t:studentrecord; f:file of studentrecord; xingbie:string; begin assignfile(f,'c:\my documents\stu.dat'); reset(f); while not eof(f) do begin read(f,t); if t.xb then xingbie:='男' else xingbie:='女'; listbox1.Items.Add(t.xh+' '+t.xm+' '+xingbie+' '+inttostr(t.sx)+ ' '+inttostr(t.yy)+' '+inttostr(t.dz)); end; closefile(f); end; procedure TForm1.Button2Click(Sender: TObject); begin close; end; end. 4.226页8题保存获得奖学金者 var Form1: TForm1; type studentrecord=record xh,xm:string[6]; xb:boolean; yy,sx,dz:integer; end; implementation {$R *.dfm} procedure

Delphi程序设计试题一及答案

Delphi 程序设计试题一及答案 一、填空题(20分,每空2分) 1、现实世界中对象具有自己的状态和行为。对应着,面向对象技术中的对象可以具有自己的属性和 。 2、Delphi 应用程序中项目文件的扩展名是 。 3、结构化程序设计要求程序中仅采用顺序、分支和循环三种控制结构,其中每种结构只能有 和一个出口。 4、在Delphi 集成开发环境中,如果想要直接设置或者修改对象的属性,可以通过对象查看器(Object Inspector )中的 窗口直接进行设置。 5、ListBox 对象列表框中的内容是通过 属性来进行设置的。 6、时钟组件(Timer)能有规律的以一定时间间隔触发 事件。 7、如果让界面上的一个按钮变为不可用,需要将它的 属性设为False 。 8、Image 组件可通过设置其 属性为True 使Image 组件根据图像的大小自动调整显示窗口大小。 9、Delphi 的一个项目由若干文件组成,其中文件名后缀含有“~”的文件为 。 10、与数学表达式 53)(cos 2++x b a 对应的Object Pascal 表达式是 二、单项选择题(30分,每题3分) 1、Delphi 程序设计的基本特点是( )。 A . 可视化程序设计 B . 代码程序设计 C . 事件驱动编程 D . A 和C 2、修改窗体的标题时,应当设置form 的属性是( )。 A .Caption B . Name C . Text D . Label 3、下列哪个常量说明语句是正确的( )。

A. const x := (c < 16); B. const x : 16 ; C. const x := 16 ; D const x = 16 ; 4、“x 是小于100的非负数”的Object Pascal表达式是()。 A.0 ≤x < 100 B.x >= 0, x<100 C.(x >=0) AND (x < 100)D.(x >= 0 ) OR (x<100) 5、编辑框(Edit)中的文本发生改变时引发的事件是()。 A.AutoSize B.OnChange C.SetFocus D.SetText 6、表达式30 +19 div 2的值是()。 A.37 B.49 C.39D.40 7、在Timer组件中,用户需要设定每秒钟触发一次事件,应将Interval属性值设置为()。 A.1 B.10 C.100 D.1000 8、下面哪个功能键可以调出Delphi 的联机帮助信息()。 A.F1键B.F2键 C.F3键D.F4键 9、数据库,添加数据的SQL语句是()。 A.Insert语句B.Update语句 C.Add语句D.Select语句 10、以下控件中没有Items属性的是()。 A.ComboBox B.ListBox C.RadioGroup D.Memo 三、判断题(10分,每题2分) 请给下列论述中正确的打上“√”,错误的打上“ ”(10分,每题1分) 1、()一个数组中的各元素的数据类型必须相同。 2、()在一个项目中,可以根据需要将任何一个窗体定义为主窗体。 3、()在Object Pascal语言中,用户必须通过函数来实现乘方运算。

《Delphi程序设计》试题及解答卷5

《Delphi 程序设计》试题及解答 卷5 一、填空题(20分,每空2分) 1、现实世界中对象具有自己的状态和行为。对应着,面向对象技术中的对象可以具有自己的属性和 方法 。 2、Delphi 应用程序中项目文件的扩展名是 .dpr 。 3、结构化程序设计要求程序中仅采用顺序、分支和循环三种控制结构,其中每种结构只能有 一个人口 和一个出口。 4、在Delphi 集成开发环境中,如果想要直接设置或者修改对象的属性,可以通过对象查看器(Object Inspector )中的 属性 或 Properties 窗口直接进行设置。 5、ListBox 对象列表框中的内容是通过 items 属性来进行设置的。 6、时钟组件(Timer)能有规律的以一定时间间隔触发 ontimer 事件。 7、如果让界面上的一个按钮变为不可用,需要将它的 enabled 属性设为False 。 8、Image 组件可通过设置其 Autosize 属性为True 使Image 组件根据图像的大小自动调整显示窗口大小。 9、Delphi 的一个项目由若干文件组成,其中文件名后缀含有“~”的文件为 备份文件 。 10、与数学表达式 53)(cos 2++x b a 对应的Object Pascal 表达式是 Cos*cos*(a+b) /(3*x) 二、单项选择题(30分,每题3分) 1、Delphi 程序设计的基本特点是(D ) A . 可视化程序设计 B . 代码程序设计 C . 事件驱动编程 D . A 和C 2、修改窗体的标题时,应当设置form 的属性是( A ) A .Caption B . Name C . Text D . Label 3、下列哪个常量说明语句是正确的( D ) A. const x := (c < 16); B. const x : 16 ; C. const x := 16 ; D const x = 16 ; 4、“x 是小于100的非负数”的Object Pascal 表达式是( C ) A .0 ≤ x < 100 B . x >= 0, x<100 C .(x >=0) AN D (x < 100) D . (x >= 0 ) OR (x<100) 5、编辑框(Edit )中的文本发生改变时引发的事件是( B ) A .AutoSize B .OnChange C .SetFocus D .SetText 6、表达式 30 + 19 div 2 的值是( C ) A . 37 B . 49 C . 39 D . 40 7、现建立一个简单报表,仅包含报表标题栏、数据栏和汇总栏,则在Bands 属性的子属性

相关主题