⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addial.pas

📁 测试用例
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  begin
    Inc(DialTry);
    if (DialTry >= MaxDialTries) then begin
      DialingFinished;
      FDialResult := drAborted;
      TooManyTries;
      Exit;
    end;

    {let user know we're starting a retry}
    RetryStart;

    {start the countdown}
    RetryWait := RetrySecs;
    RetryIdx  := ComPort.AddTimerTrigger;
    ComPort.SetTimerTrigger(RetryIdx, TickSeconds, True);
    FRetrying := True;
  end;

  procedure TApdCustomModemDialer.RetryDone;
    {-Cleanup after a retry countdown}
  begin
    ComPort.RemoveTrigger(RetryIdx);
    RetryIdx := 0;

    {let the user know the retry wait is over}
    RetryEnd;

    {start another dial attempt}
    PrepareDialing;
    FRetrying := False;
  end;

  procedure TApdCustomModemDialer.DialerTriggerTimer(Sender : TObject; TriggerHandle : Word);
  begin
    if (TriggerHandle = RetryIdx) then begin
      if Retrying then begin
        Dec(RetryWait);
        if (RetryWait = 0) then
          RetryDone
        else begin
          {tell user to update retry count display}
          RetryCount;

          {reset the countdown timer}
          ComPort.SetTimerTrigger(RetryIdx, TickSeconds, True);
        end;
      end;
    end else if (TriggerHandle = DialIdx) then begin
      {start dialing}
      ComPort.RemoveTrigger(DialIdx);
      DialIdx := 0;
      Modem.Dial(PhoneNumber);

      {let the user know}
      DialStart;
    end;

    if Assigned(SaveTriggerTimer) then
      SaveTriggerTimer(Sender, TriggerHandle);
  end;

  procedure TApdCustomModemDialer.DialerModemConnect(Sender : TObject);
  begin
    GotConnect;
    if Assigned(SaveModemConnect) then
      SaveModemConnect(Sender);
  end;

  procedure TApdCustomModemDialer.DialerDialCount(Sender : TObject; Remaining : Word);
  begin
    DialCount(Remaining);
    if Assigned(SaveDialCount) then
      SaveDialCount(Sender, Remaining);
  end;

  procedure TApdCustomModemDialer.DialerGotLineSpeed(Sender : TObject; Speed : LongInt);
  begin
    GotLineSpeed(Speed);
    if Assigned(SaveGotLineSpeed) then
      SaveGotLineSpeed(Sender, Speed);
  end;

  procedure TApdCustomModemDialer.DialerModemBusy(Sender : TObject);
  begin
    if Assigned(SaveModemBusy) then
      SaveModemBusy(Sender);

    if mdAbortOnBusy in DialerOptions then begin
      FDialResult := drAborted;
      GotBusy;
      DialingFinished;
    end else begin
      GotBusy;
      RetryDial;
    end;
  end;

  procedure TApdCustomModemDialer.DialerModemVoice(Sender : TObject);
  begin
    if Assigned(SaveModemVoice) then
      SaveModemVoice(Sender);

    if mdAbortOnVoice in DialerOptions then begin
      FDialResult := drAborted;
      GotVoice;
      DialingFinished;
    end else begin
      GotVoice;
      RetryDial;
    end;
  end;

  procedure TApdCustomModemDialer.DialerModemError(Sender : TObject);
  begin
    if Assigned(SaveModemError) then
      SaveModemError(Sender);

    if mdAbortOnError in DialerOptions then begin
      FDialResult := drAborted;
      GotError;
      DialingFinished;
    end else begin
      GotError;
      RetryDial;
    end;
  end;

  procedure TApdCustomModemDialer.DialerModemNoCarrier(Sender : TObject);
  begin
    if Assigned(SaveModemNoCarrier) then
      SaveModemNoCarrier(Sender);

    if mdAbortOnNoCarrier in DialerOptions then begin
      FDialResult := drAborted;
      GotNoCarrier;
      DialingFinished;
    end else begin
      GotNoCarrier;
      RetryDial;
    end;
  end;

  procedure TApdCustomModemDialer.DialerModemNoDialTone(Sender : TObject);
  begin
    if Assigned(SaveModemNoDialTone) then
      SaveModemNoDialTone(Sender);

    if mdAbortOnNoDialTone in DialerOptions then begin
      FDialResult := drAborted;
      GotNoDialTone;
      DialingFinished;
    end else begin
      GotNoDialTone;
      RetryDial;
    end;
  end;

  procedure TApdCustomModemDialer.DialerDialTimedOut(Sender : TObject);
  begin
    if Assigned(SaveDialTimedOut) then
      SaveDialTimedOut(Sender);

    DialTimedOut;
    RetryDial;
  end;

  procedure TApdCustomModemDialer.DialerModemByeBye(Sender : TObject);
  begin
    ShutDownOnDestroy;

    if Assigned(SaveOnByeBye) then
      SaveOnByeBye(Sender);
  end;

  procedure TApdCustomModemDialer.DialerModemIsConnected(Sender : TObject);
  begin
    if Assigned(SaveModemIsConnected) then
      SaveModemIsConnected(Sender);

    {all done!}
    FDialResult := drConnected;
    DialingFinished;

    ConnectionEstablished;
  end;

  procedure TApdCustomModemDialer.RetryStart;
  begin
    if Assigned(FRetryStart) then
      FRetryStart(Self);
  end;

  procedure TApdCustomModemDialer.RetryCount;
  begin
    if Assigned(FRetryCount) then
      FRetryCount(Self, RetryWait);
  end;

  procedure TApdCustomModemDialer.RetryEnd;
  begin
    if Assigned(FRetryEnd) then
      FRetryEnd(Self);
  end;

  procedure TApdCustomModemDialer.CycleDial;
  begin
    if Assigned(FCycleDial) then
      FCycleDial(Self);
  end;

  procedure TApdCustomModemDialer.DialStart;
  begin
    if Assigned(FDialStart) then
      FDialStart(Self);
  end;

  procedure TApdCustomModemDialer.GotConnect;
  begin
    if Assigned(FConnect) then
      FConnect(Self);
  end;

  procedure TApdCustomModemDialer.DialCount(Cnt : Cardinal);
  begin
    if Assigned(FDialCount) then
      FDialCount(Self, Cnt);
  end;

  procedure TApdCustomModemDialer.GotLineSpeed;
  begin
    if Assigned(FGotLineSpeed) then
      FGotLineSpeed(Self, Speed);
  end;

  procedure TApdCustomModemDialer.GotBusy;
  begin
    if Assigned(FBusy) then
      FBusy(Self);
  end;

  procedure TApdCustomModemDialer.GotVoice;
  begin
    if Assigned(FVoice) then
      FVoice(Self);
  end;

  procedure TApdCustomModemDialer.GotError;
  begin
    if Assigned(FError) then
      FError(Self);
  end;

  procedure TApdCustomModemDialer.GotNoCarrier;
  begin
    if Assigned(FNoCarrier) then
      FNoCarrier(Self);
  end;

  procedure TApdCustomModemDialer.GotNoDialTone;
  begin
    if Assigned(FNoDialTone) then
      FNoDialTone(Self);
  end;

  procedure TApdCustomModemDialer.DialTimedOut;
  begin
    if Assigned(FDialTimedOut) then
      FDialTimedOut(Self);
  end;

  procedure TApdCustomModemDialer.ConnectionEstablished;
  begin
    if Assigned(FConnectionEstablished) then
      FConnectionEstablished(Self);
  end;

  procedure TApdCustomModemDialer.TooManyTries;
  begin
    if Assigned(FTooManyTries) then
      FTooManyTries(Self);
  end;

  procedure TApdCustomModemDialer.SinkHooks;
    {-Replace existing ComPort/Modem event handlers with dialer handlers}
  begin
    {save old event handlers}
    SaveTriggerTimer     := ComPort.OnTriggerTimer;
    SaveModemConnect     := Modem.OnModemConnect;
    SaveDialCount        := Modem.OnDialCount;
    SaveGotLineSpeed     := Modem.OnGotLineSpeed;
    SaveModemBusy        := Modem.OnModemBusy;
    SaveModemVoice       := Modem.OnModemVoice;
    SaveModemError       := Modem.OnModemError;
    SaveModemNoCarrier   := Modem.OnModemNoCarrier;
    SaveModemNoDialTone  := Modem.OnModemNoDialTone;
    SaveDialTimedOut     := Modem.OnDialTimedOut;
    SaveOnByeBye         := Modem.OnByeBye;
    SaveModemIsConnected := Modem.OnModemIsConnected;

    {install our event handlers}
    ComPort.OnTriggerTimer   := DialerTriggerTimer;
    Modem.OnModemConnect     := DialerModemConnect;
    Modem.OnDialCount        := DialerDialCount;
    Modem.OnGotLineSpeed     := DialerGotLineSpeed;
    Modem.OnModemBusy        := DialerModemBusy;
    Modem.OnModemVoice       := DialerModemVoice;
    Modem.OnModemError       := DialerModemError;
    Modem.OnModemNoCarrier   := DialerModemNoCarrier;
    Modem.OnModemNoDialTone  := DialerModemNoDialTone;
    Modem.OnDialTimedOut     := DialerDialTimedOut;
    Modem.OnByeBye           := DialerModemByeBye;
    Modem.OnModemIsConnected := DialerModemIsConnected;
  end;

  procedure TApdCustomModemDialer.RemoveHooks;
    {-Remove dialer event handlers and replace with originals}
  begin
    Modem.OnModemConnect     := SaveModemConnect;
    Modem.OnDialCount        := SaveDialCount;
    Modem.OnGotLineSpeed     := SaveGotLineSpeed;
    Modem.OnModemBusy        := SaveModemBusy;
    Modem.OnModemVoice       := SaveModemVoice;
    Modem.OnModemError       := SaveModemError;
    Modem.OnModemNoCarrier   := SaveModemNoCarrier;
    Modem.OnModemNoDialTone  := SaveModemNoDialTone;
    Modem.OnDialTimedOut     := SaveDialTimedOut;
    Modem.OnByeBye           := SaveOnByeBye;
    Modem.OnModemIsConnected := SaveModemIsConnected;
    ComPort.OnTriggerTimer   := SaveTriggerTimer;
  end;

  procedure TApdCustomModemDialer.DialingFinished;
    {-Dialing done: shut down dial attempt}
  begin
    FDialing  := False;
    FRetrying := False;
    RemoveHooks;
  end;

  procedure TApdCustomModemDialer.ShutDownOnDestroy;
    {-Clean up during the middle of a dial attempt}
  begin
    if Dialing and Assigned(FModem) and (Modem.ComPort <> nil) then begin
      if Retrying then
        ComPort.RemoveTrigger(RetryIdx)
      else if Modem.IsAttemptingConnect then
        Modem.CancelDialAnswer;

      DialingFinished;
    end;
  end;

  constructor TApdCustomModemDialer.Create(AOwner : TComponent);
  var
    I : Cardinal;
  begin
    inherited Create(AOwner);

    {set default property values}
    FModem                 := nil;
    FPhoneNumber           := '';
    FMaxDialTries          := addDefMaxDialTries;
    FRetrySecs             := addDefRetrySecs ;
    FDialerOptions         := addDefDialerOptions;
    FDialResult            := drNone;
    FDialing               := False;
    FRetrying              := False;
    FRetryStart            := nil;
    FRetryCount            := nil;
    FRetryEnd              := nil;
    FCycleDial             := nil;
    FDialStart             := nil;
    FConnect               := nil;
    FDialCount             := nil;
    FGotLineSpeed          := nil;
    FBusy                  := nil;
    FVoice                 := nil;
    FError                 := nil;
    FNoCarrier             := nil;
    FNoDialTone            := nil;
    FDialTimedOut          := nil;
    FConnectionEstablished := nil;
    FTooManyTries          := nil;

    ComPort                := nil;
    DialTry                := 0;
    DialIdx                := 0;

    Cycling                := False;
    RetryIdx               := 0;
    RetryWait              := 0;

    SaveTriggerTimer       := nil;
    SaveModemConnect       := nil;
    SaveDialCount          := nil;
    SaveGotLineSpeed       := nil;
    SaveModemBusy          := nil;
    SaveModemVoice         := nil;
    SaveModemError         := nil;
    SaveModemNoCarrier     := nil;
    SaveModemNoDialTone    := nil;
    SaveDialTimedOut       := nil;

    {search our owner for a modem}
    if Assigned(AOwner) and (AOwner.ComponentCount > 0) then
      for I := 0 to Pred(AOwner.ComponentCount) do
        if AOwner.Components[I] is TApdCustomModem then begin
          FModem := TApdCustomModem(AOwner.Components[I]);
          Break;
        end;
  end;

  destructor TApdCustomModemDialer.Destroy;
  begin
    ShutDownOnDestroy;

    inherited Destroy;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -