2015-02-11 3 views
-3

Я установил мою процедуру входа в систему с помощью доступной формы (Form4) и MainForm. В доступной форме (form4) У меня есть:Приложение прекращается без видимой причины

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

Процедура 'Login' идет:

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 приложение завершается без каких-либо причин. Почему это происходит ? Должно

Приложение.MainFormOnTaskbar: = False;

может быть установлен как истинный, возможно?

Edit:

я редактировал файл проекта и 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. 

и я не кажется, что получают приложение закрытие .... (он все еще делает, ughh ...)

изменить2:

Пробовал этот способ. Я установил мой 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. –

+0

Довольно трудно увидеть прошлое, что 'Application.Terminate'. Я также задаюсь вопросом, почему вы не даете имена своих форм. И почему вы их создаете при запуске. Думаю, идеал сделал это для вас. Но это плохой путеводитель. Он считает, что вы программист VB с конца 20-го века. –

+2

BTW После этого все ваше задание (прежде чем вы сделаете что-либо еще в своем приложении) должно избавиться от простых текстовых паролей в вашей базе данных и заменить их хэшами (SHA1). Это правило безопасности Интернета/базы данных №1 и ** вы не можете начать делать это достаточно скоро **. –

ответ

2

Как @SertacAkyuz намекает, одним из вариантов было бы то, что ShowModal не возвращает mrOK. Проверьте значение ModalResult для этой кнопки и/или обработчик событий для OnClick этой кнопки, чтобы узнать, возвращается ли mrOK ModalResult, который возвращается в этих случаях ...

Если вы нажмете кнопку, то событие OnClick будет и если ModalResult этой кнопки настроен на что угодно, ModalResult формы будет установлен в это значение. Когда событие (например, событие OnClick) заканчивается, форма проверяет его значение ModalResult, и если оно установлено на что-либо другое, то 0 (ноль), форма закрывается и значение возвращается в результате функции ShowModal.

Итак, из какой информации вы дали, это похоже на вероятный сценарий - для ModalResult формы установлено значение, которое не является mrOK. Затем форма закрывается, и ваш тест IF ShowModal затем завершает приложение (так как он не возвращает mrOK).

+0

Так что я должен попробовать установить на создание формы с: ModalResult: = mrOK ;? – user763539

+0

Только если вы хотите, чтобы он сразу же закрылся с ShowModal, возвращающим mrOK. – HeartWare

+0

так как я могу это исправить? – user763539

1

Исходя из вашего кода, вводящего неправильный пароль, также будет прекращено ваше заявление, так как в этом случае возвращенный модальный результат будет mrNone, и вы ожидаете, что mrOK продолжит работу с вашим приложением.

Так что я рекомендую следующие изменения:

Сначала удалите модальный результат Собственость вашей кнопки. кнопка modal result propertyy в основном используется только как способ пересылки информации по нажатию на какую конкретную кнопку приводит к закрытию модальной формы.

Затем измените код событий кнопок так, чтобы он задавал форму модального результата, если код верен, иначе он должен показать сообщение, в которое введено введенное passowrd. Что-то вроде этого:

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 login создать остальные формы. Но это будет означать, что ваша форма входа на самом деле станет основной формой вашего приложения, поэтому вам следует проявлять большую осторожность, не закрывая ее, поскольку это приведет к закрытию всего вашего приложения.

Вы можете проверить пример того, как реализовать такой подход в моем ответе на другой вопрос здесь:

Delphi Change main form while application is running

+0

Как может неправильный паспорт прекратить действие приложения, если кнопка возвращает mrNone? – user763539

+0

Мой стиль форм (form4) установлен в bsdialog. Не является ли форматом диалога mrOK по умолчанию? – user763539

+0

@ user763539 То есть, в вашем методе входа вы проверяете результат модальности таким образом, что если это mrOK, вы показываете основную форму, но во всех остальных случаях (который также включает mrNone) statment вы вызываете Application.Terminate. – SilverWarior

Смежные вопросы