Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > окно авторизации


Автор: bagos 26.1.2009, 02:49
Нужно сделать окно авторизации.
форма - login
форма - main

  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(TfrmLogin, frmLogin);


сделал так:
в login - в онклике кнопки
  ModalResult := mrOk;


в main
procedure TfrmMain.FormShow(Sender: TObject);
begin
  if frmlogin.ShowModal = mrOk then
    AdvSmoothListBox1.Items.Add;
end;

мне нужна такая логика:
если пароль правильный то, форма (main) открывается и выполняется код находящийся в onshow
если неправильный то остается форма логина
если жмем на крестик в логин форме, то программа завершается.
как это реализовать? устал биться.

Автор: Akella 26.1.2009, 09:05
Заключай код в тэги код
http://forum.vingrad.ru/forum/topic-126445.html

Добавлено через 3 минуты и 24 секунды
Код

в main
procedure TfrmMain.FormShow(Sender: TObject);
begin
  if frmlogin.ShowModal = mrOk then begin
    AdvSmoothListBox1.Items.Add;
  end else begin
    ShowMessage('Пароль неверный');
    Close;//закроется frmMain
  end;


Но это не лучший вариант, т.к. может наступить момент, когда во время работы приложения будет вызвано событие TfrmMain.FormShow и у тебя опять будет показана форма с запросом имени пользователя и пароля.

Добавлено через 8 минут и 42 секунды
Вот мой работающий код. Хотя может быть кто-нибудь ещё лучше подскажет.
Код

procedure TfmNeoba.FormShow(Sender: TObject);
begin
 //Если первый старт, то показывает запрос логина и пароля
 if bFirstStart then begin

   timerUpdate.Interval := iInterval;
   timerUpdate.Enabled := cboxEnableTimer.EditValue;
   if iInterval < 60000 then begin
     cboxEnableTimer.EditValue  := false;
     timerUpdate.Enabled        := false;
      TrayIcon1.BalloonTitle := 'Neoba 2007';
      TrayIcon1.BalloonHint  := 'Ошибка.'+#13+'Неправильно выставлен интервал обновления.';
      TrayIcon1.BalloonTimeout := 10000;
      TrayIcon1.BalloonFlags := bfWarning;
      TrayIcon1.ShowBalloonHint;

   end;

   fmLogon := TfmLogon.Create(Application);
   if fmLogon.ShowModal = mrOk then begin
     FreeAndNil(fmLogon);
   end else begin
     Freel(fmLogon);
   end;
 end;//if bFirstStart then begin
 lbInterval.Caption := IntToStr(timerUpdate.Interval div 60000);
 bFirstStart := false;
end;

Автор: Quartz 26.1.2009, 12:25
Я примерно так делаю (код из .dpr):
Код
begin
  Application.Initialize;
  Application.CreateForm(TfmMain, fmMain);
  Application.CreateForm(TDataModule, DataModule);
  Application.CreateForm(TfmLogin, fmLogin);
  //передаем ссылку на объект БД в диалог авторизации...
  fmLogin.Database := DataModule.Database;
  // ... внутри диалога пытаемся подключиться к базе.
  // Если все ОК - создаем остальные формы и запускаем приложение.
  if fmLogin.ShowModal = mrOk then 
  begin 
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    //....
    Application.Run;
  end;
end.

Автор: xfoby 21.2.2009, 07:50
Quartz, немного не так надо ИМХО..

Код

program Prj;

uses
  Forms, Controls,
  Main in 'Main.pas' {wMain},
  Login in 'Login.pas' {wLogin};

{$R *.res}

begin
  Application.Initialize;
  wLogin := TwLogin.Create(Application);
  wLogin.ShowModal;
  if wLogin.ModalResult = mrOk then
    Application.CreateForm(TwMain, wMain);
  wLogin.Free;
  Application.Run;
end.


Ну, а связь с источником хранения входных данных установи, обработав onCreate формы wLogin  smile 

Ах, да, совсем забыл...на форме логина баттону свойство ModalResult выставь mrNone, а по onClick пропиши что-то такое:

Код

...
var
  Pswd: string; // сюда пароль считай по onCreate из источника (БД, IniFile, Запись и т.д.)
...

procedure TwLogin.Button1Click(Sender: TObject);
begin
  if Edit1.Text = Pswd then
    ModalResult := mrOk;
end;


Таким образом ты получишь вечный запрос на ввод пароля, пока не введут верный или не нажмут крестик =)

Автор: Quartz 28.2.2009, 13:55
Цитата(xfoby @  21.2.2009,  07:50 Найти цитируемый пост)
Ну, а связь с источником хранения входных данных установи, обработав onCreate формы wLogin   

1. Что есть "источник хранения входных данных"? 
2. Явный недостаток при таком подходе: отсутствует возможность повторного использования формы (например, в другом проекте).

Цитата(xfoby @  21.2.2009,  07:50 Найти цитируемый пост)
var
  Pswd: string; // сюда пароль считай по onCreate из источника (БД, IniFile, Запись и т.д.)

Клиника...

Автор: xfoby 9.3.2009, 00:43
Цитата

1. Что есть "источник хранения входных данных"? 

Файл, где храняться логин(ы) и пароль(ли) пользователя(ей).

Цитата

2. Явный недостаток при таком подходе: отсутствует возможность повторного использования формы (например, в другом проекте).

Да ну? Я привык все формы такого типа хранить в списке доступных, а не автосоздаваемых и почему-то такой проблемы не встречал.
Создаём форму ещё раз по нажатию, к примеру, на ButtonX:

Код

procedure ButtonXClick(Sender: TObject);
begin
  wLogin := TwLogin.Create(Application);
  wLogin.ShowModal;
  if wLogin.ModalResult = mrOk then
    wMainCreate(Sender);
end;

Цитата

Клиника...


Быть может, но грамотней, чем
Цитата

Код

begin
  Application.Initialize;
  Application.CreateForm(TfmMain, fmMain);
  Application.CreateForm(TDataModule, DataModule);
  Application.CreateForm(TfmLogin, fmLogin);
  //передаем ссылку на объект БД в диалог авторизации...
  fmLogin.Database := DataModule.Database;
  // ... внутри диалога пытаемся подключиться к базе.
  // Если все ОК - создаем остальные формы и запускаем приложение.
  if fmLogin.ShowModal = mrOk then 
  begin 
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    //....
    Application.Run;
  end;
end.


Да и проще для выполнения...
ЗЫ: и к чему вообще нервничать, если я ясно написал "ИМХО"

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