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