程序包含主窗体FormMain和一个Data Module 名字为DMData.     FormMain中有个 procedure Deal(S: String) 。在Data Module 中有个 Timer控件。我现在想在 procedure TDMData.Timer1Timer(Sender: TObject) 中调用Deal(DataTimeToStr(Now)),而且不在DMDtata引用FormMain,如何实现?请大家帮帮忙,谢谢!

解决方案 »

  1.   

    在主窗口建立函数:
    procedure RightCall(Sender: TObject);
    begin
      Deal(.....);
    end;在DM:
    增加一个变量
    TheRightCall: TNotifyEvent;程序启动时设
    TheRightCall := RightCall;在OnTimer中:
    if Assigned(TheRightCall) then
      TheRightCall(Sender);
      

  2.   

    To: budi
    我也是这个思路,但是我是在DM里:
    自定义一个类型 type TMyCall = procedure(Sender: TObject; S: string);   然后增加一个  protperty Deal: TMyCall read FDeal write FDeal;  程序启动时设
    DMData.Deal := Deal;  在OnTimer中:  
    if Assigned(FDeal) then
          FDeal(Sender,myStr);我这样做思路对吗?但是DMData.Deal := Deal;这句出错是怎么回事???
      

  3.   

    当然出错了,你根本就没有定义Deal这个字段,你只是定义了Deal这个属性。你如果有定义FDeal 则是将DmData.deal := Fdeal; Fdeal应该是 TMyCall 类型的
      

  4.   

    to: lwjghhh
    我定义 FDeal 了啊,在 DMData的private   FDeal : TMyCall;       
    怎么是 DmData.deal := Fdeal; 呢?
    budi 的方法是对的,但是没有从DMData传参数到FormMain里,  在 Deal(S: String)中,参数 S 也是要从DMData 中传过去的? 可不可以再给一个代码?
      

  5.   

    protperty Deal: TMyCall read FDeal write FDeal;  你把Deal属性换个名试试呢?比如:DMDeal学习。。
      

  6.   

    我说的可能不清楚,我再重新说一下我的情况:
    在DataModule里:
    type TMyEvent=procedure(Sender: TObject; S: String);private
      FDeal: TMyEvent;public
      property Deal: TMyEvent read FDeal write FDeal;procedure TDMCall.TimerMainTimer(Sender: TObject);
    var
      myStr: String;
    begin
      if Assigned(FDeal) then
        FDeal(self,myStr);
    end;
    在FormMain里:
    public
      procedure Deal(Sender: TObject; phone: String);procedure TFormSeat.FormCreate(Sender: TObject);
    begin
      DMData.Deal := Deal;
    end;
    大家帮我看看到底是什么问题,谢谢!!!
      

  7.   

    type TMyCall = procedure(Sender: TObject; S: string) of object;