userlogonfrm.pas

来自「群星医药系统源码」· PAS 代码 · 共 258 行

PAS
258
字号
unit UserLogonFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzBorder, RzBtnEdt, ComCtrls, RzDTP, StdCtrls, RzCmboBx, ActnList,
  Mask, RzEdit, RzButton, ExtCtrls, RzPanel, ImgList, MConnect, IniFiles,
  IMainFrm, xBaseFrm, RzRadChk;

type
  TAcctInfo = Record
    Name: WideString;
    Remark: WideString;
    Visible: Boolean;
  end;

  TFmUserLogon = class(TxBaseForm)
    RzPanel1: TRzPanel;
    RzBitBtn1: TRzBitBtn;
    RzBitBtn2: TRzBitBtn;
    edUserID: TRzEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edAcctName: TRzButtonEdit;
    RzBorder1: TRzBorder;
    ActionList1: TActionList;
    ImageList1: TImageList;
    ActLogon: TAction;
    ActCancel: TAction;
    edPasswd: TRzEdit;
    mmLog: TRzMemo;
    ckClearTempFile: TRzCheckBox;
    procedure ActLogonExecute(Sender: TObject);
    procedure ActCancelExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure edAcctNameButtonClick(Sender: TObject);
    procedure edAcctNameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure edAcctNameDblClick(Sender: TObject);
    procedure ckClearTempFileClick(Sender: TObject);
    procedure edAcctNameKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    IFmMain: IMainForm;
    OleAccounts: OleVariant;
    sDefAccount: String;
    Accounts: Array of TAcctInfo;
    procedure ClearTempFile;
  public
    SvrConn: TDispatchConnection;
    ClientID, DepartID, DBScanRange, DBModiRange: Integer;
    AcctName, DBConnStr, UserID, UserPasswd: WideString;
  end;

var
  FmUserLogon: TFmUserLogon;

implementation

uses SeltAccountFrm;

{$R *.dfm}

procedure TFmUserLogon.FormCreate(Sender: TObject);
var IniFile: TIniFile;
begin
//  AcctList := TStringList.Create;
//  AcctRemarks := TStringList.Create;
  IFmMain := Application.MainForm as IMainForm;
  IniFile := TIniFile.Create(IFmMain.IniFileName);
  sDefAccount := IniFile.ReadString('LocaSetting', 'DefAccount', '');
  ckClearTempFile.Checked := IniFile.ReadBool('UserLogon', 'ClearTempFile', false);
  IniFile.Free;
  edAcctName.Text := sDefAccount;
end;

procedure TFmUserLogon.FormShow(Sender: TObject);
var i, k: Integer;
begin
  SvrConn.AppServer.GetAccounts(OleAccounts);
  if (not VarIsNull(OleAccounts))and(VarArrayDimCount(OleAccounts)=2) then begin
    i := VarArrayLowBound(OleAccounts, 1);
    k := VarArrayHighBound(OleAccounts, 1);
    SetLength(Accounts, k-i+1);
    while i<=k do begin
      Accounts[i].Name := OleAccounts[i, 0];
      Accounts[i].Remark := OleAccounts[i, 1];
      Accounts[i].Visible:= OleAccounts[i, 2];
      Inc(i);
    end;
  end;
  edAcctName.ReadOnly := true;
  if edAcctName.Text<>'' then
    edUserID.SetFocus;
end;

procedure TFmUserLogon.FormDestroy(Sender: TObject);
begin
//  AcctList.Free;
//  AcctRemarks.Free;
end;

procedure TFmUserLogon.edAcctNameButtonClick(Sender: TObject);
var Form: TFmSeltAccount;
    i, k: integer;
    Item: TListItem;
    IniFile: TIniFile;
