📄 mainform.pas
字号:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ShellApi, Math;
const ERROR_NONE = 0;
ERROR_DRIVER = 2;
ERROR_SCM_CANT_CONNECT = 9998;
CST_Switch_1: integer = 129;
CST_Switch_2: integer = 6;
CST_Switch_3: integer = 24;
CST_Switch_4: integer = 96;
type
TForm_Main = class(TForm)
Memo: TMemo;
Panel1: TPanel;
SpdStn_1: TSpeedButton;
SpdStn_2: TSpeedButton;
SpdStn_3: TSpeedButton;
SpdStn_4: TSpeedButton;
PaintBox: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure SpdStn_1Click(Sender: TObject);
procedure SpdStn_2Click(Sender: TObject);
procedure SpdStn_3Click(Sender: TObject);
procedure SpdStn_4Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
Port: array [1..3] of Word;//LPT端口的地址
PortStatus: array [1..4] of boolean;//保存开关的状态;开/关
procedure DrawPortStatus;
procedure InitPortStatus;
public
procedure InitForm;
procedure SetData(aData: Word; aPortNum:Word = 1);
function GetData(aPortNum:Word = 1): Word;
procedure SetPortStatus(aPortStatus: array of boolean);
end;
function GetLPTPortAddress(aPortNo:Word):Word; stdcall; external 'ntport.dll';
function Inp(PortNum:Word):Word; stdcall; external 'ntport.dll';
function Inpw(PortNum:Word):Word; stdcall; external 'ntport.dll';
procedure Outp(PortNum:Word; Data:Word); stdcall; external 'ntport.dll';
procedure Outpw(PortNum:Word; Data:Word); stdcall; external 'ntport.dll';
function GetLastState(s:PCHAR): longint;stdcall; external 'ntport.dll';
procedure LicenseInfo(sUserName: PChar; lKey: longint); stdcall; external 'ntport.dll';
var
Form_Main: TForm_Main;
implementation
{$R *.dfm}
//==============================================================================
//根据PortStatus存入的开关状态画出状态 ****************************************
//==============================================================================
procedure TForm_Main.DrawPortStatus;
const
CTop = 1;
CInterval = 30;
CD = 15;
var iTop, iLeft, i: integer;
begin
PaintBox.Repaint;
iTop:= CTop;
iLeft:= 5;
for i:= 1 to High(PortStatus) do
begin
if PortStatus[i] then
PaintBox.Canvas.Brush.Color:= clRed
else
PaintBox.Canvas.Brush.Color:= clBlue;
PaintBox.Canvas.Ellipse(Rect(iLeft, iTop, iLeft + CD, iTop + CD));
PaintBox.Canvas.Brush.Style:= bsClear;
PaintBox.Canvas.TextOut(iLeft + CD div 2 - 2, iTop + CD + 2, IntToStr(i));
PaintBox.Canvas.Brush.Style:= bsSolid;
iLeft:= iLeft + CInterval;
end;
end;
//==============================================================================
//OnFormCreate ****************************************************************
//==============================================================================
procedure TForm_Main.FormCreate(Sender: TObject);
begin
end;
//==============================================================================
//从指定端口读入Word类型数据 **************************************************
//==============================================================================
function TForm_Main.GetData(aPortNum: Word): Word;
begin
Result:= Inpw(Port[aPortNum]);
end;
//==============================================================================
//初始化窗体 ******************************************************************
//==============================================================================
procedure TForm_Main.InitForm;
var i: integer;
begin
FillChar(Port, 3, 0);
for i:= 1 to 3 do
Port[i]:= GetLPTPortAddress(i);
Memo.Lines.Add('打印机的端口地址为:' + IntToHex(Port[1], 4) + 'H');
InitPortStatus;
end;
//==============================================================================
//初始化开关状态 **************************************************************
//==============================================================================
procedure TForm_Main.InitPortStatus;
var iCurrData: integer;
begin
iCurrData:= GetData;
PortStatus[1]:= (iCurrData and CST_Switch_1) = CST_Switch_1;
PortStatus[2]:= (iCurrData and CST_Switch_2) = CST_Switch_2;
PortStatus[3]:= (iCurrData and CST_Switch_3) = CST_Switch_3;
PortStatus[4]:= (iCurrData and CST_Switch_4) = CST_Switch_4;
end;
//==============================================================================
//向指定端口输出Word类型数据 **************************************************
//==============================================================================
procedure TForm_Main.SetData(aData: Word; aPortNum: Word);
begin
Outpw(Port[aPortNum], aData);
end;
//==============================================================================
//设置端口开关的状态 **********************************************************
//==============================================================================
procedure TForm_Main.SetPortStatus(aPortStatus: array of boolean);
var i, j: integer;
begin
j:= Low(aPortStatus);
if (j < 0) then Exit;
for i:= Low(PortStatus) to High(PortStatus) do
begin
PortStatus[i]:= aPortStatus[j];
Inc(j);
if (j > High(aPortStatus)) then Break;
end;
DrawPortStatus;
end;
//==============================================================================
procedure TForm_Main.SpdStn_1Click(Sender: TObject);
var iData: integer;
begin
iData:= GetData;
if ((iData and CST_Switch_1) = CST_Switch_1) then//Close Switch
begin
SetData(CST_Switch_1 xor iData);
PortStatus[1]:= false;
Memo.Lines.Add('开关1关闭。');
end
else
begin
SetData(CST_Switch_1 or iData);//Open Switch
PortStatus[1]:= true;
Memo.Lines.Add('开关1打开。');
end;
DrawPortStatus;
end;
//==============================================================================
procedure TForm_Main.SpdStn_2Click(Sender: TObject);
var iData: integer;
begin
iData:= GetData;
if ((iData and CST_Switch_2) = CST_Switch_2) then//Close Switch
begin
SetData(CST_Switch_2 xor iData);
PortStatus[2]:= false;
Memo.Lines.Add('开关2关闭。');
end
else
begin
SetData(CST_Switch_2 or iData);//Open Switch
PortStatus[2]:= true;
Memo.Lines.Add('开关2打开。');
end;
DrawPortStatus;
end;
//==============================================================================
procedure TForm_Main.SpdStn_3Click(Sender: TObject);
var iData: integer;
begin
iData:= GetData;
if ((iData and CST_Switch_3) = CST_Switch_3) then//Close Switch
begin
SetData(CST_Switch_3 xor iData);
PortStatus[3]:= false;
Memo.Lines.Add('开关3关闭。');
end
else
begin
SetData(CST_Switch_3 or iData);//Open Switch
PortStatus[3]:= true;
Memo.Lines.Add('开关3打开。');
end;
DrawPortStatus;
end;
//==============================================================================
procedure TForm_Main.SpdStn_4Click(Sender: TObject);
var iData: integer;
begin
iData:= GetData;
if ((iData and CST_Switch_4) = CST_Switch_4) then//Close Switch
begin
SetData(CST_Switch_4 xor iData);
PortStatus[4]:= false;
Memo.Lines.Add('开关4关闭。');
end
else
begin
SetData(CST_Switch_4 or iData);//Open Switch
PortStatus[4]:= true;
Memo.Lines.Add('开关4打开。');
end;
DrawPortStatus;
end;
//==============================================================================
procedure TForm_Main.FormActivate(Sender: TObject);
begin
DrawPortStatus;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -