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

📄 serialngadv.pas

📁 RS232 Source using delphi
💻 PAS
字号:
unit SerialNGAdv;
// Helper Unit for SerialNG Advanced Demo
// Includes a Dialog for Advanced Settings
// To use this Dialog, simply include this Unit to Your Project
// Version 1.0.1 18.9.2001 Create the Comportlist from the System Registry

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, 
  Buttons, ExtCtrls, ComCtrls, SerialNG;

type
  TSerialNGAdvDLG = class(TForm)
    Panel1: TPanel;
    OKBtn: TButton;
    CancelBtn: TButton;
    DLGTabSheet: TPageControl;
    BasicSheet: TTabSheet;
    TimingSheet: TTabSheet;
    AdvancedSheet: TTabSheet;
    CBPort : TComboBox;
    CBBaud: TComboBox;
    CBData: TComboBox;
    CBStop: TComboBox;
    CBParity: TComboBox;
    CBFlow: TComboBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    CBOpenPort: TCheckBox;
    Label1: TLabel;
    Label2: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    WTOExtraDelayEdit: TEdit;
    RTOCharDelayEdit: TEdit;
    WTOCharDelayEdit: TEdit;
    RTOExtraDelayEdit: TEdit;
    CBXTOAuto: TCheckBox;
    GroupBox1: TGroupBox;
    Label11: TLabel;
    Label12: TLabel;
    XOffCharEdit: TEdit;
    XOnCharEdit: TEdit;
    Label13: TLabel;
    Label14: TLabel;
    XOnLimitEdit: TEdit;
    XOffLimitEdit: TEdit;
    GroupBox2: TGroupBox;
    CBParityErrorReplacement: TCheckBox;
    Label15: TLabel;
    ParityErrorCharEdit: TEdit;
    CBStripNullChars: TCheckBox;
    Label16: TLabel;
    CBReport: TComboBox;
    Label17: TLabel;
    EventCharEdit: TEdit;
    procedure ValidateCharInput(Sender: TObject);
    procedure ValidateInteger(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SetDLGData(SerialPortNG : TSerialPortNG);
    procedure GetDLGData(SerialPortNG : TSerialPortNG);
  end;

var
  SerialNGAdvDLG: TSerialNGAdvDLG;

function CharToEdit(C : Char):String;
function EditToChar(S : String; DefaultC : Char):Char;

implementation

{$R *.DFM}

procedure TSerialNGAdvDLG.ValidateCharInput(Sender: TObject);
var S : String;
    N : LongInt;
begin
  S := TEdit(Sender).Text;
  if Length(S) > 1 then
    begin
      try
        EditToChar(S,#0);
      except
        Application.MessageBox('Input allowed single Char or 0..255. Leave empty to hold previous Value.','Invalid Input',mb_OK);
      end;
    end
  else if Length(S) = 0 then
    Application.MessageBox('Input allowed single Char or 0..255. Leave empty to hold previous Value.','Invalid Input',mb_OK);
end;

procedure TSerialNGAdvDLG.ValidateInteger(Sender: TObject);
var S : String;
    N : Cardinal;
begin
  S := TEdit(Sender).Text;
  if Length(S) > 1 then
    begin
      try
        N := StrToInt(S);
      except
        Application.MessageBox('Invalid Input. Leave empty to hold previous Value.','Invalid Input',mb_OK);
      end;
    end;
end;

function CharToEdit(C : Char):String;
var S : String;
begin
  case C of
    #0..#31,#127,#255 : S := Format('0x%2.2x',[Byte(C)]);
  else
    S := C;
  end;
  CharToEdit := S;
end;

function EditToChar(S : String; DefaultC : Char):Char;
var N : LongInt;
    C : Char;
begin
  if Length(S) > 1 then
    begin
      if Copy(S,1,2) = '0x' then
        S := '$'+Copy(S,3,Length(S));
      N := StrToInt(S);
      if (N < 0) or (N > 255) then
        raise ERangeError.CreateFmt(
          '%d is not within the valid range of %d..%d',
          [N, 0, 255])
      else
        C := Char(N);
     end
   else if Length(S) = 1 then
     C := S[1]
   else
     C := DefaultC;
  EditToChar := C;
end;

procedure TSerialNGAdvDLG.SetDLGData(SerialPortNG : TSerialPortNG);
var i : Integer;
begin
// Page 1 (Basic)
  i := CBPort.Items.IndexOf(SerialPortNG.CommPort);
  if i >= 0 then
    CBPort.ItemIndex := i
  else
    CBPort.ItemIndex := 1; //COM2
  i := CBBaud.Items.IndexOf(IntToStr(SerialPortNG.BaudRate));
  if i >= 0 then
    CBBaud.ItemIndex := i
  else
    CBBaud.ItemIndex := 6; // 9600
  i := CBData.Items.IndexOf(IntToStr(SerialPortNG.DataBits)+' Bit');
  if i >= 0 then
    CBData.ItemIndex := i
  else
    CBData.ItemIndex := 4; // 8 Bit
  CBStop.ItemIndex := SerialPortNG.StopBits;
  CBParity.ItemIndex := SerialPortNG.ParityType;
  case SerialPortNG.FlowControl of
    fcNone : CBFlow.ItemIndex := 0;
    fcXON_XOFF : CBFlow.ItemIndex := 1;
    fcRTS_CTS : CBFlow.ItemIndex := 2;
    fcDSR_DTR : CBFlow.ItemIndex := 3;
  else
    CBFlow.ItemIndex := 0;
  end;
  CBOpenPort.Checked := SerialPortNG.Active;
// Page 2 Timing
  WTOCharDelayEdit.Text := IntToStr(SerialPortNG.WTOCharDelayTime);
  RTOCharDelayEdit.Text := IntToStr(SerialPortNG.RTOCharDelayTime);
  WTOExtraDelayEdit.Text := IntToStr(SerialPortNG.WTOExtraDelayTime);
  RTOExtraDelayEdit.Text := IntToStr(SerialPortNG.RTOExtraDelayTime);
  CBXTOAuto.Checked := SerialPortNG.XTOAuto;
// Page 3 Advanced
  XOnCharEdit.Text := CharToEdit(SerialPortNG.XOnChar);
  XOffCharEdit.Text := CharToEdit(SerialPortNG.XOffChar);
  XOnLimitEdit.Text := IntToStr(SerialPortNG.XOnLimDiv);
  XOffLimitEdit.Text := IntToStr(SerialPortNG.XOffLimDiv);
  CBParityErrorReplacement.Checked := SerialPortNG.ParityErrorReplacement;
  ParityErrorCharEdit.Text := CharToEdit(SerialPortNG.ParityErrorChar);
  EventCharEdit.Text := CharToEdit(SerialPortNG.EventChar);
  CBStripNullChars.Checked := SerialPortNG.StripNullChars;
  if SerialPortNG.ErrorNoise > CBReport.Items.Count then
    CBReport.ItemIndex := CBReport.Items.Count-1
  else
    CBReport.ItemIndex := SerialPortNG.ErrorNoise;
end;

procedure TSerialNGAdvDLG.GetDLGData(SerialPortNG : TSerialPortNG);
begin
  SerialPortNG.CommPort := CBPort.Items[CBPort.ItemIndex];
  SerialPortNG.BaudRate := StrToIntDef(CBBaud.Items[CBBaud.ItemIndex],9600);
  SerialPortNG.DataBits := StrToIntDef(Copy(CBData.Items[CBData.ItemIndex],1,1),8);
  SerialPortNG.StopBits := CBStop.ItemIndex;
  SerialPortNG.ParityType := CBParity.ItemIndex;
  SerialPortNG.FlowControl := BasicFlowModes[CBFlow.ItemIndex];

// Page 2 Timing
  SerialPortNG.XTOAuto := CBXTOAuto.Checked;
  if not CBXTOAuto.Checked then
    begin
      SerialPortNG.WTOCharDelayTime := StrToInt(WTOCharDelayEdit.Text);
      SerialPortNG.RTOCharDelayTime := StrToInt(RTOCharDelayEdit.Text);
      SerialPortNG.WTOExtraDelayTime := StrToInt(WTOExtraDelayEdit.Text);
      SerialPortNG.RTOExtraDelayTime := StrToInt(RTOExtraDelayEdit.Text);
    end;

// Page 3 Advanced
  SerialPortNG.XOnChar := EditToChar(XOnCharEdit.Text,SerialPortNG.XOnChar);
  SerialPortNG.XOffChar := EditToChar(XOffCharEdit.Text,SerialPortNG.XOffChar);
  SerialPortNG.XOnLimDiv := StrToInt(XOnLimitEdit.Text);
  SerialPortNG.XOffLimDiv := StrToInt(XOffLimitEdit.Text);
  SerialPortNG.ParityErrorReplacement := CBParityErrorReplacement.Checked;
  SerialPortNG.ParityErrorChar := EditToChar(ParityErrorCharEdit.Text,SerialPortNG.ParityErrorChar);
  SerialPortNG.EventChar := EditToChar(EventCharEdit.Text,SerialPortNG.EventChar);
  SerialPortNG.StripNullChars := CBStripNullChars.Checked;
  SerialPortNG.ErrorNoise := CBReport.Itemindex;
// Try to Open the Port if wished
  SerialPortNG.Active := CBOpenPort.Checked;
end;

procedure TSerialNGAdvDLG.FormCreate(Sender: TObject);
begin
  GetCommNames(CBPort.Items);
end;

end.

⌨️ 快捷键说明

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