begin
  Form := TFmSeltAccount.Create(self);
  with Form do begin
    lvAccounts.Items.Clear;
    k := Length(Accounts);
    for i:=0 to k-1 do begin
      if Accounts[i].Visible then begin
        Item := lvAccounts.Items.Add;
        Item.ImageIndex := 0;
        Item.Caption := Accounts[i].Name;
        Item.SubItems.Add(Accounts[i].Remark);
        if Accounts[i].Name=sDefAccount then
        begin
          lvAccounts.Selected := Item;
          lvAccounts.ItemFocused := Item;
          chkSetDefAccount.Checked := true;
        end;
      end;
    end;
    if ShowModal=mrOk then
    begin
      edAcctName.Text := lvAccounts.Selected.Caption;
      IniFile := TIniFile.Create(IFmMain.IniFileName);
      if chkSetDefAccount.Checked then
      begin
        sDefAccount := edAcctName.Text;
        IniFile.WriteString('LocaSetting', 'DefAccount', sDefAccount)
      end else if edAcctName.Text=sDefAccount then
        IniFile.WriteString('LocaSetting', 'DefAccount', '');
      IniFile.Free;
    end;
    Free;
  end;
end;

procedure TFmUserLogon.ActLogonExecute(Sender: TObject);
const
  cLine = '----------------------------------------';
  cFail = '登录失败!';
var sAcctName, sUserID, LogInfo: String;
    i, iLogonFlag: Integer;
begin
  mmLog.Lines.Add(cLine);
  sAcctName := edAcctName.Text;
  if sAcctName='' then begin
    edAcctName.Button.Click;
    sAcctName := edAcctName.Text;
    if sAcctName='' then begin
      mmLog.Lines.Add('请选择登录帐套!');
      Exit;
    end;
  end;
  sUserID := edUserID.Text;
  if sUserID='' then begin
    mmLog.Lines.Add('请输入用户编号!');
    mmLog.Lines.Add(cFail);
    edUserID.SetFocus;
    Exit;
  end;
  //如果登录失败LogInfo返回错误信息,成功则返回员工部门及数据库连接串,用";"号分隔
  iLogonFlag := SvrConn.AppServer.UserLogon(sAcctName, sUserID, edPasswd.Text, LogInfo);
  if iLogonFlag=0 then begin
    mmLog.Lines.Add(LogInfo);
    mmLog.Lines.Add(cFail);
    Exit;
  end;
  ClientID := iLogonFlag;
  //解析出用户所属部门
  i := AnsiPos(';', LogInfo);
  DepartID := StrToInt(Copy(LogInfo, 1, i-1));
  Delete(LogInfo, 1, i);
  //解析出用户资料浏览范围
  i := AnsiPos(';', LogInfo);
  DBScanRange := StrToInt(Copy(LogInfo, 1, i-1));
  Delete(LogInfo, 1, i);
  //解析出用户资料修改范围
  i := AnsiPos(';', LogInfo);
  DBModiRange := StrToInt(Copy(LogInfo, 1, i-1));
  Delete(LogInfo, 1, i);
  //剩下的是数据库连接字符串
  DBConnStr:= LogInfo;

  AcctName := sAcctName;
  UserID := sUserID;
  UserPasswd := edPasswd.Text;

  if ckClearTempFile.Checked then
    ClearTempFile;


  ModalResult := mrOK;
end;

procedure TFmUserLogon.ActCancelExecute(Sender: TObject);
begin
  Close;
end;

procedure TFmUserLogon.edAcctNameKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Shift=[ssCtrl] then
    edAcctName.Tag := 1
  else if (Key=13)and(edAcctName.Text='') then
    edAcctName.Button.Click;
end;

procedure TFmUserLogon.edAcctNameKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  edAcctName.Tag := 0;
end;

procedure TFmUserLogon.edAcctNameDblClick(Sender: TObject);
begin
  if edAcctName.Tag=1 then
    edAcctName.ReadOnly := not edAcctName.ReadOnly
  else
    edAcctName.Button.Click;
end;

procedure TFmUserLogon.ClearTempFile;
var xmlPath, xmlFile: String;
    sr: TSearchRec;
begin
  xmlPath := ExtractFilePath(Application.ExeName)+'XML\';
  xmlFile := xmlPath+'*.xml';
  if FindFirst(xmlFile, faArchive, sr) = 0 then
  begin
    repeat
      if FileExists(xmlPath + sr.Name) then
        DeleteFile(xmlPath + sr.Name);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;

procedure TFmUserLogon.ckClearTempFileClick(Sender: TObject);
var IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(IFmMain.IniFileName);
  IniFile.WriteBool('UserLogon', 'ClearTempFile', ckClearTempFile.checked);
  IniFile.Free;
end;

end.

⌨️ 快捷键说明

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