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

📄 loginform.pas

📁 家庭理财系统.rar
💻 PAS
字号:
unit LoginForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Inifiles, WinSkinData;

type
  TLogin = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    SkinData1: TSkinData;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
    admin: boolean;
    regcode: string;
    regkey: string;
    user: string;
  end;

var
  Login: TLogin;

implementation

uses MainForm, DMForm, RegForm ;

//获取Ide硬盘序列号
function GetHdID : String;
type
  TSrbIoControl = packed record
    HeaderLength : ULONG;
    Signature : Array[0..7] of Char;
    Timeout : ULONG;
    ControlCode : ULONG;
    ReturnCode : ULONG;
    Length : ULONG;
  end;
  SRB_IO_CONTROL = TSrbIoControl;
  PSrbIoControl = ^TSrbIoControl;
  TIDERegs = packed record
    bFeaturesReg : Byte;     // Used for specifying SMART "commands".
    bSectorCountReg : Byte;  // IDE sector count register
    bSectorNumberReg : Byte; // IDE sector number register
    bCylLowReg : Byte;       // IDE low order cylinder value
    bCylHighReg : Byte;      // IDE high order cylinder value
    bDriveHeadReg : Byte;    // IDE drive/head register
    bCommandReg : Byte;      // Actual IDE command.
    bReserved : Byte;        // reserved. Must be zero.
  end;
  IDEREGS = TIDERegs;
  PIDERegs = ^TIDERegs;
  TSendCmdInParams = packed record
    cBufferSize : DWORD;
    irDriveRegs : TIDERegs;
    bDriveNumber : Byte;
    bReserved : Array[0..2] of Byte;
    dwReserved : Array[0..3] of DWORD;
    bBuffer : Array[0..0] of Byte;
  end;
  SENDCMDINPARAMS = TSendCmdInParams;
  PSendCmdInParams = ^TSendCmdInParams;
  TIdSector = packed record
    wGenConfig : Word;
    wNumCyls : Word;
    wReserved : Word;
    wNumHeads : Word;
    wBytesPerTrack : Word;
    wBytesPerSector : Word;
    wSectorsPerTrack : Word;
    wVendorUnique : Array[0..2] of Word;
    sSerialNumber : Array[0..19] of Char; 
    wBufferType : Word;
    wBufferSize : Word; 
    wECCSize : Word; 
    sFirmwareRev : Array[0..7] of Char;
    sModelNumber : Array[0..39] of Char;
    wMoreVendorUnique : Word;
    wDoubleWordIO : Word; 
    wCapabilities : Word;
    wReserved1 : Word;
    wPIOTiming : Word; 
    wDMATiming : Word;
    wBS : Word; 
    wNumCurrentCyls : Word;
    wNumCurrentHeads : Word;
    wNumCurrentSectorsPerTrack : Word;
    ulCurrentSectorCapacity : ULONG;
    wMultSectorStuff : Word;
    ulTotalAddressableSectors : ULONG;
    wSingleWordDMA : Word;
    wMultiWordDMA : Word;
    bReserved : Array[0..127] of Byte;
  end;
  PIdSector = ^TIdSector;
const
  IDE_ID_FUNCTION = $EC;
  IDENTIFY_BUFFER_SIZE = 512;
  DFP_RECEIVE_DRIVE_DATA = $0007c088;
  IOCTL_SCSI_MINIPORT = $0004d008;
  IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
  DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
  BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
  W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var 
  hDevice : THandle;
  cbBytesReturned : DWORD;
  pInData : PSendCmdInParams;
  pOutData : Pointer; // PSendCmdOutParams
  Buffer : Array[0..BufferSize-1] of Byte;
  srbControl : TSrbIoControl absolute Buffer;

procedure ChangeByteOrder( var Data; Size : Integer );
var
  ptr : PChar;
  i : Integer;
  c : Char;
begin
  ptr := @Data;
  for i := 0 to (Size shr 1)-1 do
  begin
    c := ptr^;
    ptr^ := (ptr+1)^;
    (ptr+1)^ := c;
    Inc(ptr,2);
  end;
end;

begin
  Result := '';
  FillChar(Buffer,BufferSize,#0);
  if Win32Platform=VER_PLATFORM_WIN32_NT then
  begin // Windows NT, Windows 2000
    // Get SCSI port handle
    hDevice := CreateFile( '\\.\Scsi0:',
    GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
    nil, OPEN_EXISTING, 0, 0 );
    if hDevice=INVALID_HANDLE_VALUE then Exit;
    try
      srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
      System.Move('SCSIDISK',srbControl.Signature,8);
      srbControl.Timeout := 2;
      srbControl.Length := DataSize;
      srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
      pInData := PSendCmdInParams(PChar(@Buffer)
      +SizeOf(SRB_IO_CONTROL));
      pOutData := pInData;
      with pInData^ do
      begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        bDriveNumber := 0;
        with irDriveRegs do
        begin
          bFeaturesReg := 0;
          bSectorCountReg := 1;
          bSectorNumberReg := 1;
          bCylLowReg := 0;
          bCylHighReg := 0;
          bDriveHeadReg := $A0;
          bCommandReg := IDE_ID_FUNCTION;
        end;
      end;
      if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
      @Buffer, BufferSize, @Buffer, BufferSize,
      cbBytesReturned, nil ) then Exit;
    finally
      CloseHandle(hDevice);
    end;
  end else
  begin // Windows 95 OSR2, Windows 98
    hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,
    CREATE_NEW, 0, 0 );
    if hDevice=INVALID_HANDLE_VALUE then Exit;
    try
      pInData := PSendCmdInParams(@Buffer);
      pOutData := @pInData^.bBuffer;
      with pInData^ do
      begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        bDriveNumber := 0;
        with irDriveRegs do
        begin
          bFeaturesReg := 0;
          bSectorCountReg := 1;
          bSectorNumberReg := 1;
          bCylLowReg := 0;
          bCylHighReg := 0;
          bDriveHeadReg := $A0;
          bCommandReg := IDE_ID_FUNCTION;
        end;
      end;
      if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
      pInData, SizeOf(TSendCmdInParams)-1, pOutData,
      W9xBufferSize, cbBytesReturned, nil ) then Exit;
    finally
      CloseHandle(hDevice);
    end;
  end;
  with PIdSector(PChar(pOutData)+16)^ do
  begin
    ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
    SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
  end;
