Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Переход между формами


Автор: Keeper89 5.5.2009, 23:16
Доброго времени суток!

Возможно глупый вопрос. Имеется главная форма и форма ввода пароля, которая должна появляться перед главной формой. Какую форму нужно поставить главной, и как закрывать форму пароля в случае успешного ввода пароля?

Спасибо.

Автор: Данкинг 5.5.2009, 23:27
Цитата(Keeper89 @  6.5.2009,  00:16 Найти цитируемый пост)
как закрывать форму пароля

Код

self.Close;

? smile 

Автор: Christoph 5.5.2009, 23:41
Отобрази вторую форму модально

Код

Form2.ShowModal;


и если пароль верный то

Код

ModalResult:=mrOk;


И у тебя модальная форма закроется

Автор: Rodman 5.5.2009, 23:49
Код

Form2.hide;

но будь внимателен.. при закрытии проекта совсем - надо закрывать ГЛАВНУЮ форму

Автор: Keeper89 6.5.2009, 00:40
Цитата(Rodman @  5.5.2009,  23:49 Найти цитируемый пост)
но будь внимателен.. при закрытии проекта совсем - надо закрывать ГЛАВНУЮ форму 

Как раз этот способ использую, и при закрытии 2 формы приложение не завершалось. Теперь буду из 2 формы "убивать" и главную.

А нельзя сделать так:
Код

Form2.Show;
Form1.Close;

или сделать так, чтобы приложение завершалось при закрытии последней формы?

Автор: kami 6.5.2009, 00:41
Вопрос не глупый, но думал что вы-то уж с гуглом на "ты".
http://base.vingrad.ru/view/1186-Sozdanie-zastavki-pri-starte-programmyi


Цитата(Keeper89 @  5.5.2009,  23:16 Найти цитируемый пост)
Какую форму нужно поставить главной,

Форма ввода пароля - это всего лишь форма ввода пароля, которая к главности не имеет никакого отношения.


Цитата(Keeper89 @  5.5.2009,  23:16 Найти цитируемый пост)
как закрывать форму пароля в случае успешного ввода пароля

И в случае успешного ввода, и в противном случае наиболее логичным будет код Christoph, за одной оговоркой:
после ModalResult=что-то_там форма ввода пароля будет уничтожена. После ее уничтожения обращаться к ней (и к результатам ее работы, всяким LoginForm.EditLogin.Text) НЕЛЬЗЯ. Поэтому сразу по отработке формы авторизации нужно сохранить имя пользователя и пароль (в явном или уже преобразованном виде - не знаю, как у вас это сделано) куда-нибудь в глобальные переменные (к примеру), и использовать их уже оттуда.

P.S. с кодом из FAQ для вашего случая лишние как минимум[скорее всего] таймеры с ProcessMessages, вполне возможно нужен ShowModal а не Show... в общем, поле для деятельности есть.

Добавлено через 4 минуты и 57 секунд
Цитата(kami @  6.5.2009,  00:41 Найти цитируемый пост)
сразу по отработке формы авторизации нужно сохранить имя пользователя и пароль

Забыл сказать - имеется ввиду - из ее же кода, т.е. (например) в OnLoginButtonClick, рядом с ModalResult:=...

Добавлено через 12 минут и 54 секунды
Цитата(kami @  6.5.2009,  00:41 Найти цитируемый пост)
после ModalResult=что-то_там форма ввода пароля будет уничтожена.

Еще поправка - если OnClose формы пусто, или в нем в явном виде поставлено Action:=caFree

Автор: Keeper89 6.5.2009, 01:13
kami, спасибо за расстановку всех точек над i smile !
P.S. После небольшой "операции" в dpr-файле пропала возможность выбрать Form1 в качестве главной, а Form2 (парольная форма) можно. Как можно это исправить?

Добавлено через 2 минуты и 10 секунд
Цитата(kami @  6.5.2009,  00:41 Найти цитируемый пост)

Еще поправка - если OnClose формы пусто, или в нем в явном виде поставлено Action:=caFree 

Т.е. в OnClose добавить Action:=caFree?

Добавлено через 7 минут и 12 секунд
Цитата(kami @  6.5.2009,  00:41 Найти цитируемый пост)
Вопрос не глупый, но думал что вы-то уж с гуглом на "ты".
показ формы первее главной

smile искал, но видимо подобрал не то сочетание слов.

Автор: Keeper89 6.5.2009, 02:45
Плюс к предыдущим:
Цитата(kami @  6.5.2009,  00:41 Найти цитируемый пост)
куда-нибудь в глобальные переменные

Как объявить глобальную переменную и где, когда создана только форма ввода пароля?

Автор: kami 6.5.2009, 07:56
Чегой-то я возможно не то сказал по поводу уничтожения формы логина.
Вечером поэкспериментирую.

Цитата(Keeper89 @  6.5.2009,  01:13 Найти цитируемый пост)
Как можно это исправить?

Убрать все лишнее, подсмотреть в "чистом" dpr файле последовательность операторов.

должно быть как-то так:
Код

Application.Initialize;

fmLogin:=TfmLogin.Create(nil);

if fmLogin.ShowModal<>mrOk then 
  begin
    // чего-нибудь говорим и выходим.
  end;

Application.CreateForm(fmMain, TfmMain); // а вот и главная форма.
Application.Run;

fmLogin.Free; // на этой строчке может выдавать ошибку, если форма уничтожается сама.




Цитата(Keeper89 @  6.5.2009,  02:45 Найти цитируемый пост)
Как объявить глобальную переменную и где,

Создана-то только она, а вот инициализация модулей уже прошла (хотя даже она тут ни при чем).

в форме ввода логина:
Код

implementation
uses
  UnitMain;


в UnitMain:
Код

interface
uses
...
type
  ....

var
  UserLogin:string;
  userHashPass:string;


implementation
.....


Автор: Keeper89 6.5.2009, 20:35
Цитата(kami @  6.5.2009,  07:56 Найти цитируемый пост)
Цитата(Keeper89 @  6.5.2009,  02:45 Найти цитируемый пост)
Как объявить глобальную переменную и где,
...
Создана-то только она, а вот инициализация модулей уже прошла (хотя даже она тут ни при чем).
в форме ввода логина:
...
в UnitMain:

Спасибо, так и сделал.

Добавлено через 2 минуты и 58 секунд
Всем спасибо за обсуждения!
Совместил подход kami с http://delphi.about.com/od/windowsshellapi/a/password_login.htm методом, получилось очень даже неплохо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)