📄 addial.pas
字号:
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 + -