end;

//加密算法
function EncryptPassword(thePassword:String):String;
var
  i,l,n:Integer;
begin
Result:='';
l:=Length(thePassword);
for i:=l downto 1 do
  begin
    n:=Ord(thePassword[i])+i;
    if n>255 then n:=n-255;
    Result:=Result+Chr(n);
  end;
end;

{$R *.dfm}

procedure TLogin.Button2Click(Sender: TObject);
begin
  application.Terminate;
end;

procedure TLogin.FormCreate(Sender: TObject);
var
    Ini:TiniFile;
    filename:string;
begin
  //取得机器码和注册码
  regcode := trim(GetHdID) ;
  regkey := trim(EncryptPassword(trim(GetHdID))) ;

  //读取系统用户名到ComboBox里面
  with dm.ADOQuery1 do
  begin
    dm.adoquery1.Close ;
    dm.adoquery1.Open ;
    while not dm.adoquery1.Eof do
    begin
      ComboBox1.Items.Add(dm.adoquery1.FieldByName('用户名').AsString);
      dm.adoquery1.Next
    end;
  end;

  //检查软件注册文件system.ini
  filename:=ExtractFilePath(paramstr(0))+'system.ini';
  if not fileexists(filename) then
    begin
      messagebox(getactivewindow(),'您使用的软件没有注册,点击确定进行注册!','错误!' ,MB_OK + MB_ICONINFORMATION) ;
      with TReg.Create(self) do
        showmodal;
    end
  else
    begin
      Ini:=Tinifile.Create(filename);
      if fileexists(filename) then
        begin
          if (trim(Ini.readString('reg','reg_info',''))<>trim(EncryptPassword(trim(GetHdID))) ) then
            begin
              messagebox(getactivewindow(),'注册码错误,请点击确定重新注册!','错误!' ,MB_OK + MB_ICONINFORMATION) ;
              with TReg.Create(self) do
                showmodal;
            end;
        end;
    end;
end;

procedure TLogin.Button1Click(Sender: TObject);
begin
   if (ComboBox1.Text = '') then
     messagebox(getactivewindow(),'请输入用户名!!','用户名不能为空!' ,MB_OK + MB_ICONINFORMATION) ;
   if (not(ComboBox1.Text = '')) then
     if (Edit1.Text = '')  then
       messagebox(getactivewindow(),'请您输入密码!!','密码不能为空!' ,MB_OK + MB_ICONINFORMATION);
   if (not(ComboBox1.Text='') and not(Edit1.Text='')) then
   begin
     with dm.ADOTable1 do
     begin
       if locate('用户名',ComboBox1.Text,[]) then
         if edit1.text<>fields[1].Value then
            messagebox(getactivewindow(),'密码或用户名错误!','错误!' ,MB_OK + MB_ICONINFORMATION)
         else
         begin
           if edit1.text=fields[1].Value then
             begin
             hide;
             admin := fields[2].Value;
             user := fields[0].Value;
             with TMain.Create(self) do
               showmodal;
             end;
            application.Terminate ;
         end;
     end;
   end;
end;

procedure TLogin.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key=#13 then   //捕获回车
    begin
      if (ComboBox1.Text = '') then
        messagebox(getactivewindow(),'请输入用户名!!','用户名不能为空!' ,MB_OK + MB_ICONINFORMATION) ;
      if (not(ComboBox1.Text = '')) then
        if (Edit1.Text = '')  then
          messagebox(getactivewindow(),'请您输入密码!!','密码不能为空!' ,MB_OK + MB_ICONINFORMATION);
      if (not(ComboBox1.Text='') and not(Edit1.Text='')) then
      begin
        with dm.ADOTable1 do
        begin
        if locate('用户名',ComboBox1.Text,[]) then
          if edit1.text<>fields[1].Value then
            messagebox(getactivewindow(),'密码或用户名错误!','错误!' ,MB_OK + MB_ICONINFORMATION)
          else
          begin
            if edit1.text=fields[1].Value then
            begin
              hide;
              admin := fields[2].Value;
              user := fields[0].Value;
              with TMain.Create(self) do
                showmodal;
            end;
            application.Terminate ;
          end;
        end;
      end;
    end;
end;

end.

⌨️ 快捷键说明

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