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

📄 main.~pas

📁 由内线接电话终端
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Types,
  Dialogs, Grids, StdCtrls, Buttons, ExtCtrls, AgentLamp, IniFiles, Mask, DigitLamp,
  OleCtrls, PCICARDLib_TLB, PCICARD, Data;

type
  TfrmExchange = class(TForm)
    SGRouter: TStringGrid;
    lblRouter: TLabel;
    btnSave: TBitBtn;
    btnDelete: TBitBtn;
    btnAdd: TBitBtn;
    Label1: TLabel;
    EdNumber: TMaskEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    btnEdit: TButton;
    Label6: TLabel;
    PCICARD1: TPCICARD;
    Label7: TLabel;
    EdSubLen: TEdit;
    EdSubNumber: TEdit;
    EdLine: TEdit;
    Label8: TLabel;
    EdComment: TEdit;
    Memo: TMemo;
    EdLineType: TComboBox;
    CBRing: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
    procedure SGRouterSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure btnAddClick(Sender: TObject);
    function StrToChType(Col : Integer; Row : Integer) : Integer;
    function GetChRow(ChType : Integer; ChIndex : Integer) : Integer;
    function CalloutErrReason(Param : Integer) : String;
    function ReleaseErrReason(Param : Integer) : String;
    procedure SGRouterDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure PCICARD1L1Call(ASender: TObject; ChType, ChIndex, Func,
      Param, SubParam1, SubParam2: Smallint; const Called,
      Caller: WideString);
    procedure PCICARD1L1Release(ASender: TObject; ChType, ChIndex, Reason,
      Err: Smallint);
    procedure PCICARD1L1Ack(ASender: TObject; ChType, ChIndex,
      Func: Smallint);
    procedure PCICARD1L1ACM(ASender: TObject; ChType, ChIndex,
      Func: Smallint);
    procedure PCICARD1L1CalloutChannel(ASender: TObject; ChType, ChIndex,
      Func, Err, MainRef, SubRef: Smallint);
    procedure btnCalloutClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmExchange: TfrmExchange;
  AgentLamp : TAgentLamp;
  DigitLamp : TDigitLamp;
  mCol, mRow : Integer;
  AgentPtArr : array of TPoint;
  DigitPtArr : array of TPoint;
  PCH : TAgentState;
  bStart : Boolean;
  DigitNum : Integer;
  AgentNum : Integer;

const
  NumberCol = 1;             //各栏对应常量
  SubLenCol = 2;
  SubNumberCol = 3;
  LineTypeCol = 4;
  LineCol = 5;
  CommentCol = 6;

implementation

{$R *.dfm}

procedure TfrmExchange.FormCreate(Sender: TObject);   //初始化
var
  RouterINI : TIniFile;
  Count, i : Integer;
  LineType, Number, Line, Comment, SubLen, SubNumber, AppPath : String;
  Num: Integer;
