一個登錄表單,一個MDI主表單,設定了MDI主表單為主表單,然后在主表單的SHOW事件中
procedure Tfrm_main.FormShow(Sender: TObject);
begin
frm_login.ShowModal ;
statusbar1.Panels[1].Text :='操作員:['+user_id+']';
end;
先顯示登錄表單。登錄表單確定按紐代碼:
procedure Tfrm_login.BitBtn1Click(Sender: TObject);
var sqlstr:string ;
begin
sqlstr:='select * from users where id='''+edit1.text+''' and pwd='''+edit2.text+'''';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.Open ;
if adoquery1.RecordCount <>0 then
begin
user_id:=edit1.text;
frm_main.Show ;
frm_login.Close ;
end else
begin
showmessage('用戶名或密碼錯誤,請重新輸入。');
edit1.clear;
edit2.clear;
edit1.SetFocus ;
end;
end;
發現一個問題密碼錄入錯誤,執行了到showmessage那步,登錄表單顯示一個對話框“用戶名或密碼錯誤,請重新輸入。”后,直接進入顯示主表單了,哪位高手能指導下不,密碼錯誤應當執行用戶名得到焦點并繼續,
uj5u.com熱心網友回復:
1、應該設定登錄視窗frm_login為主表單;用戶及密碼正確,進入MDI表單;否則一直留在登錄表單(主表單)。2、經查看其它代碼基本無錯。
只要在IED是,重新設定主表單即可。
uj5u.com熱心網友回復:
我也是跟你一樣,將登錄視窗設成子視窗的。我定義了一個全域變數 IsLogon(是否登錄成功) , IsFristLogon (是否第一次登錄,或者系統已經注銷)
在主視窗中, 初始化 IsLogon 為 false
procedure TfrmMain.FormCreate(Sender: TObject);
begin
IsLogon := false ;
IsFristLogon := true;
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
if not IsFristLogon then
begin
Exit;
end;
frmLogonSys := TfrmLogonSys.Create(Application);
frmLogonSys.Position := poMainFormCenter ;
frmLogonSys.ShowModal ;
if IsLogon then //登錄成功
begin
IsFristLogon := False ;
//do something.....
end
else
begin //登錄失敗,關閉主表單
postmessage(frmMain.handle, WM_CLOSE, 0, 0); //好像在 FormShow 里面, 執行 postmessage 會出錯。所以我登錄放在 FormActivate 回應了。
end;
end;
// frmLogonSys (登錄框主要內容)
將登錄判斷放到 frmLogonSys 表單里面做。 只回傳 IsLogon 的值就OK了。
//點擊登錄按鈕函式。
procedure TfrmLogonSys.btnLogonClick(Sender: TObject);
begin
var sqlstr:string ;
begin
sqlstr:='select * from users where id='''+edit1.text+''' and pwd='''+edit2.text+'''';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(sqlstr);
adoquery1.Open ;
if adoquery1.RecordCount <>0 then
begin //登錄成功
IsLogon := true;
//保存登錄用戶等資訊到全域變數, 供系統運行時操作日志等用。。。
frmLogonSys.ModalResult := mrOK ;
frmLogonSys.Close ;
end
else
begin //登錄失敗。
sysCtrl.IsLogon := False ;
Showmessage('Logon system failture: User name or password error.');
edtRdId.SetFocus ;
end;
//點擊了退出按鈕
procedure TfrmLogonSys.btnExitClick(Sender: TObject);
begin
if MessageDlg('Are you sure exit? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
sysCtrl.IsLogon := False ;
Close ;
end;
end;
uj5u.com熱心網友回復:
dpr 主工程檔案留修改下即可....
Application.CreateForm(TFmLogin, FmLogin);
if FmLogin.ShowModal() then //此處多載了 Form.ShowModal
begin
FmLogin.Free;
Application.CreateForm(TFmMain, FmMain);
Application.Run;
end
else FmLogin.Free;
....
uj5u.com熱心網友回復:
上述多種方法,依據個人愛好,自行考慮吧。但我感覺,還是將登錄容器,設定為主視窗。方便,只要登錄成功,才能進入其它模塊。
uj5u.com熱心網友回復:
謝謝!測驗過了,將登錄容器放在主視窗,登錄成功到FRM_MAIN主界面,但是問題又來,主界面下面的有幾個MDICHILD顯示的時候出錯:cannot create form.no MDI ARE CURRENTLY ACTIVE.
呼叫子表單的代碼是:
procedure Tfrm_main.SpeedButton1Click(Sender: TObject);
begin
//Application.CreateForm(TFRM_GHS, FRM_GHS);
frm_ghs:=tfrm_ghs.Create(application);
end;
uj5u.com熱心網友回復:
frm_ghs表單在工程選項里是可用表單,將它調整成自動創建表單,還是報一樣的錯uj5u.com熱心網友回復:
看來問題,沒有解決。Mid子表單,可以采用動態表單方式。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86111.html
標籤:語言基礎/算法/系統設計
