zoukankan      html  css  js  c++  java
  • delphi 生成网卡MAC地址

    生成MAC地址的小工具:

    {*------------------------------------------------
      生成mac地址
      @author
      @version  2015.7.2
      2015.10.22修改
      步长最大长度为256,必须为2的n次方
      长度不超过5位数
    -------------------------------------------------}
    unit frmSaveMac;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, math;
     
    type
      TSaveMacForm = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Edit6: TEdit;
        SaveDialog1: TSaveDialog;
        SaveButton: TButton;
        ExitButton: TButton;
        Edit7: TEdit;
        Label2: TLabel;
        Label3: TLabel;
        Edit8: TEdit;
        Memo1: TMemo;
        GroupBox1: TGroupBox;
        RadioButton1: TRadioButton;
        RadioButton2: TRadioButton;
        RadioButton3: TRadioButton;
        btn_clear: TButton;
        btn_show: TButton;
        Memo2: TMemo;
        procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure ExitButtonClick(Sender: TObject);
        procedure Edit1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure Edit7KeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure SaveButtonClick(Sender: TObject);
        procedure Edit1KeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure btn_clearClick(Sender: TObject);
        procedure btn_showClick(Sender: TObject);
      private
        { Private declarations }
        procedure CheckIsEmpty;
        function  CheckStepOrLen: Boolean;
        procedure ShowData();
        Procedure SaveData();
      public
        { Public declarations }
      end;
     
    var
      SaveMacForm: TSaveMacForm;
     
    implementation
     
    {$R *.dfm}
    {*------------------------------------------------
      文本框只能输入十六进制数、删除键和回车键
      @param
      @param
    -------------------------------------------------}
    procedure TSaveMacForm.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if not (key in ['0'..'9', 'A'..'F', 'a'..'f', #8, #13]) then
      begin
        Key := #0;
        Application.MessageBox ('只能输入十六进制的数字!', '提示消息', MB_OK + MB_ICONERROR);
      end;
    end;
     
    procedure TSaveMacForm.ExitButtonClick(Sender: TObject);
    begin
      Close;
    end;
     
    {*------------------------------------------------
      文本框按键事件
      @param
      @param
    -------------------------------------------------}
    procedure TSaveMacForm.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      i,j : integer;
    begin
      /// 输入最大长度
      for i := 0 to self.ComponentCount -1 do begin         // 循环每个Edit控件 设置最大长度为2   2015.10.22修改
        if self.Components[i] is TEdit then begin
          (self.Components[i] as TEdit).MaxLength := 2;
        end;
        if Sender = Edit7 then Edit7.MaxLength := 3;
        if Sender = Edit8 then Edit8.MaxLength := 5;       // 长度不超过5位数 2015.10.22修改
      end;
     
      /// 将光标移到最后
      for j := 0 to ComponentCount - 1 do begin
        if Components[j] is TEdit then begin
          (Components[j] as TEdit).SelStart := Length((Components[j] as TEdit).Text);
        end;
      end;
     
      /// 按回车触发
      if key = 13 then
      begin
        if (sender = Edit1) and (length(Edit1.Text) >= 2) then
          Edit2.SetFocus;
        if (Sender = Edit2) and (length(Edit2.Text) >= 2) then
          Edit3.SetFocus;
        if (Sender = Edit3) and (length(Edit3.Text) >= 2) then
          Edit4.SetFocus;
        if (Sender = Edit4) and (length(Edit4.Text) >= 2) then
          Edit5.SetFocus;
        if (Sender = Edit5) and (length(Edit5.Text) >= 2) then
          Edit6.SetFocus;
        if (Sender = Edit6) then
          Edit7.SetFocus ;
        if (Sender = Edit7) then
          Edit8.SetFocus;
      end;
      ExitButton.Enabled := True;
      SaveButton.Enabled := True;
    end;
     
     
    {*------------------------------------------------
      步长只能输入0到9的数字
      @param
      @param
    -------------------------------------------------}
    procedure TSaveMacForm.Edit7KeyPress(Sender: TObject; var Key: Char);
    begin
      if not (key in ['0'..'9', #8]) then
        Key := #0;
    end;
     
    procedure TSaveMacForm.FormCreate(Sender: TObject);
    var
      j: integer;
      C: Double;
    begin
      SaveButton.Enabled := False;
      ExitButton.Enabled := False;
      RadioButton1.Checked := True;    /// 默认输出格式
     
      memo2.Lines.Add('256以内的2的n次方:');
      for J := 1 to 8 do
      begin
        C := power(2, J);         /// 2的I次方
        memo2.Lines.Add(FloatToStr(C));
      end;
    end;
     
    procedure TSaveMacForm.CheckIsEmpty;
    begin
      if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') or (Edit4.Text = '') or (Edit5.Text = '') or (Edit6.Text = '') then
      begin
        Application.MessageBox('输入框必须是12个16进制的数!', '提示', mb_OK + MB_ICONSTOP);
        exit;
      end;
     
      if (length(Edit1.Text )< 2) or (length(Edit1.Text) < 2) or (length(Edit1.Text )< 2) or (length(Edit1.Text) < 2) or (length(Edit1.Text) < 2) or (length(Edit1.Text) < 2) then
      begin
        Application.MessageBox('每个输入框必须是2个数字!', '提示', MB_OK + MB_ICONERROR);
        exit;
      end;
     
      if (Edit7.Text = '') then
      begin
        Application.MessageBox('步长不能为空!', '提示', mb_OK);
        Edit7.SetFocus;
        exit;
      end;
      if (Edit8.Text = '') then
      begin
        Application.MessageBox('长度不能为空!', '提示', mb_OK);
        Edit8.SetFocus;
        exit;
      end;
    end;
     
     
    function TSaveMacForm.CheckStepOrLen: Boolean;
    var
      step, L, code, J : integer;
      isnot: Boolean;
      C: Extended;
    begin
      result := False;
       if Edit7.Text <> '' then begin       // 2015/10/24 增加,之前没判断,若为空时 会出现系统错误
        step := StrToInt(Edit7.Text);
        L := StrToInt(Edit8.Text);
        if step > 256 then
        begin
          Application.MessageBox('步长最大长度为256,请重新输入!', '提示', mb_OK);
          Edit7.SetFocus;
          exit;
        end;
      end;
     
      // 判断长度
      if L >= 100000 then
      begin
        Application.MessageBox('长度太长,请重新输入!', '提示', mb_OK);
        Edit8.SetFocus;
        exit;
      end;
     
      for J := 1 to 8 do
      begin
        C := power(2, J);         /// 2的I次方
        if (step = C) or (step = 1) then
        begin
          result := True;
        end;
      end;
     
       /// 判断步长是否满足条件
      if result = False then
      begin
        Application.MessageBox('步长只能为2的n次方,请重新输入', '提示消息', mb_OK + MB_ICONERROR);
        Edit7.SetFocus;
        exit;
      end;
    end;
     
    procedure TSaveMacForm.btn_showClick(Sender: TObject);
    begin
      ShowData();
    end;
     
    procedure TSaveMacForm.ShowData;
    var
      SaveFile: string;
      value: Integer;
      temp, S: string;
      I, M1, M2, M3, M4, M5, M6, J : Integer;
      C: Extended;
    begin
      CheckIsEmpty;      // 判断是否为空
     
     if CheckStepOrLen = True then begin
        Self.Memo1.Lines.Clear;
        M1 := StrToInt('$' + Edit1.Text);         /// 直接把edit里的数据变成16进制 (是由十进制To十六进制)
        M2 := StrToInt('$' + Edit2.Text);
        M3 := StrToInt('$' + Edit3.Text);
        M4 := StrToInt('$' + Edit4.Text);
        M5 := StrToInt('$' + Edit5.Text);
        M6 := StrToInt('$' + Edit6.Text);
        if RadioButton1.Checked then
          Self.Memo1.Lines.Add(IntToHex(M1, 2) + IntToHex(M2, 2) + IntToHex(M3, 2) + IntToHex(M4, 2) + IntToHex(M5, 2) + IntToHex(M6, 2));    /// 将十六进制To十进制
        if RadioButton2.Checked then
          Self.Memo1.Lines.Add(IntToHex(M1, 2) + IntToHex(M2, 2) + IntToHex(M3, 2) + ':' + IntToHex(M4, 2) + IntToHex(M5, 2) + IntToHex(M6, 2));
        if RadioButton3.Checked then
          Self.Memo1.Lines.Add(IntToHex(M1, 2) + '-' + IntToHex(M2, 2) + '-' +IntToHex(M3, 2) + '-' + IntToHex(M4, 2) + '-' + IntToHex(M5, 2) + '-' + IntToHex(M6, 2));
        for I := 1 to StrToInt(Edit8.Text) do
        begin
          temp := '0' ;
          if M6 < 16  then                                 /// 小于F,则加个0
          begin
            M6 := StrToInt('$' + IntToStr(M6));
            M6 := StrToInt(temp + IntToHex(m6, 2));
          end;
          if M5 < 16 then
          begin
            M5 := StrToInt('$' + IntToStr(M5));
            M5 := StrToInt(temp + IntToHex(m5, 2));
          end;
          if M4 < 16 then
          begin
            M4 := StrToInt('$' + IntToStr(M4));
            M4 := StrToInt(temp + IntToHex(m4, 2));
          end;
          if M3 < 16 then
          begin
            M3 := StrToInt('$' + IntToStr(M3));
            M3 := StrToInt(temp + IntToHex(m3, 2));
          end;
          if M2 < 16 then
          begin
            M2 := StrToInt('$' + IntToStr(M2));
            M2 := StrToInt(temp + IntToHex(m2, 2));
          end;
          if M1 < 16 then
          begin
            M1 := StrToInt('$' + IntToStr(M1));
            M1 := StrToInt(temp + IntToHex(m1, 2));
          end;
          M6 := M6 + StrToInt(Edit7.Text);              /// 加步长
          if M6 >= 256 then                            /// 若大于等于FF则进位
          begin
            M5 := M5 + 1;
            M6 := M6 - 256;
          end;
          if M5 >= 256 then
          begin
            M4 := M4 + 1;
            M5 := M5 - 256;
          end;
          if M4 >= 256 then
          begin
            M3 := M3 + 1;
            M4 := M4 - 256;
          end;
          if M3 >= 256 then
          begin
            M2 := M2 + 1;
            M3 := M3 - 256 ;
          end;
          if M2 >= 256 then
          begin
            M1 := M1 + 1;
            M2 := M2 - 256;
          end;
          if M1 >= 256 then
            Application.MessageBox('超出范围', '提示消息', mb_OK + MB_ICONERROR);
          if RadioButton1.Checked then
            Self.Memo1.Lines.Add(IntToHex(M1, 2) + IntToHex(M2, 2) + IntToHex(M3, 2) + IntToHex(M4, 2) + IntToHex(M5, 2) + IntToHex(M6, 2));
          if RadioButton2.Checked then
            Self.Memo1.Lines.Add(IntToHex(M1, 2) + IntToHex(M2, 2) + IntToHex(M3, 2) + ':' + IntToHex(M4, 2) + IntToHex(M5, 2) + IntToHex(M6, 2));
          if RadioButton3.Checked then
            Self.Memo1.Lines.Add(IntToHex(M1, 2) + '-' + IntToHex(M2, 2) + '-' +IntToHex(M3, 2) + '-' + IntToHex(M4, 2) + '-' + IntToHex(M5, 2) + '-' + IntToHex(M6, 2));
        end;
     end;
    end;
     
    procedure TSaveMacForm.SaveData;
    var
      SaveFile: string;
    begin
      if CheckStepOrLen = True then begin
        /// 保存
        SaveDialog1.Filter := '*.txt|*.txt';  //'txtFile( *.txt)|*.txt';     /// txt格式
        SaveDialog1.DefaultExt := '*.txt';                                   /// 默认格式
        SaveDialog1.Title := '保存MAC地址';
        if SaveDialog1.Execute then
        begin
          SaveFile := SaveDialog1.FileName;
          Memo1.Lines.SaveToFile(SaveFile);                                  /// 保存memo里数据
        end;
      end;
    end;
     
    procedure TSaveMacForm.SaveButtonClick(Sender: TObject);
    begin
      ShowData();
    end;
     
    procedure TSaveMacForm.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      i: integer;
    begin
      if length(Edit1.Text)  >= 2 then
        Edit2.SetFocus;
      if length(Edit2.Text ) >= 2 then
        Edit3.SetFocus;
      if length(Edit3.Text ) >= 2 then
        Edit4.SetFocus;
      if length(Edit4.Text ) >= 2 then
        Edit5.SetFocus;
      if Length(Edit5.Text ) >= 2 then
        Edit6.SetFocus;
     (* for i := 0 to ComponentCount - 1 do begin
        if Components[i] is TEdit then
          if Length((Components[i] as TEdit).Text) >= 2 then
      end;*)
    end;
     
    procedure TSaveMacForm.btn_clearClick(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to self.ComponentCount -1 do begin
        if self.Components[i] is TEdit then begin
          (self.Components[i] as TEdit).Text := '';
        end;
      end;
      Edit1.SetFocus;
    end;
     
    end.
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式
    Delphi 正则表达式语法(7): 匹配转义字符
    Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找
    Delphi 正则表达式语法(5): 边界
    Delphi 正则表达式语法(8): 引用子表达式 也叫反向引用
    Delphi 正则表达式语法(3): 匹配范围
    Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配
    Delphi 正则表达式语法(9): 临界匹配 也叫"预搜索"与"反向预搜索"
    Delphi 正则表达式语法(10): 选项
    善用 Web 调试代理工具
  • 原文地址:https://www.cnblogs.com/jijm123/p/14043483.html
Copyright © 2011-2022 走看看