2015-02-11 75 views
-3

我已經設置我的登錄過程與可用的窗體(Form4)和MainForm。 在可用的形式(form4)我有:應用程序終止沒有明顯的原因

var 
    Form4: TForm4; 
    procedure Login; 
implementation 
..... 

'登錄' 程序進入:

procedure Login; 
begin 
    with TForm4.Create(nil) do 
    try 
    Application.MainForm.Hide; 
    if ShowModal = mrOK then 
     Application.MainForm.Show 
    else 
     Application.Terminate; 
    finally 
    Free; 
    end; 
end; 

然後在同一表單上我有一個按鈕來登錄:

procedure TForm4.AdvGlowButton1Click(Sender: TObject); //the buton's property is ModalResult=mrOK 
begin 
DataModule2.LOGIN_QUERY.Active:=false; 
DataModule2.LOGIN_QUERY.SQL.Clear; 
DataModule2.LOGIN_QUERY.SQL.Add('select user,passsword from users where user='+QuotedStr(cxlookupcombobox1.text)+' and password='+QuotedStr(cxTextEdit1.Text)); 
DataModule2.LOGIN_QUERY.Open; 
if DataModule2.LOGIN_QUERY.FieldByName('password').AsString<>'' 
then ModalResult := mrOK else 
ModalResult := mrNone; 
end; 

項目來源如下:

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := False; 
    Application.CreateForm(TDataModule2, DataModule2); 
    Application.CreateForm(TMainForm, MainForm); 
    Application.CreateForm(TForm7, Form7); 
    Application.CreateForm(TARCHIVE, ARHCIVE); 
    Application.CreateForm(TForm10, Form10); 
    Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TForm6, Form6); 
    Application.CreateForm(TForm5, Form5); 
    Application.CreateForm(TForm9, Form9); 
    Application.CreateForm(TForm12, Form12); 
    Application.CreateForm(TForm12, Form12); 
    Application.CreateForm(TAboutBox, AboutBox); 
    Login; 
    Application.Run; 
end. 

然而,單擊Form4上的「登錄」按鈕時,應用程序 將無故終止。這是爲什麼發生? 應該

Application.MainFormOnTaskbar:= False;

也許設置爲true?

編輯:

我編輯的工程文件和創建活動的form4:

procedure TForm4.FormCreate(Sender: TObject); 
begin 
AdvGlowButton1.ModalResult := mrOK; 
end; 

,改變了項目源:

{$R *.res} 
var 
    MainForm: TMainForm; 

begin 
    Application.Initialize; 
    Application.CreateForm(TMainForm, MainForm); 
    Application.MainFormOnTaskbar := False; 
    Application.CreateForm(TDataModule2, DataModule2); 
    Application.CreateForm(TForm7, Form7); 
    Application.CreateForm(TARCHIVE, ARCHIVE); 
    Application.CreateForm(TForm10, Form10); 
    Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TForm6, Form6); 
    Application.CreateForm(TForm5, Form5); 
    Application.CreateForm(TForm9, Form9); 
    Application.CreateForm(TForm12, Form12); 
    Application.CreateForm(TForm12, Form12); 
    Application.CreateForm(TAboutBox, AboutBox); 
    Login; 
    Application.Run; 
end. 

,我不似乎得到應用關閉....(它仍然如此,呃......)

edit2:

試過這樣。我在我的AdvGlowButton1設置爲ModalResult = mrNone和形式風格fsdialog:

procedure TForm4.AdvGlowButton1Click(Sender: TObject); //the buton's property is ModalResult=mrOK 
begin 
DataModule2.LOGIN_QUERY.Active:=false; 
DataModule2.LOGIN_QUERY.SQL.Clear; 
DataModule2.LOGIN_QUERY.SQL.Add('select user,passsword from users where user='+QuotedStr(cxlookupcombobox1.text)+' and password='+QuotedStr(cxTextEdit1.Text)); 
DataModule2.LOGIN_QUERY.Open; 
if DataModule2.LOGIN_QUERY.FieldByName('password').AsString<>'' 
then ModalResult := mrOK else 
dxStatusBar1.Panels[1].Text :='Wrong password !'; 
end; 

這部作品的時代最當我啓動應用程序並點擊AdvGlowButton1按鈕(登錄按鈕),但它有時會關閉。我想到的另一件事是缺少,你如何提示在這個登錄表單上關閉應用程序,因爲它只期望模態結果?

+2

我會大膽地猜測的ShowModal不mrOk。 – 2015-02-11 04:55:13

+0