begin
  bStart := False;    //交换功能暂不可用,首先需初始化相关数据结构

  frmExchange.Left := 0;  //设置交换程序在桌面的位置
  frmExchange.Top := 0;

  PCICARD1.Open(0);
  DigitNum := 0;

  AgentNum := PCICARD1.L0LOGICCHNUM[CHTYPE_AGENT];    //内线通道数目
  Num := PCICARD1.L0LOGICCHNUM[CHTYPE_DTNO1];
  DigitNum := Num + DigitNum;
  Num := PCICARD1.L0LOGICCHNUM[CHTYPE_DTNO7];
  DigitNum := Num + DigitNum;
  Num := PCICARD1.L0LOGICCHNUM[CHTYPE_DTDSS1];
  DigitNum := Num + DigitNum;
  Num := PCICARD1.L0LOGICCHNUM[CHTYPE_DTNO7ISUP];
  DigitNum := Num + DigitNum;
  DigitNum := DigitNum div 32;    //数字线通道PCM数

  AppPath := ExtractFilePath(Paramstr(0));       //从Router.ini读入路由表
  RouterINI := TIniFile.Create(AppPath + 'Router.ini');
  Count := RouterINI.ReadInteger('Config', 'Count', 0);
  if Count > 0 then
  begin
    SGRouter.RowCount := Count + 1;
    for i := 1 to Count do
    begin
      Number := RouterINI.ReadString('Router' + inttostr(i), 'Number', '');
      SubLen := RouterINI.ReadString('Router' + inttostr(i), 'SubLen', '');
      SubNumber := RouterINI.ReadString('Router' + inttostr(i), 'SubNumber', '');
      LineType := RouterINI.ReadString('Router' + inttostr(i), 'LineType', '');
      Line := RouterINI.ReadString('Router' + inttostr(i), 'Line', '');
      Comment := RouterINI.ReadString('Router' + inttostr(i), 'Comment', '');

      SGRouter.Cells[0, i] := inttostr(i);
      SGRouter.Cells[1, i] := Number;
      SGRouter.Cells[2, i] := SubLen;
      SGRouter.Cells[3, i] := SubNumber;
      SGRouter.Cells[4, i] := LineType;
      SGRouter.Cells[5, i] := Line;
      SGRouter.Cells[6, i] := Comment;
    end;
  end;
  RouterINI.Free;

  //创建标志灯
  AgentLamp := TAgentLamp.Create(Self, AgentNum, 700, 30, Count);
  DigitLamp := TDigitLamp.Create(Self, DigitNum, 570, 30);

  //保存灯的坐标
  SetLength(AgentPtArr, AgentNum);
  SetLength(DigitPtArr, DigitNum);

  for i := 0 to AgentNum - 1 do
  begin
    AgentPtArr[i] := AgentLamp.GetLampPoint(i);
  end;

  for i := 0 to DigitNum - 1 do
  begin
    DigitPtArr[i] := DigitLamp.GetLampPoint(i);
  end;

  //初始化完成,交换功能可用
  bStart := True;

  //设置程序界面
  mCol := 0;
  mRow := 0;
  SGRouter.ColWidths[0] := 30;
  SGRouter.ColWidths[1] := 50;
  SGRouter.ColWidths[2] := 40;
  SGRouter.ColWidths[3] := 70;
  SGRouter.ColWidths[4] := 60;
  SGRouter.ColWidths[5] := 50;
  SGRouter.ColWidths[6] := 80;
  SGRouter.Cells[0, 0] := '序号';
  SGRouter.Cells[1, 0] := '号码';
  SGRouter.Cells[2, 0] := '续号长';
  SGRouter.Cells[3, 0] := '续号';
  SGRouter.Cells[4, 0] := '类型';
  SGRouter.Cells[5, 0] := '线路';
  SGRouter.Cells[6, 0] := '说明';

end;

//通过通道类型和通道号唯一确定该通道在路由表里所在的行
function TfrmExchange.GetChRow(ChType : Integer; ChIndex : Integer) : Integer;
var
  i : Integer;
begin
  for i := 1 to SGRouter.RowCount do
  begin
    if (StrToChType(LineTypeCol, i) = ChType) and (strtoint(SGRouter.Cells[LineCol, i]) = ChIndex) then
    begin
      result := i;
      Break;
    end;
  end;
end;

//程序退出
procedure TfrmExchange.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  AgentLamp.Destroy;
  DigitLamp.Destroy;
  PCICARD1.Close;
end;

//对信号灯连线
procedure TfrmExchange.FormPaint(Sender: TObject);
var
  i, j : Integer;
  dgCH : TDigitState;
  agCH : TAgentState;
