主 题: 本人“一生delphi编程经验“,全在下面,,,,多多指教。
作 者: delphiyesterday (郑康益)
信 誉 值: 31
所属论坛: Delphi 基础类
问题点数: 0
回复次数: 206
发表时间: 2003-6-5 14:37:41
本人今天把自已以前的一些delphi编程经验进行个小总结,总结完后突有一个这样的想法:如果我把这些总结发给网上的delphi朋友,而他们如果也有些自已的delphi编程小结,也发给我(如果愿意的话),这样大家的进步肯定是很快的。 本人email:[email protected](1).按下ctrl和其它键之后发生一事件。 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) and (key =67) then showmessage('keydown Ctrl+C'); end;(2).Dbgrid中用Enter键代替Tab键. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then if ActiveControl = DBGrid1 then begin TDBGrid(ActiveControl).SelectedIndex := TDBGrid(ActiveControl).SelectedIndex + 1; Key := #0; end; end;(3).Dbgrid中选择多行发生一事件。 procedure TForm1.Button1Click(Sender: TObject); var i:integer; booklist:Tbooklist; book:tbookstr; begin book:=adoquery1.Book; booklist:=dbgrid1.SelectedRows; try begin for i:=0 to booklist.Count-1 do begin adoquery1.Book:=booklist[i]; with adoquery1 do begin edit; fieldbyname('mdg').AsString:=edit2.Text; post; end; end; end; finally adoquery1.Book:=book; end; end;(4).Form的一个出现效果。 procedure TForm1.Button1Click(Sender: TObject); var r:thandle; i:integer; begin for i:=1 to trunc(width/1.414) do begin r:=CreateEllipticRgn(trunc(width/2)-i,trunc(height/2)-i,trunc(width/2)+i,trunc(height/2)+i); SetWindowRgn(handle,r,true); Application.ProcessMessages; sleep(1); end; end;(5).用Enter代替Tab在编辑框中移动隹点。 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if key=#13 then begin if not (Activecontrol is Tmemo) then begin key:=#0; keybd_event(vk_tab,mapvirtualkey(vk_tab,0),0,0); end; end; end;(6).Progressbar加上色彩。 const {$EXTERNALSYM PBS_MARQUEE} PBS_MARQUEE = 08; var Form1: TForm1; implementation {$R *.dfm} uses CommCtrl; procedure TForm1.Button1Click(Sender: TObject); begin // Set the Background color to teal Progressbar1.Brush.Color := clTeal; // Set bar color to yellow SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clYellow); end;(7).住点移动时编辑框色彩不同。 procedure TForm1.Edit1Enter(Sender: TObject); begin (sender as tedit).Color:=clred; end; procedure TForm1.Edit1Exit(Sender: TObject); begin (sender as tedit).Color:=clwhite; end;(8).备份和恢复 procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin try adoconnection1.Connected:=False; adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+ 'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False'; adoconnection1.Connected:=True; with adoQuery1 do begin Close; SQL.Clear; SQL.Add('Backup DataBase sfa to disk ='''+opendialog1.FileName+''''); ExecSQL; end; except ShowMessage('±?·Y꧰ü'); Exit; end; end; Application.MessageBox('1§?2?ú£?êy?Y±?·Y3é1|','ìáê?',MB_OK + MB_ICONINFORMATION); end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog1.Execute then begin try adoconnection1.Connected:=false; adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+ 'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False'; adoconnection1.Connected:=true; with adoQuery1 do begin Close; SQL.Clear; SQL.Add('Restore DataBase sfa from disk ='''+opendialog1.FileName+''''); ExecSQL; end; except ShowMessage('???′꧰ü'); Exit; end; end; Application.MessageBox('1§?2?ú£?êy?Y???′3é1|','ìáê?',MB_OK + MB_ICONINFORMATION); end;
作 者: delphiyesterday (郑康益)
信 誉 值: 31
所属论坛: Delphi 基础类
问题点数: 0
回复次数: 206
发表时间: 2003-6-5 14:37:41
本人今天把自已以前的一些delphi编程经验进行个小总结,总结完后突有一个这样的想法:如果我把这些总结发给网上的delphi朋友,而他们如果也有些自已的delphi编程小结,也发给我(如果愿意的话),这样大家的进步肯定是很快的。 本人email:[email protected](1).按下ctrl和其它键之后发生一事件。 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) and (key =67) then showmessage('keydown Ctrl+C'); end;(2).Dbgrid中用Enter键代替Tab键. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then if ActiveControl = DBGrid1 then begin TDBGrid(ActiveControl).SelectedIndex := TDBGrid(ActiveControl).SelectedIndex + 1; Key := #0; end; end;(3).Dbgrid中选择多行发生一事件。 procedure TForm1.Button1Click(Sender: TObject); var i:integer; booklist:Tbooklist; book:tbookstr; begin book:=adoquery1.Book; booklist:=dbgrid1.SelectedRows; try begin for i:=0 to booklist.Count-1 do begin adoquery1.Book:=booklist[i]; with adoquery1 do begin edit; fieldbyname('mdg').AsString:=edit2.Text; post; end; end; end; finally adoquery1.Book:=book; end; end;(4).Form的一个出现效果。 procedure TForm1.Button1Click(Sender: TObject); var r:thandle; i:integer; begin for i:=1 to trunc(width/1.414) do begin r:=CreateEllipticRgn(trunc(width/2)-i,trunc(height/2)-i,trunc(width/2)+i,trunc(height/2)+i); SetWindowRgn(handle,r,true); Application.ProcessMessages; sleep(1); end; end;(5).用Enter代替Tab在编辑框中移动隹点。 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if key=#13 then begin if not (Activecontrol is Tmemo) then begin key:=#0; keybd_event(vk_tab,mapvirtualkey(vk_tab,0),0,0); end; end; end;(6).Progressbar加上色彩。 const {$EXTERNALSYM PBS_MARQUEE} PBS_MARQUEE = 08; var Form1: TForm1; implementation {$R *.dfm} uses CommCtrl; procedure TForm1.Button1Click(Sender: TObject); begin // Set the Background color to teal Progressbar1.Brush.Color := clTeal; // Set bar color to yellow SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clYellow); end;(7).住点移动时编辑框色彩不同。 procedure TForm1.Edit1Enter(Sender: TObject); begin (sender as tedit).Color:=clred; end; procedure TForm1.Edit1Exit(Sender: TObject); begin (sender as tedit).Color:=clwhite; end;(8).备份和恢复 procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin try adoconnection1.Connected:=False; adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+ 'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False'; adoconnection1.Connected:=True; with adoQuery1 do begin Close; SQL.Clear; SQL.Add('Backup DataBase sfa to disk ='''+opendialog1.FileName+''''); ExecSQL; end; except ShowMessage('±?·Y꧰ü'); Exit; end; end; Application.MessageBox('1§?2?ú£?êy?Y±?·Y3é1|','ìáê?',MB_OK + MB_ICONINFORMATION); end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog1.Execute then begin try adoconnection1.Connected:=false; adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+ 'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False'; adoconnection1.Connected:=true; with adoQuery1 do begin Close; SQL.Clear; SQL.Add('Restore DataBase sfa from disk ='''+opendialog1.FileName+''''); ExecSQL; end; except ShowMessage('???′꧰ü'); Exit; end; end; Application.MessageBox('1§?2?ú£?êy?Y???′3é1|','ìáê?',MB_OK + MB_ICONINFORMATION); end;
解决方案 »
- 提前庆五一,大家谈谈假期都干嘛去!
- 问一个API
- 如何避免数据库中为0的字段?
- 已经取得其它应用程序窗口句柄和CoolBar句柄可无法取得CoolBar中ToolBar和ToolButton句柄
- 求救!!!有人救吗?
- 各位高手好 提一个非常非长奇怪的问题?帮忙回答一下
- 我用的颜色在DELPHI的软件的属性里没有,我怎样可以添加新的的颜色?
- 请教CSDN论坛助手是用什么工具作的,什么思想?
- 您从0开始到delphi大师的脚步 ,希望分享经验,供后辈学习~
- 送分了!!!!!!!!!!!!请推荐好用的第三方RichEdit控件,最好提供下载网址。
- 请问给问大虾:delphi的发出print后,能否捕逐打印机是否能正常工作?
- TPagecontrol 的边界如何设置成0
mscomm:微软的东西,是VB中带的一个ActiveX控件,使用简单,性能一般,由于是ActivX控件,打包时需要注册好多信息,在Delphi中使用,建议使用VCL控件,编译程序时直接编入程序中,再不需任何其它处理。
spcomm:比较好的vcl控件,算是比较专业的,解剖了一下,功能比较完善。
TurboPower:公认的专业通讯vcl控件。可以到其站点下载,开放源码了。
我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
写了个例子,基本的串口通讯都可以实现,可提供参考:
下载基地-》文件名称:串口通讯控制器
版权声明:以下本文只允许在本站观看,不得以任何媒体方式进行传播。
发表意见请到留言版。TurboPower串口通讯实际应用:
在串口通讯时有字符和十六进制两种数据传输方式,不论使用哪种方式,只要能正确收到数据就是目的,至于收到数据后如何处理,就要根据具体的情况来定了。1.接收数据的方法:
轮询和中断(利用windows消息激发事件)。
1)轮询:每间隔一定的时间查询一下串口接收缓存中有无数据,有就读出来。这种方法是很毫资源的,即没事找事。
2)中断:在控件中有OnTrigger事件,当串口收到数据后,即触发此事件,无数据时什么都不做,在这个事件中接收数据就比较科学了。
所以,提倡使用控件中的OnTrigger事件接收数据。2.通讯协议的制定:
接收数据的一般处理方法,最基本的思路就是通过协议进行分析,所以协议的制定是至关重要的:
1)首先要确定指令的起始点,从大量的数据流中将指令分离出来,没有起始标志的话,结果就可想而知了,一串无效的费数据!
2)然后就是指令结束识别点,可以利用指令的长度(如果长度一定或有表示长度的数据)或结束标志来确定,当然还可以利用下一条指令的指令头。
3)既然头尾都明确了,指令的截取想来不是什么问题了吧!但还有一种情况就是数据错误是的容错,如何容错呢,最简单的办法:发现不符合格式的指令,就将其抛掉或特殊处理(如要求重发)一下!
4)有效数据中如果增加一些校验,通讯将会更加可靠!
例:#(指令头)**(指令功能)0123456789(有效数据)**(有效数据校验和)%(指令尾)
注:**代表变动值。3.接收数据的分析技巧:
通讯协议制定好后,一切将以通讯协议为中心。一套协议中的所有指令可能长度都是统一的,也有可能是长短不同的,并且在OnTrigger事件中实际反应速度及快,可能一条指令数据还没有完全收齐就已经触发了此事件,即收到了半截指令,并且有可能继续收取的数据中除了下半截指令外,还有下一条指令的前半截,如何处理?
我在做这种处理时是利用全局变量,将串口收到的所有数据都收到该串中,然后按指令格式进行截取,发现不合法指令做一下特殊处理(如要求重发)或抛弃。
如收到的数据串为:
#**0000012000**%#**0000000343#**000000540560**%#**0002200000**%
分段截为:
#**0000012000**%
#**0000000343
#**000000540560**%
#**0002200000**%
四条指令,其中:#**0000000343不完整,检测到后进行抛弃处理。调试技巧篇:
对于已了解协议的支持串口产品,要想进行编程控制,可以使用“串口通讯控制器”进行调试,以摸清具体实现数据,可按如下步骤进行:
1.确定硬件连接无误,这是首要条件,如果错误将没有成功的可能;
连线必须正确,必要时可以使用计算机自带的多个端口相互进行测试,已保证硬件的连接无误。串口通讯线有9针和25针,多用9针,其中最重要的是2(RXD)、3(TXD)、5(GND)线,对应关系如下:
9针 25针
2 -- 3
3 -- 2
5 -- 72.确定通讯参数正确,如:波特率、奇偶校验位、数据位、停止位等,以及收发的是十六进制还是字符串:3.以上确保正确,则使用“串口通讯控制器”,按协议输入数据进行收发控制了。
注意:有的仪器需要进行初始化,即先发一段激活指令,然后才能进入工作状态,这种设置主要是为了实现利用硬件为软件加密,即类似加密狗,需要有激活方法才行,不过该类方法使用较少。原创作者:JPYC,望业界专家多多指正!控件及例程源码请到:http://www.kaer.cn/default.aspx->下载基地
ClearCommError清 除 串 口 错 误 并 获 取 当 前 状 态---- 除 上 述 几 个 函 数 外, 还 要 经 常 用 到 一 个 重 要 的 记 录DCB( 设 备 控 制块)。DCB 中 记 录 有 可 定 义 的 串 行 口 参 数, 设 置 串 行 口 参 数 时 必 须 先 用GetCommState 函 数 将 系 统 默 认 值 填 入DCB 控 制 块, 然 后 才 可 把 用 户 想 改 变 的 自 定义 值 设 定。
---- 在WIN95/NT 中 进 行 串 行 通 信 除 了 解 基 本 的 通 信 操 作 函 数 外, 还 要 掌 握 多 线程 编 程。 线 程 是 进 程 内 部 执 行 的 路 径, 是 操 作 系 统 分 配CPU 时 间 的 基 本 实体。 每 个 进 程 都 由 单 线 程 开 始 完 成 应 用 程 序 的 执 行。 串 行 通 信 需 要 利 用 多线 程 技 术 实 现, 其 主 要 的 处 理 逻 辑 可 以 表 述 如 下: 进 程 一 开 始 先 由 主 线 程做 一 些 必 要 的 初 始 化 工 作, 然 后 主 线 程 根 据 需 要 在 适 当 时 候 建 立 通 信 监 视线 程 监 视 通 信 口, 当 指 定 的 串 行 口 事 件 发 生 时, 向 主 线 程 发 送WM_COMMNOTIFY 消 息( 由 于WIN95 取 消 了WM_COMMNOTIFY 消 息, 因 此 必 须 自 己 创建), 主 线 程 对 其 进 行 处 理。 若 不 需 要WM_COMMNOTIFY 消 息, 则 主 线 程 终 止 通信 监 视 线 程。
---- 多 线 程 同 时 执 行, 将 会 引 起 对 共 享 资 源 的 冲 突。 为 避 免 冲 突, 就 要 用 同步 多 线 程 对 共 享 资 源 进 行 访 问。WIN95 提 供 了 许 多 保 持 线 程 同 步 的 方 法, 笔者 采 用 创 建 事 件 对 象 来 保 持 线 程 同 步。 通 过CraeteEvent() 创 建 事 件 对 象, 使用SetEvent() 或PulseEvent() 函 数 将 事 件 对 象 设 置 成 信 号 同 步。 在 应 用 程 序 中,利 用WaitSingleObject() 函 数 等 待 同 步 的 触 发, 等 到 指 定 的 事 件 被 其 它 线 程 设 置为 有 信 号 时, 才 继 续 向 下 执 行 程 序。
---- Delphi 下 的 具 体 实 现 方 法
---- Delphi 的 强 大 功 能 和 支 持 多 线 程 的 面 向 对 象 编 程 技 术, 使 得 实 现 串 行 通 信非 常 简 单 方 便。 它 通 过 调 用 外 部 的API 函 数 来 实 现, 主 要 步 骤 如 下: 首 先, 利用CreateFile 函 数 打 开 串 行 口, 以 确 定 本 应 用 程 序 对 此 串 行 口 的 占 有 权, 并 封锁 其 它 应 用 程 序 对 此 串 口 的 操 作; 其 次, 通 过GetCommState 函 数 填 充 设 备 控 制块DCB, 再 通 过 调 用SetCommState 函 数 配 置 串 行 口 的 波 特 率、 数 据 位、 校 验 位 和停 止 位。 然 后, 创 建 串 行 口 监 视 线 程 监 视 串 行 口 事 件。 在 此 基 础 上 就 可 以在 相 应 的 串 口 上 操 作 数 据 的 传 输; 最 后, 用CloseHandle 函 数 关 闭 串 行 口。 具 体的 程 序 如 下, 本 程 序 用Delphi3.0 编 制 在Win95 环t 境 下 调 试 通 过, 已 投 入 实 际 应 用中, 供 广 大 读 者 参 考。
---- 程 序:
unit comdemou;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;constWm_commNotify=Wm_User+12;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);
private
Procedure comminitialize;
Procedure MsgcommProcess(Var
Message:Tmessage); Message Wm_commnotify;
{ Private declarations }
public
{ Public declarations }
end;
//线程声明
TComm=Class(TThread)
protected
procedure Execute;override;end;varForm1: TForm1;hcom,Post_Event:Thandle;
lpol:Poverlapped;
implementation
{$R *.DFM}
Procedure TComm.Execute; //线程执行过程vardwEvtMask:Dword;Wait:Boolean;Beginfillchar(lpol,sizeof(toverlapped),0);While True do BegindwEvtMask:=0;Wait:=WaitCommEvent(hcom,dwevtmask,lpol); //等待串行口事件;if Wait Then Beginwaitforsingleobject(post_event,infinite); //等待同步事件置位;resetevent(post_event); //同步事件复位;PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//发送消息;
end;
end;
end;
procedure Tform1.comminitialize;
//串行口初始化
var
lpdcb:Tdcb;
Begin
hcom:=createfile('com2',generic_read orgeneric_write,0,nil,open_existing,file_attribute_normal orfile_flag_overlapped,0);//打开串行口if hcom=invalid_handle_value thenelsesetupcomm(hcom,4096,4096); //设置输入,输出缓冲区皆为4096字节getcommstate(hcom,lpdcb); //获取串行口当前默认设置lpdcb.baudrate:=2400;lpdcb.StopBits:=1;lpdcb.ByteSize:=8;lpdcb.Parity:=EvenParity; //偶校验Setcommstate(hcom,lpdcb);setcommMask(hcom,ev_rxchar); //指定串行口事件为接收到字符;end;Procedure TForm1.MsgcommProcess(Var Message:Tmessage);varClear:Boolean;Coms:Tcomstat;cbNum,ReadNumber,lpErrors:Integer;Read_Buffer:array[1..100]of char;BeginClear:=Clearcommerror(hcom,lpErrors,@Coms);if Clear Then BegincbNum:=Coms.cbInQue;ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);//处理接收数据SetEvent(Post_Event); //同步事件置位end;end;procedure TForm1.FormCreate(Sender: TObject);begincomminitialize;post_event:=CreateEvent(nil,true,true,nil); //创建同步事件;Tcomm.Create(False); //创建串行口监视线程;end;end.
var
i,j:integer;
xtemp : Olevariant;
xScr : array of byte;
xRecData :string;
begin
edit1.text:='';
i:=mscomm1.InBufferCount;
case mscomm1.commEvent of
comEvReceive: //接收数据
begin
xtemp := mscomm1.Input;
SetLength(xScr,i);
xScr := xtemp;
for j:=0 to i-1 do
begin
xRecData := xRecData +inttoHex(xScr[j],2);
end;
edit1.Text:=xrecdata;
end;
end;
end;
的时候设置连接的属性
ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=66666;Persist Security Info=False;User ID=130001;Initial Catalog=gdkjbb;Data Source=10.20.20.21'
try
ADOConnection1.Connected:=true;
exept
//连接失败提示
end;
spcomm 的文件很大,每发送完成一页(256 BYTE) 收到确认(‘CC’,‘CE’)后再发送下一页,每一页最后加校验和unit Read_HXFile_Frm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, DirOutln,FmxUtils, SPComm, ComCtrls;type
TForm_Read_HXFile = class(TForm)
Panel1: TPanel;
OpenDialog1: TOpenDialog;
GroupBox1: TGroupBox;
Bbtn_Exit: TBitBtn;
Bbtn_Sure: TBitBtn;
GroupBox2: TGroupBox;
Lbl_ReadHXFile: TLabel;
Edt_Read: TEdit;
Btn_Brouse: TButton;
Edt_FileName: TEdit;
Edt_FileSize: TEdit;
Label3: TLabel;
Label2: TLabel;
Label1: TLabel;
Label4: TLabel;
Edt_LJ: TEdit;
Comm1: TComm;
PB: TProgressBar;
Edt_ModifyDate: TEdit;
procedure Btn_BrouseClick(Sender: TObject);
procedure Bbtn_ExitClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure Bbtn_SureClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form_Read_HXFile: TForm_Read_HXFile;
DirectoryOutline: TDirectoryOutline;
TF: file of byte; //记录文件变量
FileNam:TFileName;
dtTmp:TDateTime;
sRece1:string; //接收到的字符串
rbuf:array[1..300] of byte;//把接收到的二进制转化为整数,存储在数组里
pDataToWrite:array[1..300] of char; // 要发送的,转化为字符
LDate:Integer;//发送字符长度
JYSum:Integer;//校验和
size:Longint;//文件长度
implementationuses Globe_Frm, GlobalConst, Main_Frm;{$R *.dfm}procedure TForm_Read_HXFile.Btn_BrouseClick(Sender: TObject);
var
TheFileName: string;
size,i,j:Longint;
begin
if OpenDialog1.Execute then
begin
Edt_Read.Text:=OpenDialog1.FileName;
Edt_LJ.Text:=GetCurrentDir;
TheFileName:=Extractfilename(opendialog1.FileName);
Edt_FileName.Text:=TheFileName;
Edt_FileSize.Text:=Format('%8.2f',[(getfilesize(TheFileName)/1024)])+' KB';
end
else
begin
Edt_Read.Clear;
end;
end;procedure TForm_Read_HXFile.Bbtn_ExitClick(Sender: TObject);
begin
Close;
end;procedure TForm_Read_HXFile.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Comm1.StopComm;
//Form_Main.ComBz.StartComm;
Form_Main.Show;
end;procedure TForm_Read_HXFile.FormShow(Sender: TObject);
begin
Comm1.CommName:=Glb_Com;
Comm1.StartComm;
end;procedure TForm_Read_HXFile.Comm1ReceiveData(Sender: TObject;
Buffer: Pointer; BufferLength: Word);
var
i:integer;
begin
sRece1:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=1 to bufferlength do
begin
sRece1:=sRece1+ inttohex(rbuf[i],2);
end;
end;procedure TForm_Read_HXFile.Bbtn_SureClick(Sender: TObject);
var
TheFileName,Str: string;
size,i,j:Longint; Page:integer;//页数
m,n:Integer; //文件位置控制
Pag:Integer;//循环变量
Temp:byte; //临时变量
LastNum:byte;//最后一页字节数
begin
Edt_ModifyDate.Text:=FormatDateTime(' "开始时间:" HH:MM:ss',Now)+'---';
//发送D1检测是否可以通信
try
FileNam:=ExtractFileName(Edt_Read.Text);
AssignFile(TF,FileNam);
FileMode := 0;
Reset(TF);
size := FileSize(TF);
for i:=0 to size-1 do
begin
seek(TF,i);
Read(TF,GB[i]);
end;
seek(TF,4);
Read(TF,LastNum);
seek(TF,6);
Read(TF,Temp);
Page:=Temp;
Page:=Page*256;
seek(TF,5);
Read(TF,Temp);
Page:=Page+Temp;
except
Application.MessageBox('请选择要发送的花型文件!','提示',MB_OK+MB_ICONINFORMATION);
Exit;
end;
sRece1:='';
pDataToWrite[1]:=chr(byte($D1));
LDate:=1;
Comm1.WriteCommData(@(pDataToWrite),LDate);
dtTmp:=Now;
while ((not (sRece1='CC')) and ((Now-dtTmp)<(3000 /(24*60*60*1000)))) do
begin
Application.ProcessMessages;
end; if sRece1<>'CC' then
begin
Application.MessageBox('超时,请重发!','提示',MB_OK+MB_ICONINFORMATION);
Exit;
end;
//发送头文件
PB.Visible:=True;
PB.Min:=0;
PB.Max:=size;
pDataToWrite[1]:=chr(byte($F5));
JYSum:=0;
for m:= 0 to 31 do //m控制文件的当前位置
begin
//Seek(TF,m);
//Read(TF,GB[m]);
pDataToWrite[m+2]:=chr(GB[m]);
JYSum:=JYSum+GB[m];
PB.Position:=m;
end;
pDataToWrite[34]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),1,2)));
pDataToWrite[35]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),3,2)));
LDate:=35;
Comm1.WriteCommData(@(pDataToWrite),LDate);
dtTmp:=Now;
while ((not (sRece1='CE')) and ((Now-dtTmp)<(3000 /(24*60*60*1000)))) do
begin
Application.ProcessMessages;
end; if sRece1<>'CE' then
begin
Application.MessageBox('超时,请重发!','提示',MB_OK+MB_ICONINFORMATION);
Exit;
end; //开始发送正文
n:=32; //接着要读的位置
for Pag:=1 to Page do
begin
sRece1:='';
JYSum:=0; //校验和初始化
for m:= n to n+255 do //读256个字节
begin
//Seek(TF,m);
//Read(TF,GB[m]);
pDataToWrite[m-n+1]:=chr(GB[m]);
JYSum:=JYSum+GB[m]; end;
pDataToWrite[257]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),1,2)));
pDataToWrite[258]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),3,2)));
LDate:=258;
Comm1.Inx_XonXoffFlow:=false;
Comm1.Outx_XonXoffFlow:=false;
Comm1.WriteCommData(@(pDataToWrite),LDate); dtTmp:=Now;
while ((not (sRece1='CE')) and ((Now-dtTmp)<(3000 /(24*60*60*1000)))) do
begin
Application.ProcessMessages;
end; if sRece1<>'CE' then
begin
Application.MessageBox('超时,请重发!','提示',MB_OK+MB_ICONINFORMATION);
Exit;
end; n:=n+256;//n为接着要读的位置
PB.Position:=n;
end; //发送最后一页
if LastNum<>0 then
begin
JYSum:=0;
for m:= n to n+LastNum-1 do
begin
//Seek(TF,m);
//Read(TF,GB[m]);
pDataToWrite[m-n+1]:=chr(GB[m]);
JYSum:=JYSum+GB[m]; end;
for i:=1 to 256-LastNum do //不足256的全部补零
begin
pDataToWrite[LastNum+i]:=chr(byte($00));
end;
pDataToWrite[257]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),1,2)));
pDataToWrite[258]:=chr( StrToInt ('$'+ Copy (IntToHex(JYSum,4),3,2)));
LDate:=258;
Comm1.Inx_XonXoffFlow:=false;
Comm1.Outx_XonXoffFlow:=false;
Comm1.WriteCommData(@(pDataToWrite),LDate);
end;
PB.Position:=PB.Max;
Edt_ModifyDate.Text:=Edt_ModifyDate.Text+FormatDateTime('"结束时间:"HH:MM:ss',Now);
sleep(100);
Str:='花型文件:'+ Edt_FileName.Text+' 传送完毕! ';
Application.MessageBox(Pchar(Str),'提示', MB_OK+ MB_ICONINFORMATION);
PB.Visible:=False;end;end.
接收函数procedure TForm_Read_HXFile.Comm1ReceiveData(Sender: TObject;
Buffer: Pointer; BufferLength: Word);
var
i:integer;
begin
sRece1:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=1 to bufferlength do
begin
sRece1:=sRece1+ inttohex(rbuf[i],2);
end;
end;
回复人: lxhong1980(娶个善善良良的妻子,养个聪聪明明的孩子) ( ) 信誉:100 2003-11-08 10:03:22Z 得分:0
保存十六进制文件 GBI: array[0..10024000] of integer;
GB: array[0..10240000] of byte;
YZ: array[0..10240000] of byte;
YS: array[0..10240000] of byte;
YSB: array[0..10240000] of byte;
YSYS: array[0..10240000] of byte;
YSYSB: array[0..10240000] of byte;
YZ4: array[0..10240000] of byte; //存储四列压针值(从下到上)
转贴一个例子:(现在在网吧没办法,不然就写一个)
现时DELPHI上有很多串行口控件,SPCOMM控件有Data Bits、Parity、 Stop Bits 等配置,支持 Read/Write 时序控制 (Timing control)、 ReadIntervalTimeout、 WriteIntervalTimout 等 ,支持 DTR/DSR, RTS/CTS 硬件流程控置及 Xon/Xoff 软件流程控置,是目前比较完善的控件。 以下是一个用RS-232进行数据接收、显示的例子。必须将RS232的通信参数设置好才能正确接收数据。(Data Bits,Parity,Stop Bits,COM口参数)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, SPComm;
type
TForm1 = class(TForm)
Comm1: TComm;
Memo1: TMemo;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s: string;
begin
SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
Memo1.Invalidate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.startcomm;//创建窗体时,将comm1控件打开。
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;//关闭窗体时,将comm1控件关闭。
end;
end.
谢谢各位!
function GetStrCounts(ASubStr, AStr: string): Integer;
var
i: Integer;
begin
result := 0;
i := 1; while PosEx(ASubStr, AStr, i) <> 0 do
begin
Inc(result);
i := PosEx(ASubStr, AStr, i) + 1;
end;
end;