Программу пишу на BDS2006. Есть необходимость перед стартом приложения выводить форму аутентификации. При удачной аутентификации следует вывод главной формы программы, при неудачной попытка №2 и т.д. А вот если пользователь нажал кнопку < Выход > (на форме аутентификации), то главная форма программы не должна появиться. Т.е. приложение должно завершить работу! Подскажите пожалуйста как это сделать?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
11-04-2010 05:20
>>> подскажите пожалуйста((что делать если приложение не компилируется???
Читать сообщения компилятора об ошибках.
что делать если нет данной строки
Application.CreateForm(TForm1, Form1);
Эта строка есть в любом новом проекте с формами и генерируется Delphi автоматически.
Можете проверить:
1. Создаёте новый проект: File/New/VCL Forms Application
2. Открываете файл проекта: Project/View Source
3. Видите автоматически сгенерированный код и в нём - искомую строку.
10-03-2007 17:43 | Комментарий к предыдущим ответам
Исправление к предыдущему сообщению:
class function TCheckPasswordForm.CheckPassword: Boolean;
begin
with TCheckPasswordForm.Create(Application) do
begin
AllowTryCount := 3;
Result := (ShowModal = mrOK);
Free;
end
end;
>>> Ура! все получилось. Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...
Без кода трудно делать какие-либо выводы.
Попробую высказать несколько мыслей и замечаний, что называется, по поводу...
1. Чем меньше вы вмешиваетесь в файл проекта, тем лучше.
2. Блок строк с CreateForm должен быть непрерывным (т.е. без вставок своего кода), иначе дизайнер сбивается (по крайней мере в D6).
3. Главной формой в приложении назначается первый объект, создаваемый через CreateForm независимо от места, где происходит вызов, и являющийся формой (TForm или наследником). Указатель сохраняется в Application.FMainForm (ReadOnly свойство MainForm).
4. Показ главной формы в TApplication.Run происходит не по указателю FormN (вы даже можете написать FormN := nil перед вызовом TApplication.Run, но форма все равно будет показана), а по полю Application.FMainForm, изменить который после первого вызова CreateForm для создания формы вы уже просто так не сможете...
5. Если на момент вызова Application.Run вы уже уничтожили главную форму через FormN.Free, то Application.FMainForm становится равным nil (где это происходит, не уследил), т.о. следующая создаваемая через CreateForm форма станет главной. Если форм больше не создавалось, то Application.FMainForm = nil и Application.Run просто ничего не будет делать.
6. Вывод: для создания своих форм всегда следует использовать только вызов конструктора, оставив CreateForm исключительно дизайнеру.
Т.о., если использовать предложенную Ins конструкцию, то код должен выглядеть примерно так:
begin
Application.Initialize;
if CheckPassword then // В CheckPassword не должна вызываться CreateForm
begin
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.Run;
end;
end.
Данный вопрос оказался интересен мне в плане проверки отсутствия проблем при запуске программы, поэтому я рассмотрел его немного подробнее и после небольших изысканий предлагаю свой вариант:
Project1.dpr
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4},
CheckPasswordFrm in 'CheckPasswordFrm.pas' {CheckPasswordForm},
Unit5 in 'Unit5.pas' {DataModule5: TDataModule},
Unit6 in 'Unit6.pas' {DataModule6: TDataModule};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TDataModule5, DataModule5);
Application.CreateForm(TDataModule6, DataModule6);
// Блок с CreateForm должен быть непрерывным (без вставок), иначе дизайнер сбивается
// Здесь уже созданы дата-модули и мы можем проверить не только пароль,
// но и, например, отсутствие проблем с базой данных
if not TCheckPasswordForm.CheckPassword then
Exit;
Application.Run;
end.
type
TCheckPasswordForm = class(TForm)
btnOk: TButton;
Edit1: TEdit;
btnCancel: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
AllowTryCount: Integer;
public
class function CheckPassword: Boolean;
end;
implementation
{$R *.dfm}
class function TCheckPasswordForm.CheckPassword: Boolean;
begin
with TCheckPasswordForm.Create(Application) do
begin
AllowTryCount := 3;
Result := (ShowModal = mrOK);
end
end;
procedure TCheckPasswordForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ModalResult <> mrOk then Exit;
if Edit1.Text <> 'abc' {Условно} then
begin
Dec(AllowTryCount);
ShowMessage('Введен неправильный пароль'#13 + 'Осталось попыток: ' + IntToStr(AllowTryCount));
if AllowTryCount > 0 then
Action := caNone
else
ModalResult := mrCancel;
end;
end;
if {данные верны} then
ModalResult:=mrOK
else
ModalResult:=mrNone;
Устанавливать в else ModalResult:=mrNone в данном случае совершенно излишне, а вот выдавать сообщение о неправильном пароле и уменьшать счетчик оставшихся попыток - в самый раз.
Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...
Тут уж я ничего сказать не могу, кроме того, что ошибка в вашем коде. Пройдитесь по нему отладчиком по строкам, и найдите из-за чего она возникает. Access Violation - это обращение по несуществующему адресу. Видимо вы обращаетесь к уничтоженному объекту.
Ура! все получилось. Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...
Project ...exe raised exception class EAccessViolation with message "Access violation at address 00406C9A in module '...exe'. Read of address 01320EE8.
А, вам еще нужно чтобы при неудачной аутентификации все повторялось? Сделайте лучше проверку правильности ввода в OnClick кнопки на форме аутентификации.
procedure TForm2.Button1Click(Sender: TObject);
begin
if {данные верны} then
ModalResult:=mrOK
else
ModalResult:=mrNone;
end;
А ModalResult кнопке не выставляйте. Тогда при вводе неправильный данных форма не закроется, а при вводе правильных - закроется
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Сделайте как-нибудь так:
program Project1;
uses
Controls, Forms, // Controls не забудьте
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Form2:=TForm2.Create(Application);
Form2.ShowModal;
if Form2.ModalResult = mrOK then begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
А кнопкам на форме аутентификации назначьте ModalResult-ы
Не знаю как в bds2006, но в D7 у каждого проекта кроме pas и dfm есть файл проекта с расширением dpr (Delphi Project). Там можно писать код. Загляните туда и все поймете сами.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.