我要新建一个TWeight类,用MSComm控件通过串口从工业秤中读重量数据,用测试程序我已经把重量正确读出来了,现在要求我把它做成一个TWeight类,并提供一个GetWeight方法,别的程序调用GetWeight方法能得到重量,要用一个事件通知别的程序调用GetWeight方法,请高手指教,最好能写出完整的源代码,小弟学习,先谢

解决方案 »

  1.   

    小弟是新手,不过,有一点建议希望能对你有帮助:
      类还是按照常规的类去写,把您的GetWeight作成方法,通过属性来得到数据,不知道能不能行,就象下面的代码:
       ...
      private  
       ...
       FWeight:double; 
       function GetWeight:double;   
        ...
      publish
       property FWeight read GetWeight;
    嘿嘿~
    小弟献丑了!
      

  2.   

    TGetWeight = procedure(Sender: TObject; Weight: longint);....
    protected
      procedure GetWeight;
    published
      property OnGetWeight: TGetWeight read FOnGetWeight write FOnGetWeight;
    end;procedure TXXXX.GetWeight;
    begin
      ...
      ...
      if 获取到数据 then
      begin
        if OnGetWeight <> nil then OnGetWeight(Self, 获取到的重量);
      end;
    end;
      

  3.   

    我同意lsp2004(易水孤狼)的。
    ==要用一个事件通知别的程序调用GetWeight方法==这个想法说的很模糊,比如说事件触发的条件。
    所以,下面的源代码是我能够提供的。
    TWeight = class
    private
      FWeight : double; 
      function GetWeight : double;
    public 
      property Weight : double read GetWeight;
    end; 
    ...
    function TWeight.GetWeight : double;
    begin
      Result := FWeight;
    end;
      

  4.   

    不好意思,上面我并没有看清你的问题描述,所以代码是错误的。
    我想问问,你这个类仅仅就是为了实现读取数据的作用吗?如果是这样的话,我觉得真没必要封装成一个类,如果没有数据成员的话,这样的类建立起来似乎比较别扭。
    TWeight = class
    public 
      function GetWeight : Double;
    end; {TWeight}function TWeight.GetWeight : Double;
    begin
      ...
    end;
      

  5.   

    感谢creativepeter(头皮屑) 
    这个类就是为了实现读取数据的作用,在这个类中用MSComm控件通过串口从工业秤中读重量数据,领导要求我把它做成一个TWeight类,并提供一个GetWeight方法,别的程序调用GetWeight方法能得到重量,要用一个事件通知别的程序调用GetWeight方法,1.数据成员应该是有的把,没有的话怎么储存重量数据呢??
    2.不知道我能不能在MSComm控件的OnComm事件中通知别的程序调用GetWeight方法??
      

  6.   

    我这个类好象还不象别的自定义组件,可以不用这样声明属性property Weight : double read GetWeight;,因为我不需要在 Object Inspector中编辑属性,领导要求没有办法,正在学习
      

  7.   

    要用一个事件通知别的程序调用GetWeight ... 用消息可以办到
    这样写:
    Type  
       TTWeight  = Class
    private
      fMscomm: TMSComm;
      ..........
    public
      constructor Create(aMSComm: TMSComm);
      destructor Destroy;override;
      function GetWeight(var Weight:Double):Boolean;
      ........
    end;
    .......constructor TTWeight.Create(aMSComm: TMSComm);
    begin
      fMscomm := aMSComm;
      ......
    end;......function GetWeight(var Weight:Double):Boolean;  //返回值是为了辨别通信是否成功
    begin
      Result := False;
      try
        fMscomm.PortOpen := True;
        .....
      except
       ....
      end;
        fMscomm.OutPut := ........;
        Sleep(200);
       //将接收到的数据进行分析  
      ........
      Weight := .....;
      Result := ...;
    end;
      

  8.   

    为了实现要用一个事件通知别的程序调用GetWeight ...楼主可以继续封装该TTWeight  到一TThread类中,在TThread类中操作TTWeight  类 ,最后以消息的方式通知主程序,这是常用的串口通信类的实现方法.
      

  9.   

    to:suuare(督察)
    我对MSComm的初始化与OnComm事件也应该放在这个类把,好象应该在OnComm事件中将接收到的数据进行分析完后,在OnComm事件中调用 GetWeight 方法,但我这个类没有窗体,怎么调试呢??F7、F8、F9都不能运行,学习
      

  10.   

    你写一个程序 引用这个单元  建立这个类的对象呀!
    在这里就可以不使用OnComm事件了   思路无非两种,中断方式与查询方式.OnComm是中断方式,但容易出现错误.所以你可以根据你的波特率和长度计算一下从发出指令到接收多长时间算超时.然后Mscomm.Input.就可以得到需要的东西了
      

  11.   

    ==我这个类好象还不象别的自定义组件,可以不用这样声明属性property Weight : double read GetWeight;,因为我不需要在 Object Inspector中编辑属性==
    **声明属性和是否需要在 Object Inspector中编辑属性没有必然的联系,如果你需要编辑属性那么应该将它放在published下面。
    ==我对MSComm的初始化与OnComm事件也应该放在这个类把,好象应该在OnComm事件中将接收到的数据进行分析完后,在OnComm事件中调用 GetWeight 方法==
    **我想如果你这样做的话,和suuare(督察) 的想法就是不一样的。suuare(督察) 的代码中constructor Create(aMSComm: TMSComm);实际上是将一个TMSComm和你的TWeight形成聚集的关系,不管你的TWeight是否存在这个TMSComm都可以独立存在,而你的想法是形成一种组合的关系。我赞同你的做法。至于在OnComm事件中调用GetWeight方法和事件通知的具体做法,我不是很清楚了。