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

📄 mainform.pas

📁 利用 ntport控制并口
💻 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 + -