begin
  Canvas.Pen.Color := clRed;

  for i := 0 to DigitLamp.Count - 1 do
  begin
    dgCH := DigitLamp.DataList.GetChPointer(i);

    if dgCH.UsedCount > 0 then
    begin
      Canvas.MoveTo(DigitPtArr[i].X, DigitPtArr[i].Y);
      for j := 0 to 23 do
      begin
        if dgCH.CallInLine[j] > 0 then
        begin
          Canvas.LineTo(AgentPtArr[j].X, AgentPtArr[j].Y);
          Canvas.MoveTo(DigitPtArr[i].X, DigitPtArr[i].Y);
        end;
      end;
    end;
  end;
end;

//当鼠标点中某一行时将此行数据在路由表的编辑区域显示
procedure TfrmExchange.SGRouterSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  mRow := ARow;
  mCol := ACol;

  if mRow > 0 then
  begin
    EdNumber.Text := SGRouter.Cells[1, ARow];
    EdSubLen.Text := SGRouter.Cells[2, ARow];
    EdSubNumber.Text := SGRouter.Cells[3, ARow];
    EdLineType.Text := SGRouter.Cells[4, ARow];
    EdLine.Text := SGRouter.Cells[5, ARow];
    EdComment.Text := SGRouter.Cells[6, ARow];
  end;
end;

//增教一条路由信息
procedure TfrmExchange.btnAddClick(Sender: TObject);
begin
  mRow := 0;
  if (EdNumber.Text <> '') and (EdSubLen.Text <> '') and (EdSubNumber.Text <> '') and (EdLineType.Text <> '') and (EdLine.Text <> '') and (EdComment.Text <> '') then
  begin
    SGRouter.RowCount := SGRouter.RowCount + 1;
    SGRouter.Cells[0, SGRouter.RowCount - 1] := inttostr(SGRouter.RowCount - 1);
    SGRouter.Cells[1, SGRouter.RowCount - 1] := EdNumber.Text;
    EdNumber.Text := '';
    SGRouter.Cells[2, SGRouter.RowCount - 1] := EdSubLen.Text;
    EdSubLen.Text := '';
    SGRouter.Cells[3, SGRouter.RowCount - 1] := EdSubNumber.Text;
    EdSubNumber.Text := '';
    SGRouter.Cells[4, SGRouter.RowCount - 1] := EdLineType.Text;
    EdLineType.Text := '';
    SGRouter.Cells[5, SGRouter.RowCount - 1] := EdLine.Text;
    EdLine.Text := '';
    SGRouter.Cells[6, SGRouter.RowCount - 1] := EdComment.Text;
    EdComment.Text := '';

    AgentLamp.DataList.SetRowArrLength(SGRouter.RowCount);
  end
  else
    ShowMessage('请确认各参数不为空!');

end;


procedure TfrmExchange.SGRouterDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  strTmp : string;
  RC : TRect;
begin
  with SGRouter do
    begin
      Canvas.FillRect(Rect);
      strTmp := Cells[ACol, ARow];
      RC := Rect;
      DrawText(Canvas.Handle, PChar(strTmp), Length(strTmp), RC, DT_CENTER or DT_SINGLELINE or DT_VCENTER);
    end;
end;

//删除一条路由信息
procedure TfrmExchange.btnDeleteClick(Sender: TObject);
var
  i, j, k : Integer;
begin
  if SGRouter.RowCount > 1 then
  begin
    i := SGRouter.row;
    for j := i to SGRouter.RowCount do
    begin
      for k := 0 to SGRouter.ColCount-1 do
      begin
        SGRouter.Cells[k, j] := SGRouter.Cells[k, j+1];
      end;
    end;

    if SGRouter.RowCount > 2 then
    begin
      SGRouter.RowCount := SGRouter.RowCount - 1;

      for i := 1 to SGRouter.RowCount do
        SGRouter.Cells[0, i] := inttostr(i);
    end;
  end;
end;

//保存路由表信息到Router.ini文件
procedure TfrmExchange.btnSaveClick(Sender: TObject);
var
  RouterINI : TIniFile;
  AppPath : String;
  i : Integer;
begin

⌨️ 快捷键说明

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