Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:40[Войти] | [Зарегистрироваться]
Ответ на вопрос № 50002

09-03-2007 07:44
Доброго времени суток господа.

Программу пишу на BDS2006. Есть необходимость перед стартом приложения выводить форму аутентификации. При удачной аутентификации следует вывод главной формы программы, при неудачной попытка №2 и т.д. А вот если пользователь нажал кнопку < Выход > (на форме аутентификации), то главная форма программы не должна появиться. Т.е. приложение должно завершить работу! Подскажите пожалуйста как это сделать?

Заранее СПАСИБО!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

11-04-2010 05:20
>>> подскажите пожалуйста((что делать если приложение не компилируется???

Читать сообщения компилятора об ошибках.

что делать если нет данной строки 
    Application.CreateForm(TForm1, Form1); 


Эта строка есть в любом новом проекте с формами и генерируется Delphi автоматически.
Можете проверить:
1. Создаёте новый проект: File/New/VCL Forms Application
2. Открываете файл проекта: Project/View Source
3. Видите автоматически сгенерированный код и в нём - искомую строку.

Что будет там потом - зависит от вас.

11-04-2010 02:43 | Вопрос к автору: запрос дополнительной информации
подскажите пожалуйста((что делать если приложение не компилируется???
begin
    Application.CreateForm(TForm1, Form1); 
    Application.Run;
  end;
end.

что делать если нет данной строки 
    Application.CreateForm(TForm1, Form1); 

11-04-2010 02:42 | Вопрос к автору: запрос дополнительной информации
подскажите пожалуйста((что делать если приложение не компилируется???
begin
    Application.CreateForm(TForm1, Form1); 
    Application.Run;
  end;
end.

что делать если нет данной строки 
    Application.CreateForm(TForm1, Form1); 

12-03-2007 04:02 | Сообщение от автора вопроса
Вопрос решен. Спасибо за помощь!!!

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;

// Назначаем в инспекторе объектов:
// btnOk.ModalResult := mrOk
// btnCancel.ModalResult := mrCancel


10-03-2007 15:54
>>> Ура! все получилось. Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...

Без кода трудно делать какие-либо выводы.
Попробую высказать несколько мыслей и замечаний, что называется, по поводу...

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.

CheckPasswordFrm.pas

unit CheckPasswordFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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;

// Назначаем в инспекторе объектов:
// btnOk.ModalResult := mrOk
// btnOk.ModalResult := mrCancel

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;

end.


10-03-2007 10:16
  if {данные верны} then
    ModalResult:=mrOK
  else
    ModalResult:=mrNone;


Устанавливать в else ModalResult:=mrNone в данном случае совершенно излишне, а вот выдавать сообщение о неправильном пароле и уменьшать счетчик оставшихся попыток - в самый раз.

09-03-2007 08:34 | Сообщение от автора вопроса
Спасибо ОГРОМНОЕ! Буду думать.

09-03-2007 08:29
Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...

Тут уж я ничего сказать не могу, кроме того, что ошибка в вашем коде. Пройдитесь по нему отладчиком по строкам, и найдите из-за чего она возникает. Access Violation - это обращение по несуществующему адресу. Видимо вы обращаетесь к уничтоженному объекту.

09-03-2007 08:24 | Сообщение от автора вопроса
Ура! все получилось. Но вот теперь, если я просто закрываю форму аутентификации, ОШИБКА...

Project ...exe raised exception class EAccessViolation with message "Access violation at address 00406C9A in module '...exe'. Read of address 01320EE8.

09-03-2007 08:09
А, вам еще нужно чтобы при неудачной аутентификации все повторялось? Сделайте лучше проверку правильности ввода в OnClick кнопки на форме аутентификации.

procedure TForm2.Button1Click(Sender: TObject);
begin
  if {данные верны} then
    ModalResult:=mrOK
  else
    ModalResult:=mrNone;
end;


А ModalResult кнопке не выставляйте. Тогда при вводе неправильный данных форма не закроется, а при вводе правильных - закроется

09-03-2007 08:03
Обычно он имеет такой вид:

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

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-ы

09-03-2007 07:56
Не знаю как в bds2006, но в D7 у каждого проекта кроме pas и dfm есть файл проекта с расширением dpr (Delphi Project). Там можно писать код. Загляните туда и все поймете сами.

09-03-2007 07:53 | Сообщение от автора вопроса
Спасибо большое!
Простите за назойливость, можно пример?

09-03-2007 07:46
Писать код в файле проекта.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования