主        题:  本人“一生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;
 
 

解决方案 »

  1.   

    delphi中常用串口控件简介:
    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->下载基地
      

  2.   

    南  京  理  工  大  学  经  济  管  理  学  院96  研  究  生  王  琛  ----  随  着  现  代  信  息  技  术  的  发  展  以  及  计  算  机  网  络  的  广  泛  使  用,  计  算  机  通  信  技  术已  经  日  臻  成  熟,  但  串  行  通  信  作  为  一  种  灵  活  方  便  可  靠  的  通  信  方  式,  仍  不  失  为有  效  的  通  信  手  段,  被  广  泛  应  用  于  工  业  控  制  中。  在  工  业  生  产  实  践  中,  用PC  机  对工  程  实  现  实  时  监  控,  通  常  要  求PC  机  能  在  用  户  界  面  上  具  有  数  据  采  集、  数  据  处理  以  及  控  制  信  号  的  产  生  与  传  输  等  功  能。  在  这  种  特  定  的  环  境  下,PC  机  要  与  过程  控  制  的  实  时  信  号  相  联  系,  就  要  求  能  实  现  对PC  机  的  串  行  端  口  直  接  操作。Borland公  司  推  出  的Delphi  是  一  种  功  能  强  大  的  高  级  编  程  语  言,  其  具  有  的  可  视  化  面  向  对象  的  特  性,  特  别  适  于  在Windows  环  境  下  图  形  界  面  和  用  户  程  序  的  编  制。  本  文  就  是介  绍  基  于Windows95/NT  操  作  系  统  用Delphi  来  实  现PC  机  与  下  层PLC  控  制  器  之  间  的  串  口通  信  方  法。  ----  基  于WIN95/NT  的  串  行  通  信  机  制  ----  Windows  操  作  系  统  的  机  制  禁  止  应  用  程  序  直  接  访  问  计  算  机  硬  件,  但  它  为  程  序员  提  供  了  一  系  列  的  标  准API  函  数,  使  得  应  用  程  序  的  编  制  更  加  方  便  并  且  免  除  了对  有  关  硬  件  的  调  试  麻  烦。  在Windows95/NT  中,  原  来Windows3.X  的WM_COMMNOTIFY  消  息已  被  取  消,  操  作  系  统  为  每  个  通  信  设  备  开  辟  了  用  户  可  定  义  大  小  的  读/  写  缓  冲区,  数  据  进  出  通  信  口  均  由  操  作  系  统  后  台  完  成,  应  用  程  序  只  需  对  读/  写  缓  冲  区操  作  即  可。WIN95/NT  中  几  个  常  用  的  串  行  通  信  操  作  函  数  如  下:  CreatFile打  开  串  行  口CloseHandle关  闭  串  行  口SetupComm设  置  通  信  缓  冲  区  的  大  小ReadFile读  串  口  操  作WriteFile写  串  口  操  作SetCommState设  置  通  信  参  数GetCommState获  取  默  认  通  信  参  数
    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.
      

  3.   

    procedure Tfrm_system.MSComm1Comm(Sender: TObject);
    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;
      

  4.   

    在 DataModuleCreate(Sender: TObject);
    的时候设置连接的属性
    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;
      

  5.   

    保存先~~~以后我每次上网都来这里学习:)谢谢各位大虾了,我是菜鸟xiaoxiaofei
      

  6.   

    回复人: lxhong1980(娶个善善良良的妻子,养个聪聪明明的孩子) ( ) 信誉:100  2003-11-08 10:01:52Z  得分:0 
     
     
      
    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.
     
     
      

  7.   

    回复人: lxhong1980(娶个善善良良的妻子,养个聪聪明明的孩子) ( ) 信誉:100  2003-11-08 10:02:25Z  得分:0 
     
     
      
    接收函数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; //存储四列压针值(从下到上)
     
     
      

  8.   

    : hansion3406(阿木㊣拖鞋男) ( ) 信誉:92  2003-09-27 11:13:23Z  得分:25 
     
     
      
    转贴一个例子:(现在在网吧没办法,不然就写一个)
    现时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. 
     
     
      

  9.   

    本人5.1才开始学DELPHI没什么经验可贡献, 只有顶了
    谢谢各位!
      

  10.   

    我也贴一个,要use StrUtils,求一个串在另一个串中出现的次数:
    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;
      

  11.   

    请问楼主,如果不在FormKeyPress事件里面些你的代码,你能够实现,对键盘上的键进行扑捉吗??我在等待中。