我获得了一个如何在创建主窗体之前创建登录屏幕的示例.
Howwever我不知道如何在登录屏幕关闭之前获取变量.我试图传递变量
Howwever我不知道如何在登录屏幕关闭之前获取变量.我试图传递变量
SelectedUserName : String; SelectedUserIdNo,SelectedCoyId : Integer;
从loginfrm到mainform进行进一步处理.
有任何想法吗.
提前致谢.
这是主要代码:
program Pac; {$R *.res} uses ExceptionLog,Forms,MainForm in 'Main\MainForm.pas' {MainFormFrm},Datamodule in 'Main\Datamodule.pas' {DataModuleFrm: TDataModule},Login in 'Security\Login.pas' {LoginFrm}; begin if tLoginFrm.Execute then begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainFormFrm,MainFormFrm); Application.CreateForm(TDataModuleFrm,DataModuleFrm); Application.Run; end else begin Application.MessageBox ('You are not authorized to use the application. The password is "delphi".','Password Protected Delphi application'); end; end.
unit Login; interface uses Windows,.. .. ..; type TLoginFrm = class(TForm) Label1: TLabel; ButtOk: TButton; ButtCancel: TButton; cxMaskEditUserId: TcxMaskEdit; cxMaskEditPw: TcxMaskEdit; ButtReset: TButton; Label2: TLabel; QueryUser: TMSQuery; MSConnectionMain: TMSConnection; procedure ButtOkClick(Sender: TObject); procedure CheckMenuAccess; procedure ButtResetClick(Sender: TObject); procedure FormShow(Sender: TObject); public SelectedUserName: String; SelectedUserIdNo,SelectedCoyId: Integer; { Public declarations } class function Execute: boolean; end; implementation uses DataModule,MainForm,OutletListing; {$R *.dfm} class function TLoginFrm.Execute: boolean; begin with TLoginFrm.Create(nil) do try Result := ShowModal = mrOk; finally Free; end; end; procedure TLoginFrm.FormShow(Sender: TObject); begin MSConnectionMain.Connected := True; end; procedure TLoginFrm.ButtOkClick(Sender: TObject); begin { Verify users are in list of users } With QueryUser Do Begin Active := False; if cxMaskEditUserId.EditValue = Null then ParamByName('UserId').Clear ELSE ParamByName('UserId').AsString := cxMaskEditUserId.EditValue; if cxMaskEditUserId.EditValue = Null then ParamByName('Userpassword').Clear ELSE ParamByName('Userpassword').AsString := cxMaskEditPw.EditValue; Active := True; If (FieldByName('UserId').IsNull) or (cxMaskEditUserId.EditValue = Null) Then Begin cxMaskEditUserId.EditValue := Null; cxMaskEditPw.EditValue := Null; cxMaskEditUserId.SetFocus; End Else Begin OutletListingFrm := TOutletListingFrm.Create(Self); SelectedUserIdNo := FieldByName('UserIdNo').AsInteger; SelectedUserName := FieldByName('UserName').AsString; OutletListingFrm.SelectedUserId := FieldByName('UserIdNo').AsInteger; IF OutletListingFrm.ShowModal = mrOk THEN BEGIN SelectedCoyId := FieldByName('CoyId').AsInteger; ModalResult := mrOk; END ELSE ModalResult := mrCancel; OutletListingFrm.Free; End; End; end.
解决方法
创建包含要从登录表单返回的信息的记录:
type TLoginInfo = record SelectedUserName: string; SelectedUserIdNo: Integer; SelectedCoyId: Integer; end;
function Execute(out LoginInfo: TLoginInfo): Boolean;
然后将信息传递给主表单.您无法在对Application.CreateForm的调用中执行此操作.因此,您需要在TMainFormFrm上使用不同的方法,可以在创建主窗体后调用它.并且该方法将接收从成功登录返回的TLoginInfo记录.
所以对于TMainFormFrm,你会添加一个名为InitialiseWithLoginInfo的公共方法.
procedure InitialiseWithLoginInfo(const LoginInfo: TLoginInfo);
然后你的.dpr文件看起来像这样:
var LoginInfo: TLoginInfo; begin if tLoginFrm.Execute(LoginInfo) then begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainFormFrm,MainFormFrm); MainFormFrm.InitialiseWithLoginInfo(LoginInfo); Application.CreateForm(TDataModuleFrm,'Password Protected Delphi application'); end; end.