Topic: Форма ввода профиля и главная форма

День добрый! Изначально в проекте не было предусмотрено использование учетных данных и паролей для входа. Но теперь понадобилось, создал форму ввода учетных данных, использовал SQL запрос для разрешения входа:

s := VarToStr( SQLExecute('SELECT count(id) FROM master WHERE (pass = ''' + login.Edit1.Text + ''');') );
     if (s <> '0') and (s<>'') then
     begin
          sUser := login.ComboBox1.Text; 
          login.Close; // закрытие формы

При совпадении логина и пароля форма закрывается и открывается главное окно программы.
Беда в том, что форму с вводом пароля нужно закрыть (чтобы открывалась основная форма) и защита от обычного закрытия формы не помогает, тоесть при закрытии формы ввода пароля закрывается вся программа.

procedure login_OnClose (Sender: string; Action: string);
begin
     if sUser='' then Form1.Close;
end;

Как можно защитить ввод пароля от банального закрытия?

Re: Форма ввода профиля и главная форма

Блин методом тыка обнаружил, что можно менять загрузочную форму по умолчанию ))) Теперь думаю все получится

Re: Форма ввода профиля и главная форма

Все заработало, как только сделал форму пароля стартовой, другая проблема, при закрытии программы не закрывается стартовая форма, события по клику login.Close и OnClose почему то не работают, работает только спрятать форму login.Hide (остается процесс в системе)

Re: Форма ввода профиля и главная форма

login.Close сработал когда сделал модальную основную форму.

Re: Форма ввода профиля и главная форма

Если форма с запросом логина и пароля является главной,  и затем после успешного ввода логина и пароля она скрывается (frmLogin.Hide), то приложение останется висеть в процессах, пока эта форма (frmLogin) не будет закрыта, т.к. приложение закрывается, только тогда, когда закрывается его главная форма.


Таким образом вам необходимо вручную закрыть форму frmLogin, сделать это можно в событии OnClose в форме, которая является основной для работы с вашей базой данных.


например:

procedure Form2_OnClose (Sender: string; Action: string);
begin
    frmLogin.Close;
end;

таким образом, при закрытии формы Form2, закроется и главная форма проекта frmLogin

Dmitry.

Re: Форма ввода профиля и главная форма

Спасибо, почитал на форуме подобную проблему! Все решилось. Благодарю

7 (edited by Dima.Bekmametov 2015-12-10 11:35:02)

Re: Форма ввода профиля и главная форма

здравствуйте помогите пожалуйста скрипт

procedure NEON_OnClose (Sender: string; Action: string);
begin
    Form1.Close;
end;
мне не помог Form1 остается скрытым что у меня тут не правильно ?


var
   sUser: string = '';
   Timer: TTimer;

                procedure NEON_OnClose (Sender: string; Action: string);
begin
    Form1.Close;
end;



// показать/скрыть пароль
procedure Form1_CheckBox1_OnClick (Sender: string);
begin
     if Form1.CheckBox1.Checked then Form1.Edit2.PasswordChar := #0
     else Form1.Edit2.PasswordChar := '*';
end;


procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // SQL запрос логина и пароля пользователя
     s := VarToStr( SQLExecute('SELECT count(id) FROM users WHERE (login = ''' + Form1.Edit1.Text + ''') AND (password = ''' + Form1.Edit2.Text + ''');') );

     // если логин и пароль найдены
     if (s <> '0') and (s<>'') then
     begin
          sUser := Form1.Edit1.Text; // запоминание имени пользователя

          // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT administrator FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then NEON.Button1.Enabled := False; // если пользователь не обладает правами администратора, отключить кнопку

          // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT read FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then NEON.Button7.Enabled := False; // если пользователь не обладает правами администратора, отключить кнопку

           // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT remove FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then NEON.Button6.Enabled := False; // если пользователь не обладает правами администратора, отключить кнопку

          // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT write FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then NEON.Button5.Enabled := False; // если пользователь не обладает правами администратора, отключить кнопку




          Form1.Hide; // закрытие формы
          NEON.Show;
          NEON.bSQLSearch.Click;

        end else MessageDlg('неправильный логин или пароль ', mtError, mbOk, 0); // сообщение, если пароль неверный
end;

begin
  // Первоначальная проверка, является ли пользователь администратором базы данных
  // если нет, то создается пользователь с логином и паролем администратора 'admin'
     if VarToStr( SQLExecute('SELECT count(id) FROM users WHERE administrator=1;') ) = '0' then
     begin
         SQLExecute('INSERT INTO users (login, password, read, write, remove, search, administrator) VALUES ("admin", "admin", 1, 1, 1, 1, 1);');
         Form1.Edit1.Text := 'admin';
         Form1.Edit2.Text := 'admin';
     end;

     Form1.Edit2.PasswordChar := '*';


end.

Re: Форма ввода профиля и главная форма

Dima.Bekmametov
Пожалуйста приложите свой проект к сообщению (zip файл без exe и dll)

Dmitry.

9 (edited by Dima.Bekmametov 2015-12-10 19:11:48)

Re: Форма ввода профиля и главная форма

DriveSoft wrote:

Dima.Bekmametov
Пожалуйста приложите свой проект к сообщению (zip файл без exe и dll)

как вам сообщить пароль от архива ?

Post's attachments

Attachment icon big1.7z 1.26 mb, 413 downloads since 2015-12-10 

Re: Форма ввода профиля и главная форма

Dima.Bekmametov wrote:

как вам сообщить пароль от архива ?

отправьте его пожалуйста на support@drive-software.com

Dmitry.

Re: Форма ввода профиля и главная форма

DriveSoft wrote:
Dima.Bekmametov wrote:

как вам сообщить пароль от архива ?

отправьте его пожалуйста на support@drive-software.com

отправил ))

Re: Форма ввода профиля и главная форма

Dima.Bekmametov
У вас есть необходимый код, но фактически событие OnClose не создано

procedure NEON_OnClose (Sender: string; Action: string);
begin
    Form1.Close; // ! you want to close main form (frmLogin)
end;

возможно вы его просто скопировали, пожалуйста посмотрите здесь, как правильно создавать событие:
http://myvisualdatabase.com/help_ru/scr … rview.html


вам необходимо зайти на вкладку "События" и двойным кликом на против нужно события создать его.

Dmitry.