Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка в коде 
:(
    Опции темы
*^angel^*
Дата 8.5.2003, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



День добрый! smile.gif
Помогите разобраться с проблемой: (D6)
есть окно авторизации (пароль и логин), после проверки должно появляться основное окно программы. Но после подтверждения логина и пароля (если они верны) программа вылетает и прекращает работу.
пишу в .dpr:
begin
Application.Initialize;
Application.CreateForm(TfUsers, fUsers); // форма авторизации
fUsers.ShowModal; //показываю форму авторизации
if fUsers.ModalResult = mrOK then // если правильный лигин и пароль и нажали ОК, проверка на
// правильность пароля и логина пишу в форме авторизации при нажатии на ней кнопки ОК
begin
Application.CreateForm(TfMain, fMain); // создание основной формы
Application.Run;
end
else Application.Terminate;
end.

не пойму почему вылетает? ставлю "стоп" на else Application.Terminate; и при проверке значений fUsers.ModalResult = 2, очень странно; а mrOK = 1; естественно вылетать будет. Вот и не ясно почему двум равно.
Может кто знает как мне можно помочь?
PM MAIL ICQ   Вверх
Song
Дата 8.5.2003, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Потому что главной считается первая автоматически созданная форма. У тебя первая - fUsers. И когда она закрывается, соответственно закрывается и программа.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
&-ray
Дата 8.5.2003, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

Репутация: нет
Всего: нет



Project -> Options -> Forms -> MainForm (выбери из списка fmain)
А вместо Application.Terminate подставь Halt (по-моему так будет более корректно, так как ты закрываешь приложение на стадии инициализации)


--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
*^angel^*
Дата 10.5.2003, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



я написАла по-другому, но все равно такая же проблема.

begin
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.ShowMainForm := False;
Application.CreateForm(TfUsers, fUsers);
fUsers.ShowModal;
if fUsers.ModalResult = mrOK then
begin
Application.ShowMainForm := true;
Application.Run;
end
else Application.Terminate;
end.

в Project -> Options -> Forms -> стоит fMain как главная форма.
Что еще я криво написАла?
PM MAIL ICQ   Вверх
Song
Дата 11.5.2003, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Код

Begin
With Application Do
 Begin
  Initialize;
  With TFUsers.Create(nil) Do
   try
    CreateForm(TfMain, fMain);
    ShowModal;
    IF ModalResult<>mrOk then Abort;
    Run;
   finally
    Free;
   end;
End.





--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Dayana
Дата 11.5.2003, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



Может у тебя ошибка при проверке логина и пароля? Т.е. при нажатии на кнопке
Ok всегда выходит с ModalResult = 2.... Покажи код, что происходит при нажатии кнопки Ok.
PM MAIL ICQ   Вверх
*^angel^*
Дата 11.5.2003, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



Dayana да, именно так: "всегда выходит с ModalResult = 2" не знаю почему. код, к-ый обрабатывается при нажатии на ОК (в форме авторизации):

procedure TfUsers.btnOKClick(Sender: TObject);
begin
case fUsers.ComboBox1.ItemIndex of
0:begin
if fUsers.Edit1.Text = '123' then
fUsers.Close
else
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
1:begin
if fUsers.Edit1.Text = '1234' then
fUsers.Close
else
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
2:begin
if fUsers.Edit1.Text = '12345' then
fUsers.Close
else
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
end; // конец CASE
end;
PM MAIL ICQ   Вверх
*^angel^*
Дата 11.5.2003, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



Song куда это вставлять надо?
PM MAIL ICQ   Вверх
neutrino
Дата 11.5.2003, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



А ModalResult надо на кнопки назначать. Ты назначила?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Song
Дата 11.5.2003, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Цитата
Song куда это вставлять надо?

В dpr


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Song
Дата 11.5.2003, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Цитата
Dayana да, именно так: "всегда выходит с ModalResult = 2" не знаю почему. код, к-ый обрабатывается при нажатии на ОК (в форме авторизации)...

Потому что этот код у кнопки btnOK в ModalResult. Ты когда тип кнопки назначала (с зелёной галочкой наверно), ModalResult у тебя назначился самостоятельно.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
*^angel^*
Дата 11.5.2003, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



neutrino да назначила, при создании фрмы:

procedure TfUsers.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Clear;
ComboBox1.Items.Add('Администратор');
ComboBox1.Items.Add('Менеджер');
ComboBox1.Items.Add('Секретарь');
Edit1.PasswordChar := '*';
btnOK.ModalResult := mrOk;
btnCancel.ModalResult := mrCancel;
end;
PM MAIL ICQ   Вверх
*^angel^*
Дата 11.5.2003, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



Цитата(Song @ 11.5.2003, 02:48)
Ты когда тип кнопки назначала (с зелёной галочкой наверно), ModalResult у тебя назначился самостоятельно.

ничего такого не было. у меня кнопки ОК и ОТМЕНА - обычные кнопки, а не TBitBtn:

btnOK: TButton;
btnCancel: TButton;


PM MAIL ICQ   Вверх
Song
Дата 11.5.2003, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Посмотри их ModalResult


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
*^angel^*
Дата 11.5.2003, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



Song вот такие:
btnOK.ModalResult := mrOk; - 1
btnCancel.ModalResult := mrCancel; - 0
PM MAIL ICQ   Вверх
Song
Дата 11.5.2003, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Тогда я чего-то не пойму: зачем ты делаешь fUsers.Close если кнопка, обладая ModalResult, кроме как mrNone, сама закроет форму!


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Dayana
Дата 11.5.2003, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



В этом и ошибка. Не нужно насильно закрывать форму, тогда ModalResult формы сохранит значение ModalResult кнопки. А если пароль неверный, то меняй значение ModalResult формы в коде...
PM MAIL ICQ   Вверх
*^angel^*
Дата 11.5.2003, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



Все супер! получилось. НаписАла так:

procedure TfUsers.btnOKClick(Sender: TObject);
begin
case fUsers.cbLogin.ItemIndex of
0:begin
if fUsers.ePassword.Text <> '123' then MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
1:begin
if fUsers.ePassword.Text <> '1234' then MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
2:begin
if fUsers.ePassword.Text <> '12345' then MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
end;
end; // конец CASE
end;

только если я ввожу неправильный пароль, сначала выскакивает окно "Неправильный пароль", и пользователь может ввести его еще раз. А потом я опять ввожу неправильный пароль, но программа активизируется, как-будто это правильный пароль.
PM MAIL ICQ   Вверх
&-ray
Дата 11.5.2003, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

Репутация: нет
Всего: нет



Раз уж такие заморочки с ModalResult то можно обойтись и без него.
Просто при нажатии кнопки btnOk проверяй правильность пароля, если правильно, то просто закрывай форму и все, если нет то оставляй ее открытой. По клику на btnCancel убивай приложений (Halt).
Соответственно надо подправить dpr, чтобы не было проверок ModalResult


--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
*^angel^*
Дата 11.5.2003, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



СУПЕР! все получилось и работает. Сделала так:
во-первых ввела глобальную переменную FLAG : Boolean, которая отвечает за то, что правильно введены пароль и логин.
во-вторых, написАла следующее (форма авторизации, нажата кнопка ОК):

procedure TfUsers.btnOKClick(Sender: TObject);
begin
case fUsers.cbLogin.ItemIndex of
0:begin
if fUsers.ePassword.Text <> '123' then
begin
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
FLAG := false;
end
else
begin
fUsers.Close;
FLAG := true;
end;
end;
1:begin
if fUsers.ePassword.Text <> '1234' then
begin
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
FLAG := false;
end
else
begin
fUsers.Close;
FLAG := true;
end;
end;
2:begin
if fUsers.ePassword.Text <> '12345' then
begin
MessageDlg('Неверный пароль!', mtError, [mbOK], 0);
FLAG := false;
end
else
begin
fUsers.Close;
FLAG := true;
end;
end;
end; // конец CASE
end;

.dpr :

begin
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.ShowMainForm := False;
Application.CreateForm(TfUsers, fUsers);
fUsers.ShowModal;
if FLAG then
begin
Application.ShowMainForm := true;
Application.Run;
end
else Halt;
end.

В-третьих, убрала с кнопок ОК и Отмена значения ModalResult mrOK и mrCancel соответственно.

СПАСИБО ВСЕМ ЗА ПОМОЩЬ!!!!!!!!!!!!!!!!!
чтобы я без вас делала?! wink.gif
PM MAIL ICQ   Вверх
*^angel^*
Дата 11.5.2003, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



единственное - долго загружается главная форма, после ввода правильных логина и парол.......... можно это как подправить?
PM MAIL ICQ   Вверх
Song
Дата 12.5.2003, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Проверять пароль на Form1.onShow


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
*^angel^*
Дата 12.5.2003, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



jnSow какой формы? авторизации или главной?
PM MAIL ICQ   Вверх
*^angel^*
Дата 12.5.2003, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



т.е. onShow
PM MAIL ICQ   Вверх
Song
Дата 12.5.2003, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Ну естесно главной


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
*^angel^*
Дата 12.5.2003, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.3.2003
Где: Столица нашей нео бъятной Родины

Репутация: нет
Всего: нет



а что делать с обработчиком на кнопке ОК, в форме авторизации? просто fMain.Show? - тогда если пароль неправильный, то форма все равно показывается.
ведь ничего не происходит, если просто сделать проверку в Show.
PM MAIL ICQ   Вверх
Song
Дата 12.5.2003, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Да сделай Close асинхронно и всё..


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Akella
Дата 14.5.2003, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Попробуй открывать главное окно программы в обработчике закрытия формы авторизации
PM MAIL   Вверх
SmaLL
Дата 15.5.2003, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 557
Регистрация: 17.12.2002
Где: Voronezh

Репутация: 1
Всего: 2



Я делал так

Код
procedure TMainForm.FormActivate(Sender: TObject);
var
 continue: boolean;
begin
 continue:= True;
 // крутим цикл до тех пор, пока не введут правильное имя/пароль
 // или не нажмут отмену.
 while continue do
 begin
   if dlgLogin.ShowModal = mrOK then
     continue:= not ValidLogin(dlgLogin.Login.Text, dlgLogin.Password.Text)
   else
   begin
     continue:= False;
     Close;
   end;
 end;
end;



--------------------
Что ни делается - всЁ к лучшему! SmallWeb
Мой адрес не дом и не улица, мой адрес родной пивзавод!
PM MAIL WWW ICQ   Вверх
Song
Дата 15.5.2003, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



иф ModalResult<>mrOk зен WM_CLOSE


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
&-ray
Дата 16.5.2003, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 406
Регистрация: 15.4.2003
Где: Казахстан, г Аста на

Репутация: нет
Всего: нет



Цитата
иф ModalResult<>mrOk зен WM_CLOSE


Вроде как порешили не использовать ModalResult

*^angel^*, предлагаю простой способ:

dpr:
Код

 //собственно ничего оригинального здесь нет
 Application.Initialize;
 Application.CreateForm(TfMain, fMain);
 Application.CreateForm(TfUsers, fUsers);
 application.ShowMainForm:=false;
 Application.Run;


на ГЛАВНУЮ форму выложи таймер, установи интервал в несколько мс и добавь процедуру:

Код

procedure TfMain.Timer1Timer(Sender: TObject);
begin
timer1.enabled:=false;
fUsers.show; //именно show, а не showmodal!!!
end;


в форме авторизации при клике на btnOk проверяй правильность пароля, если пароль верный, то закрывай эту форму и отображай главную (fMain.show), если пароль неправильный, то оставляй форму открытой.
При клике на btnCancel закрывай приложение (application.terminate)

И усе готово!



--------------------
"Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б.

--------------------
И снова мышь беру я в руки
Куда иду? - Конечно в сруки!
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.