很難看清過去的'Application.Terminate'。我也想知道爲什麼你不給你的表格名稱。以及爲什麼你在啓動時創建它們。我想IDE是爲你做的。但這是一個不好的指導。它認爲你是一位20世紀末期的VB程序員。 – 2015-02-11 07:23:48

+2

順便說一句,這是所有修復後,你的下一個任務(在你的應用程序中做任何事情之前)是擺脫數據庫中的純文本密碼,並用(SHA1)哈希替換它們。這是互聯網/數據庫安全規則#1和**你不能馬上開始做**。 – 2015-02-11 08:52:36

回答

2

像@SertacAkyuz暗示,一個選項將是ShowModal不返回mrOK。檢查此按鈕的ModalResult值和/或此按鈕的OnClick的事件處理程序,以查看mrOK是否是在這些情況下返回的ModalResult ...

如果單擊按鈕,則OnClick事件是如果該按鈕的ModalResult被設置爲任何值,則表單的ModalResult將被設置爲該值。當一個事件(比如一個OnClick事件)結束時,表單檢查它的ModalResult值,如果它被設置爲0(零)以外的任何值,則表單關閉,並且該值作爲ShowModal函數的結果返回。

因此,根據您提供的信息,這看起來像是一種可能的情況 - 表單的ModalResult被設置爲某個不是mrOK的值。該表單然後關閉,然後您的IF ShowModal測試終止應用程序(因爲它沒有返回mrOK)。基於您的代碼輸入錯誤的密碼也將導致你的申請終止becouse在這種情況下,模態返回結果將是mrNone,你只希望mrOK繼續與您的應用程序

+0

所以我應該嘗試使用以下形式創建表單:ModalResult:= mrOK;? – user763539 2015-02-11 12:24:12

+0

僅當您希望ShowModal立即關閉時返回mrOK。 – HeartWare 2015-02-11 14:06:08

+0

那麼我該如何解決這個問題? – user763539 2015-02-11 22:15:58

1

所以我建議未來的變化:

首先刪除您的按鈕的模態結果屬性格式。按鈕模態結果propery主要僅用於轉發信息,如點擊哪個特定按鈕導致模態表單關閉。

然後改變你的按鈕事件代碼,使其只集合形成模式的結果,如果代碼是正確否則它應該顯示一條消息,輸入passowrd是incorect。像這樣:

procedure TForm4.AdvGlowButton1Click(Sender: TObject); //the buton's property is ModalResult=mrOK 
begin 
    DataModule2.LOGIN_QUERY.Active:=false; 
    DataModule2.LOGIN_QUERY.SQL.Clear; 
    DataModule2.LOGIN_QUERY.SQL.Add('select user,passsword from users where user='+QuotedStr(cxlookupcombobox1.text)+' and password='+QuotedStr(cxTextEdit1.Text)); 
    DataModule2.LOGIN_QUERY.Open; 
    if DataModule2.LOGIN_QUERY.FieldByName('password').AsString<>'' then 
    //Close the modal form with returning of mrOK as modal result 
    ModalResult := mrOK 
    else 
    begin 
    //No modal result should be set here or it would lead to closure of login form 
    MessageDlg('Entered password is incorect!',mtError, mbOKCancel, 0); 
    end; 
end; 

這是針對您的特定問題的直接解決方案。但我會建議您認真考慮整個登錄系統的設計。爲什麼?

在你目前的設計:你創建了應用程序的啓動所有形式。現在,當你開始隱藏你的主表單時,這仍然意味着你的用戶無法訪問它。

使用特殊的軟件用戶可以找到一個手柄,主窗體窗口,並顯示它不通過你的登錄過程會在所有。

所以,正確的做法,以避免這將是第一個,然後只對sucsessfull登錄創建表單的其餘創建登錄表單。但是這意味着您的登錄表單實際上會成爲您的應用程序的主要形式,因此您應該非常小心,不要關閉它,否則會導致整個應用程序關閉。

可以檢查如何實現我的回答這樣的做法在這裏另外一個問題的例子:

Delphi Change main form while application is running

+0

如果按鈕返回mrNone,錯誤的護照如何終止應用程序? – user763539 2015-02-11 12:37:29

+0

我的表單樣式(form4)被設置爲bsdialog。不是默認的對話框形式mrOK? – user763539 2015-02-11 12:50:35

+0

@ user763539這是因爲在您的登錄方法中,您正在檢查Modal結果的方式是,如果它是mrOK,則顯示主窗體,但在所有其他情況下(也包括mrNone),您調用Application.Terminate。 – SilverWarior 2015-02-11 13:49:07

相關問題