2015-02-11 41 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

相关问题