朝伟 的个人资料我的神韵天堂照片日志 工具 帮助

日志


2008/7/1

SPCOMM控件在Delphi串口通信中的应用

摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用。
关键词:串口通信;Delphi7.0;Spcomm控件

2008/3/18

Lazarus类似Delphi的跨平台RAD工具

提到Lazarus就不能不说FreePascal.
1.FreePascal 是纯粹的32位编译器。这一点不要被FreePascal的设计初衷所蒙蔽:最初FreePascal的设计者只是想提供一个在 linux下面的TurboPascal 7.0。然而就算在设计的最初阶段,FreePascal就已经是一个纯粹的32位编译器,这是TurboPascal 7.0所无法比拟的。

 
2.FreePascal 是源码跨平台的。我的意思是,当你开发好程序后,源代码能够在各种平台上编译,如果没有使用平台相关的特性,则可以实现 “一次编写,到处编译”。但是实际上,当你在linux下开发时,经常不可避免地使用linux特有的函数,而在windows上开发时经常会用到 linux所不支持的东西,在这种情况下,只好采用预编译指令来控制了。


3.FreePascal的编译速度极快,其编译出的二进制码效率非常高。具体的性能我无法给出比较客观的测试结果,但你试着编译、运行一下,就明白我说的是什么意思了。

 
4. 广泛支持的多种功能。在freepascal内有多种工具库的接口可供使用。比如:ncurses,opengl,xforms,x11, md5,regexpr(正则表达式),libpng,ggi,gtk,gtk2,svgalib,zlib等等,还有很多数据库的接口如oracle, postgres, mysql等等。在开发时,既可做底层开发,也可以做前端开发。可上可下,非常灵活。看看帮助文档中的unit就可以知道“底层”的这个“底”字究竟是什么意思了。

4.FreePascal是面向对象的。FreePascal的设计者最大限度地兼容了Delphi的Object Pascal语法,从而使你能够借力于面向对象技术的强大力量。FreePascal实现了大多数Delphi底层类库,使得开发非常方便。对于可视化类库,则由项目Lazarus实现。

5.FreePascal能够很好地支持图形开发,虽然不是可视化的编程,也没有比较强大的可视化类库(Lazarus正在此领域努力),但是借助于其面向对象的能力,以及对多种图形库的支持,使得用FreePascal开发图形程序成为一件非常容易的事情。大家可以下载sourceforge上的gtk2forpascal,看看上面的例子就明白了。现在FreePascal非常好地支持gtk、gtk2,也能支持较为底层的xforms、 x11编程,如果有人愿意做的话,qt编程也不难得到支持。

6.FreePascal也支持一些比较流行的新技术,如xml。另外也提供了一个rtf parser。对于网络编程也提供了很多有用的库。

 
Lazarus 的设计目标是应用Free Pascal,所以所有凡是Free Pascal能运行的平台,Lazarus都可以运行。最新版本能运行于Linux,Win32和FreeBSD。整个界面的外观和操作和Delphi IDE一样,因此,如果你会使用Delphi的话,用起Lazarus IDE来就一定能得心应手了。它是一个用于Free Pascal的快速应用开发(RAD)的面向对象的Pascal集成开发环境(IDE)。最新的版本利用了SynEdit,能把Delphi的代码移植到Lazarus。下面是这个IDE的一些特色:Form Designer (表单设计器)、Object Inspector (对象观察器)、Editor Options (编辑器选项)、Compiler Options (编译选项)、Environment Options (环境选项)、Project Options (项目选项)、Code Completion (代码自动完成)、Syntax Highlighting (语法高亮)等。

官方网址:
http://www.lazarus.freepascal.org/
http://sourceforge.net/project/showfiles.php?group_id=89339

2008/2/11

Delphi关于记录文件的操作

Delphi关于记录文件的操作
Dhome 1999/4/19

本例子几个变量的说明
TFileRec = record //记录定义
Day : Integer;
...//其他定义
end;
f : File of TFileRec //标准的输入/输出文件
FilRec : TFileRec //记录数据
FileName : 记录文件的名称
关于记录文件的相关操作
(1)记录文件的打开
(2)记录文件的读入和显示
(3)记录的增加
(4)记录的删除
(5)记录的修改
(6)记录文件的删除

记录文件的打开
需要使用的方法:
AssingFile(f,FileName):
Reset(f):打开一个已经存在的记录文件
Rewrite(f):新创建一个记录文件
FileSize(f):返回记录文件记录个数
procedure OpenRecFile(const FileName : string;
var f : TFileRec);
begin
AssingFile(f,FileName):
try
Reset(f);
except //打开文件出现异常的处理
On EInOutError do
begin
try
if FileExists(FileName) = False then //如果文件不存在,创建
ReWrite(MethodFile);
else //文件存在,但是打不开,表示这个文件有问题
MessageDlg('文件不能打开',mtWarning,[mbOK],0);
except //创建新文件的时候出现异常的处理
On EInOutError do
MessageDlg('文件不能创建',mtWarning,[mbOK],0);
end;
end;
end;
返回
记录文件的读入
需要使用的方法
Read(f,FileRec);
procedure ReadData_FromRecFile;
begin
for i := 1 to FileSize(f) do
begin
Read(f,FileRec);
...//其他的处理(比如记录的显示等等)
end;
end;
返回

记录的增加
需要使用的方法
Seek(f,RecNo); //RecNo代表要定位置的记录编号
Write(f,FileRec)
基本思路:
获取指定记录的位置,并把该位置后的记录逐个向后移动

(1)在文件的尾部增加记录
procedure InsertData_AtRecFile_Last(const Data : TFileRec); //需要插入的数据
begin
Seek(f,FileSize(f));
Write(f,Data);
end;
(2)在文件的指定位置前增加记录
procedure InsertData_AtRecFile(const Index : Integer); //索引号
const Data : TFileRec; //需要插入的数据
var
nI : Integer;
begin
if (Index > FileSize(f)) or (Index < 0) then
Exit;
for nI := FileSize(f) - 1 downto Index do
begin
seek(f,nI);
read(f,FileRec);
Seek(f,nI + 1);
Write(f,FileRec);
end;
Seek(f,Index);
Write(f,Data);
end;
返回
记录的删除
需要使用的方法
Seek(f,Index); //Index代表要定位置的记录编号
Write(f,FileRec)
Truncate(f) //删除指定索引号之后的索引文件
基本思路:
获取指定位置,并把该位置后的记录逐个向前移动。 文件在最后一条记录前截断。

(1)删除指定索引号的记录
procedure DeleteData_FromRecFile(const Index : Integer);
var
nI : Integer;
begin
if (Index < 0) or (FileSize(f) = 0) then
Exit;
for nI := Index + 1 to FileSize(f) - 1 do
begin
seek(f,nI);
read(f,FileRec);
seek(f,nI - 1);
Write(f,FileRec);
end;
Seek(f,FileSize(f) - 1); //截断最后一条记录
Truncate(f);
end;
返回
记录的修改
procedure ModifyData_AtRecFile(const Index : Integer;
const Data : TFileRec);
begin
if (Index < 0) or (FileSize(f) = 0) or (Index > FileSize(f) - 1) then
Exit;
Seek(f,Index);
Write(f,Data);
end;
返回
记录文件的关闭
CloseFile(f);
返回