SENDFAX0.PAS
上传用户:obeide
上传日期:2007-01-11
资源大小:15k
文件大小:18k
源码类别:

传真(Fax)编程

开发平台:

Delphi

  1. {**********************************************************}
  2. {*                     SENDFAX0.PAS                       *}
  3. {*   Copyright (c) TurboPower Software Company 1996-98    *}
  4. {*                  All rights reserved                   *}
  5. {**********************************************************}
  6. unit Sendfax0;
  7. interface
  8. uses
  9.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  10.   Forms, Dialogs, StdCtrls, OoMisc, AdFax, AdFStat, AdPort, ExtCtrls,
  11.   SendFax1, AdTapi, AdExcept, ComCtrls, Buttons,FileCtrl;
  12. const
  13.   Receive=0;
  14.   Send=1;
  15. type
  16.   PAddEntry = ^TAddEntry;
  17.   TAddEntry = record
  18.     FaxName     : String;      //接收者姓名
  19.     CoverName   : String;      //
  20.     PhoneNumber : String;       //传真号码
  21.     NextEntry   : PAddEntry;    //下个号码
  22.   end;
  23.   TsfMain = class(TForm)
  24.     PageControl1: TPageControl;
  25.     TabSheet1: TTabSheet;
  26.     TabSheet2: TTabSheet;
  27.     Label7: TLabel;
  28.     SendFax: TButton;
  29.     sfAdd: TButton;
  30.     sfExit: TButton;
  31.     Panel1: TPanel;
  32.     Label1: TLabel;
  33.     Label2: TLabel;
  34.     Label3: TLabel;
  35.     Label4: TLabel;
  36.     Label5: TLabel;
  37.     Label6: TLabel;
  38.     sfFaxClass: TRadioGroup;
  39.     sfModemInit: TEdit;
  40.     sfHeader: TEdit;
  41.     sfStationID: TEdit;
  42.     sfDialPrefix: TEdit;
  43.     sfDialAttempts: TEdit;
  44.     sfRetryWait: TEdit;
  45.     EnhText: TCheckBox;
  46.     HdrFontBtn: TButton;
  47.     CvrFontBtn: TButton;
  48.     sfModify: TButton;
  49.     sfDelete: TButton;
  50.     sfFaxListBox: TListBox;
  51.     sfSelectComPort: TButton;
  52.     ApdComPort1: TApdComPort;
  53.     ApdFaxStatus1: TApdFaxStatus;
  54.     ApdSendFax1: TApdSendFax;
  55.     ApdFaxLog1: TApdFaxLog;
  56.     ApdTapiDevice1: TApdTapiDevice;
  57.     FontDialog1: TFontDialog;
  58.     Panel2: TPanel;
  59.     Label8: TLabel;
  60.     Label9: TLabel;
  61.     rfFaxClass: TRadioGroup;
  62.     rfNameStyle: TRadioGroup;
  63.     rfDirectory: TEdit;
  64.     rfModemInit: TEdit;
  65.     Panel3: TPanel;
  66.     Label10: TLabel;
  67.     rfReceiveList: TListBox;
  68.     rfReceiveFaxes: TButton;
  69.     rfExit: TButton;
  70.     rfSelectPort: TButton;
  71.     ApdReceiveFax1: TApdReceiveFax;
  72.     BitBtn1: TBitBtn;
  73.     procedure SendFaxClick(Sender: TObject);
  74.     procedure sfAppendAddList(FName, CName, PNumber : String);
  75.     procedure sfGetAddListEntry(var FName, CName, PNumber : String);
  76.     procedure sfAddPrim;
  77.     procedure sfAddClick(Sender: TObject);
  78.     procedure sfAddFromCmdLine;
  79.     procedure ApdSendFax1FaxNext(CP: TObject; var ANumber, AFileName,
  80.       ACoverName: TPassString);
  81.     procedure ApdSendFax1FaxFinish(CP: TObject; ErrorCode: Integer);
  82.     procedure sfExitClick(Sender: TObject);
  83.     procedure sfModifyClick(Sender: TObject);
  84.     procedure sfDeleteClick(Sender: TObject);
  85.     procedure ApdSendFax1FaxLog(CP: TObject; LogCode: TFaxLogCode);
  86.     procedure sfFaxClassClick(Sender: TObject);
  87.     procedure sfDialAttemptsChange(Sender: TObject);
  88.     procedure sfRetryWaitChange(Sender: TObject);
  89.     procedure sfStationIDChange(Sender: TObject);
  90.     procedure sfDialPrefixChange(Sender: TObject);
  91.     procedure sfModemInitChange(Sender: TObject);
  92.     procedure sfHeaderChange(Sender: TObject);
  93.     procedure FormShow(Sender: TObject);
  94.     procedure sfSelectComPortClick(Sender: TObject);
  95.     procedure ApdTapiDevice1TapiPortOpen(Sender: TObject);
  96.     procedure ApdTapiDevice1TapiPortClose(Sender: TObject);
  97.     procedure HdrFontBtnClick(Sender: TObject);
  98.     procedure CvrFontBtnClick(Sender: TObject);
  99.     procedure rfSelectPortClick(Sender: TObject);
  100.     procedure rfReceiveFaxesClick(Sender: TObject);
  101.     procedure rfExitClick(Sender: TObject);
  102.     procedure rfFaxClassClick(Sender: TObject);
  103.     procedure rfDirectoryChange(Sender: TObject);
  104.     procedure rfModemInitChange(Sender: TObject);
  105.     procedure rfNameStyleClick(Sender: TObject);
  106.     procedure PageControl1Change(Sender: TObject);
  107.     procedure ApdReceiveFax1FaxError(CP: TObject; ErrorCode: Integer);
  108.     procedure ApdReceiveFax1FaxFinish(CP: TObject; ErrorCode: Integer);
  109.     procedure ApdReceiveFax1FaxLog(CP: TObject; LogCode: TFaxLogCode);
  110.     procedure BitBtn1Click(Sender: TObject);
  111.   private
  112.     { Private declarations }
  113.     FaxList     : TStringList;
  114.     FaxIndex    : Word;
  115.     InProgress  : Boolean;
  116.     Current:integer;
  117.     AddsInProgress    : Boolean;
  118.     AddsPending       : Word;
  119.     AddList           : PAddEntry;
  120.     ProcessedCmdLine  : Boolean;
  121.   public
  122.     { Public declarations }
  123.     constructor Create(AComponent : TComponent); override;
  124.     destructor Destroy; override;
  125.     procedure sfAddFromPrinterDriver(var Message: TMessage);
  126.       message APW_PRINTDRIVERJOBCREATED;
  127.   end;
  128. var
  129.   sfMain: TsfMain;
  130. implementation
  131. {$R *.DFM}
  132. function LimitS(const S : String; Len : Word) : String;
  133. //减小显示的长度
  134. begin
  135.   if Length(S) > Len then
  136.     Result := Copy(S, 1, Len) + '...'
  137.   else
  138.     Result := S;
  139. end;
  140. constructor TsfMain.Create(AComponent : TComponent);
  141.   {-Create the form}
  142. begin
  143.   inherited Create(AComponent);
  144.   FaxList     := TStringList.Create;
  145.   InProgress  := False;
  146.   AddList     := nil;
  147.   AddsPending := 0;
  148.   AddsInProgress := False;
  149.   ProcessedCmdLine := False;
  150.    rfDirectory.Text := ApdReceiveFax1.DestinationDir;
  151.   rfModemInit.Text := ApdReceiveFax1.ModemInit;
  152. end;
  153. destructor TsfMain.Destroy;
  154. begin
  155.   FaxList.Free;
  156.   inherited Destroy;
  157. end;
  158. procedure TsfMain.FormShow(Sender: TObject);
  159.   {-Handle any command line arguments}
  160. begin
  161.   if not ProcessedCmdLine then begin
  162.     sfAddFromCmdLine;
  163.     ProcessedCmdLine := True;
  164.     if sfHeader.Text = 'Fax sent by $I using APro    $D $T' then
  165.       sfHeader.Text := 'Fax sent by $I using APro ' + ApdComPort1.Version + '   $D $T';
  166.   end;
  167. end;
  168. procedure TsfMain.SendFaxClick(Sender: TObject);
  169. //发送传真
  170. begin
  171.   if not InProgress then begin
  172.     InProgress := True;
  173.     //获得用户
  174.     FaxIndex := 0;
  175.     ApdSendFax1.FaxClass := TFaxClass(sfFaxClass.ItemIndex+1);
  176.     try
  177.       //尝试次数
  178.       ApdSendFax1.DialAttempts := StrToInt(sfDialAttempts.Text);
  179.       //等待时间
  180.       ApdSendFax1.DialRetryWait := StrToInt(sfRetryWait.Text);
  181.     except
  182.     end;
  183.     ApdSendFax1.EnhTextEnabled := EnhText.Checked;
  184.     ApdSendFax1.StationID := sfStationID.Text;
  185.     ApdSendFax1.DialPrefix := sfDialPrefix.Text;
  186.     ApdSendFax1.ModemInit := sfModemInit.Text;    //初始化Modem
  187.     ApdSendFax1.HeaderLine := sfHeader.Text;     //传真头
  188.     if (ApdComPort1.TapiMode = tmOn) or
  189.        ((ApdComPort1.TapiMode = tmAuto) and
  190.         (ApdTapiDevice1.SelectedDevice <> '')) then begin
  191.         //Tapi设置,打开端口
  192.       ApdTapiDevice1.ConfigAndOpen;
  193.     end else begin
  194.       //打开端口开始发送
  195.       try
  196.         ApdComPort1.Open := True;
  197.       except
  198.         InProgress := False;
  199.         raise;
  200.       end;
  201.       ApdSendFax1.StartTransmit;
  202.     end;
  203.   end else
  204.     MessageBeep(0);
  205. end;
  206. procedure TsfMain.sfAppendAddList(FName, CName, PNumber : String);
  207. //新添一个到发送列表中
  208. var
  209.   NewEntry : PAddEntry;
  210. begin
  211.   if AddList = nil then begin
  212.     //清空记录
  213.     GetMem(AddList, sizeof(TAddEntry));
  214.     NewEntry := AddList;
  215.   end else begin
  216.     //末尾指针
  217.     NewEntry := AddList;
  218.     while NewEntry^.NextEntry <> nil do
  219.       NewEntry := NewEntry^.NextEntry;
  220.       //分配内存
  221.     GetMem(NewEntry^.NextEntry, sizeof(TAddEntry));
  222.     NewEntry := NewEntry^.NextEntry;   //指针移动
  223.   end;
  224.   //清空记录
  225.   FillChar(NewEntry^, SizeOf(TAddEntry), 0);
  226.   with NewEntry^ do begin //
  227.     FaxName := FName;
  228.     CoverName := CName;
  229.     PhoneNumber := PNumber;
  230.     NextEntry := nil;
  231.   end;
  232.   inc(AddsPending);
  233. end;
  234. procedure TsfMain.sfGetAddListEntry(var FName, CName, PNumber : String);
  235. //
  236. var
  237.   TempEntry : PAddEntry;
  238. begin
  239.   if AddList = nil then
  240.     exit;
  241.   TempEntry := AddList;
  242.   AddList := AddList^.NextEntry;
  243.   with TempEntry^ do begin
  244.     FName := FaxName;
  245.     CName := CoverName;
  246.     PNumber := PhoneNumber;
  247.   end;
  248.   FreeMem(TempEntry, SizeOf(TAddEntry));
  249.   dec(AddsPending);
  250. end;
  251. procedure TsfMain.sfAddPrim;
  252.  //显示添加的对话框
  253. var
  254.   S : String;
  255.   FName, CName, PNumber : String;
  256. begin
  257.    AddsInProgress := True;
  258.    sfFaxList.flAction.Caption := '添加';
  259.   while AddsPending > 0 do begin
  260.     //显示
  261.     with sfFaxList do begin
  262.       sfGetAddListEntry(FName, CName, PNumber);
  263.       FaxName := FName;
  264.       CoverName := CName;
  265.       PhoneNumber := PNumber;
  266.     end;
  267.     //如果要添加的不为空即添加
  268.     if (sfFaxList.ShowModal = mrOK) and
  269.        (sfFaxList.PhoneNumber <> '') and
  270.        (sfFaxList.FaxName <> '') then begin
  271.       //显示在列表中
  272.       S := sfFaxList.PhoneNumber + '^' + sfFaxList.FaxName;
  273.       if sfFaxList.CoverName <> '' then
  274.         S := S + '^' + sfFaxList.CoverName;
  275.       FaxList.Add(S);
  276.       //
  277.       S := Format('%-20S %-20S %-20S',
  278.                   [LimitS(sfFaxList.PhoneNumber, 20),
  279.                    LimitS(sfFaxList.FaxName, 20),
  280.                    LimitS(sfFaxList.CoverName, 20)]);
  281.       sfFaxListBox.Items.Add(S);
  282.     end;
  283.   end;
  284.   AddsInProgress := False;
  285. end;
  286. procedure TsfMain.sfAddClick(Sender: TObject);
  287. //添加要发送的文件
  288. begin
  289.   sfAppendAddList('', '', '');
  290.   sfAddPrim;
  291. end;
  292. procedure TsfMain.sfAddFromPrinterDriver(var Message: TMessage);
  293. // 通过打印驱动程序添加请求信息
  294. var
  295.   JobID  : Word;
  296.   KeyBuf : array[0..8] of Char;
  297.   zFName : array[0..255] of Char;
  298. begin
  299.   //
  300.   {The message received from the printer driver has a job identifier
  301.    in the wParam field.  This job identifier points to an entry in the
  302.    SendFax.Ini file which the printer driver has added.  As SendFax
  303.    handles each message, it should delete that job entry from the Ini
  304.    file and queue the job for display in the Add dialog.}
  305.   with Message do begin
  306.     JobID := wParam;
  307.     StrCopy(KeyBuf, 'Job');
  308.     KeyBuf[3] := Chr(Lo(JobID));
  309.     KeyBuf[4] := #0;
  310.     GetPrivateProfileString('FaxJobs', KeyBuf, '', zFName, sizeof(zFName),
  311.                             'SENDFAX.INI');
  312.    WritePrivateProfileString('FaxJobs', KeyBuf, nil, 'SENDFAX.INI');
  313.   end;
  314.   sfAppendAddList(StrPas(zFName), '', '');
  315.   if not AddsInProgress then
  316.     sfAddPrim;
  317. end;
  318. procedure TsfMain.sfAddFromCmdLine;
  319. //从命令行中发送请求信息
  320. begin
  321.   if uppercase(ParamStr(1)) = '/F' then begin
  322.     sfAppendAddList(ParamStr(2), '', '');
  323.     if not AddsInProgress then
  324.       sfAddPrim;
  325.   end;
  326. end;
  327. procedure TsfMain.ApdSendFax1FaxNext(CP: TObject;
  328.                                      var ANumber, AFileName,
  329.                                      ACoverName: TPassString);
  330. //下一个要发的传真文件
  331. var
  332.   S : String;
  333.   CaretPos : Byte;
  334. begin
  335.   if FaxList.Count = 0 then Exit;
  336.   try
  337.     S := FaxList[FaxIndex];
  338.     CaretPos := Pos('^', S);
  339.     ANumber := Copy(S, 1, CaretPos-1);
  340.     S := Copy(S, CaretPos+1, 255);
  341.     CaretPos := Pos('^', S);
  342.     if CaretPos = 0 then begin
  343.       AFileName := S;
  344.       ACoverName := '';
  345.     end else begin
  346.       AFileName := Copy(S, 1, CaretPos-1);
  347.       ACoverName := Copy(S, CaretPos+1, 255);
  348.     end;
  349.     Inc(FaxIndex);
  350.   except
  351.     ANumber := '';
  352.     AFileName := '';
  353.     ACoverName := '';
  354.   end;
  355. end;
  356. procedure TsfMain.ApdSendFax1FaxFinish(CP: TObject; ErrorCode: Integer);
  357. //显示结束信息
  358. begin
  359.   ShowMessage('结束: ' + ErrorMsg(ErrorCode));
  360.   if ApdComPort1.TapiMode = tmOn then
  361.     if ApdTapiDevice1.CancelCall then
  362.        //立刻取消呼叫,清标志
  363.       InProgress := False
  364.     else
  365.       //等待执行OnTapiPortClose进行端口关闭
  366.   else begin
  367.       //未使用TAPI,直接关闭端口
  368.     ApdComPort1.Open := False;
  369.     InProgress := False;
  370.   end;
  371. end;
  372. procedure TsfMain.sfExitClick(Sender: TObject);
  373. //退出应用程序
  374. var
  375.   TempEntry : PAddEntry;
  376. begin
  377.   while AddList <> nil do begin
  378.     TempEntry := AddList;
  379.     AddList := AddList^.NextEntry;
  380.     FreeMem(TempEntry, SizeOf(TAddEntry));
  381.   end;
  382.   Close;
  383. end;
  384. procedure TsfMain.sfModifyClick(Sender: TObject);
  385. //修改已加入的发送列表
  386. var
  387.   SaveIndex : Integer;
  388.   CPos : Word;
  389.   S : String;
  390. begin
  391.   if InProgress then begin
  392.     MessageBeep(0);
  393.     Exit;
  394.   end;
  395.   if sfFaxListBox.ItemIndex = -1 then
  396.     Exit;
  397.    sfFaxList.flAction.Caption := '修改';
  398.   //从FaxList中获取列表
  399.   SaveIndex := sfFaxListBox.ItemIndex;
  400.   S := FaxList[SaveIndex];
  401.   CPos := Pos('^', S);
  402.   sfFaxList.PhoneNumber := Copy(S, 1, CPos-1);
  403.   S := Copy(S, CPos+1, 255);
  404.   CPos := Pos('^', S);
  405.   if CPos = 0 then
  406.     sfFaxList.FaxName := S
  407.   else begin
  408.     sfFaxList.FaxName := Copy(S, 1, CPos-1);
  409.     sfFaxList.CoverName := Copy(S, CPos+1, 255);
  410.   end;
  411.   //显示对话框
  412.   if sfFaxList.ShowModal = mrOK then begin
  413.    //修改列表
  414.      S := sfFaxList.PhoneNumber + '^' + sfFaxList.FaxName;
  415.     if sfFaxList.CoverName <> '' then
  416.       S := S + '^' + sfFaxList.CoverName;
  417.     FaxList.Strings[SaveIndex] := S;
  418.    //
  419.     S := Format('%-20S %-20S %-20S',
  420.                 [LimitS(sfFaxList.PhoneNumber, 20),
  421.                  LimitS(sfFaxList.FaxName, 20),
  422.                  LimitS(sfFaxList.CoverName, 20)]);
  423.     sfFaxListBox.Items[SaveIndex] := S;
  424.   end;
  425. end;
  426. procedure TsfMain.sfDeleteClick(Sender: TObject);
  427. //删除要发送的传真文件
  428. var
  429.   Index : Word;
  430. begin
  431.   if InProgress then begin
  432.     MessageBeep(0);
  433.     Exit;
  434.   end;
  435.   if sfFaxListBox.ItemIndex <> -1 then begin
  436.     Index := sfFaxListBox.ItemIndex;
  437.     sfFaxListBox.Items.Delete(Index);
  438.     FaxList.Delete(Index);
  439.   end;
  440. end;
  441. procedure TsfMain.ApdSendFax1FaxLog(CP: TObject; LogCode: TFaxLogCode);
  442. //产生日志
  443. begin
  444.   if LogCode = lfaxTransmitOK then begin
  445.     Dec(FaxIndex);
  446.     sfFaxListBox.Items.Delete(FaxIndex);
  447.     FaxList.Delete(FaxIndex);
  448.   end;
  449. end;
  450. procedure TsfMain.sfFaxClassClick(Sender: TObject);
  451. //用另一种类型
  452. //传真类型,这要看FaxMode的类型,看支持哪一类,
  453. //通常应用程序应该用最高的支持fcClass2_0
  454. //fcClass2.fcClass1
  455. begin
  456.   ApdSendFax1.FaxClass := TFaxClass(sfFaxClass.ItemIndex+1);
  457. end;
  458. procedure TsfMain.sfDialAttemptsChange(Sender: TObject);
  459. //最多的尝试连接次数
  460. begin
  461.   try
  462.     ApdSendFax1.DialAttempts := StrToInt(sfDialAttempts.Text);
  463.   except
  464.   end;
  465. end;
  466. procedure TsfMain.sfRetryWaitChange(Sender: TObject);
  467. //最大的等待时间
  468. begin
  469.   try
  470.     ApdSendFax1.DialRetryWait := StrToInt(sfRetryWait.Text);
  471.   except
  472.   end;
  473. end;
  474. procedure TsfMain.sfStationIDChange(Sender: TObject);
  475. //设置新工作站ID
  476. begin
  477.   ApdSendFax1.StationID := sfStationID.Text;
  478. end;
  479. procedure TsfMain.sfDialPrefixChange(Sender: TObject);
  480. //设置新的拨号前缀
  481. begin
  482.   ApdSendFax1.DialPrefix := sfDialPrefix.Text;
  483. end;
  484. procedure TsfMain.sfModemInitChange(Sender: TObject);
  485. //设置新的Modem初始化字符串
  486. begin
  487.   ApdSendFax1.ModemInit := sfModemInit.Text;
  488. end;
  489. procedure TsfMain.sfHeaderChange(Sender: TObject);
  490. //设置新的传真文件头
  491. begin
  492.   ApdSendFax1.HeaderLine := sfHeader.Text;
  493. end;
  494. procedure TsfMain.sfSelectComPortClick(Sender: TObject);
  495. //选择设备
  496. begin
  497.   ApdTapiDevice1.SelectDevice;
  498. end;
  499. procedure TsfMain.ApdTapiDevice1TapiPortOpen(Sender: TObject);
  500. begin
  501.   //利用TAPI设置并打开端口,开始传真会话
  502.   if Current=0 then
  503.    ApdSendFax1.StartTransmit
  504.   else
  505.    ApdReceiveFax1.StartReceive;
  506. end;
  507. procedure TsfMain.ApdTapiDevice1TapiPortClose(Sender: TObject);
  508. begin
  509.   InProgress := False;
  510. end;
  511. procedure TsfMain.HdrFontBtnClick(Sender: TObject);
  512. //设置字体
  513. begin
  514.   FontDialog1.Font.Assign(ApdSendFax1.EnhHeaderFont);
  515.   if FontDialog1.Execute then
  516.     ApdSendFax1.EnhHeaderFont.Assign(FontDialog1.Font);
  517. end;
  518. procedure TsfMain.CvrFontBtnClick(Sender: TObject);
  519. begin
  520.   FontDialog1.Font.Assign(ApdSendFax1.EnhFont);
  521.   if FontDialog1.Execute then
  522.     ApdSendFax1.EnhFont.Assign(FontDialog1.Font);
  523. end;
  524. procedure TsfMain.rfSelectPortClick(Sender: TObject);
  525. begin
  526.   ApdTapiDevice1.SelectDevice;
  527. end;
  528. procedure TsfMain.rfReceiveFaxesClick(Sender: TObject);
  529. begin
  530. if not InProgress then begin
  531.     InProgress := True;
  532.     ApdReceiveFax1.FaxClass := TFaxClass(rfFaxClass.ItemIndex+1);
  533.     ApdReceiveFax1.DestinationDir := rfDirectory.Text;
  534.     ApdReceiveFax1.ModemInit := rfModemInit.Text;
  535.     if (ApdComPort1.TapiMode = tmOn) or
  536.        ((ApdComPort1.TapiMode = tmAuto) and
  537.         (ApdTapiDevice1.SelectedDevice <> '')) then begin
  538.       {Tell TAPI to configure and open the port}
  539.       ApdTapiDevice1.ConfigAndOpen;
  540.     end else begin
  541.       {Open the port and start receiving}
  542.       ApdComPort1.Open := True;
  543.       ApdReceiveFax1.StartReceive;
  544.     end;
  545.   end else
  546.     MessageBeep(0);
  547. end;
  548. procedure TsfMain.rfExitClick(Sender: TObject);
  549. begin
  550.   Close;
  551. end;
  552. procedure TsfMain.rfFaxClassClick(Sender: TObject);
  553. begin
  554.  ApdReceiveFax1.FaxClass := TFaxClass(rfFaxClass.ItemIndex+1);
  555. end;
  556. procedure TsfMain.rfDirectoryChange(Sender: TObject);
  557. begin
  558.   ApdReceiveFax1.DestinationDir := rfDirectory.Text;
  559. end;
  560. procedure TsfMain.rfModemInitChange(Sender: TObject);
  561. begin
  562.   ApdReceiveFax1.ModemInit := rfModemInit.Text;
  563. end;
  564. procedure TsfMain.rfNameStyleClick(Sender: TObject);
  565. begin
  566.   ApdReceiveFax1.FaxNameMode := TFaxNameMode(rfNameStyle.ItemIndex+1);
  567. end;
  568. procedure TsfMain.PageControl1Change(Sender: TObject);
  569. begin
  570.  if PageControl1.ActivePageIndex=0 then
  571.  begin
  572.    Current:=0;
  573.    ApdFaxStatus1.Fax:=ApdSendFax1;
  574.    ApdFaxLog1.Fax:=ApdSendFax1;
  575.  end
  576.  else
  577.  begin
  578.    Current:=1;
  579.    ApdFaxStatus1.Fax:=ApdReceiveFax1;
  580.    ApdFaxLog1.Fax:=ApdReceiveFax1;
  581.  end;
  582. end;
  583. procedure TsfMain.ApdReceiveFax1FaxError(CP: TObject; ErrorCode: Integer);
  584. begin
  585.  ShowMessage('Fax error: ' + ErrorMsg(ErrorCode));
  586. end;
  587. procedure TsfMain.ApdReceiveFax1FaxFinish(CP: TObject; ErrorCode: Integer);
  588. begin
  589.  if ApdComPort1.TapiMode = tmOn then
  590.     if ApdTapiDevice1.CancelCall then
  591.       {Call cancelled immediately, clear InProgress flag}
  592.       InProgress := False
  593.     else
  594.       {CancelCall proceeding in background, waiting for OnTapiPortClose}
  595.   else begin
  596.     {Not using TAPI, just close the port and clear the InProgress flag}
  597.     ApdComPort1.Open := False;
  598.     InProgress := False;
  599.   end;
  600. end;
  601. procedure TsfMain.ApdReceiveFax1FaxLog(CP: TObject; LogCode: TFaxLogCode);
  602. var
  603.   FSize : LongInt;
  604.   F     : File;
  605.   S     : String;
  606. begin
  607.   if LogCode = AdFax.lfaxReceiveOK then begin
  608.     {Get the file size}
  609.     AssignFile(F, ApdReceiveFax1.FaxFile);
  610.     Reset(F, 1);
  611.     FSize := FileSize(F);
  612.     CloseFile(F);
  613.     {Add an entry to the displayed list box of received files}
  614.     S := Format('%-25S %-20S %-20S',
  615.                 [LimitS(ExtractFileName(ApdReceiveFax1.FaxFile), 20),
  616.                  IntToStr(FSize),
  617.                  DateTimeToStr(Now)]);
  618.     rfReceiveList.Items.Add(S);
  619.   end;
  620. end;
  621. procedure TsfMain.BitBtn1Click(Sender: TObject);
  622. var
  623.   Dir: string;
  624. begin
  625.   Dir := ExtractFilePath(Application.ExeName);
  626.   if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],0) then
  627.     rfDirectory.text:= Dir;
  628. end;
  629. end.