1 (edited by savage 2014-09-30 09:24:04)

Topic: [Решено] Автоввод login из формы входа в ComboBox на Form1

День добрый.

Столкнулся с такой проблемой:
1. есть стандартная форма входа через логирование пользователя
2. есть основная форма, содержащая 2 однотипных вкладки
3. хочу:
  3.1 чтобы информация с поля логина формы входа после прохождения авторизации автоматически попадала в combobox на одной из вкладок основной формы
  3.2 происходила автоматическая блокировка данного combobox от случайного редактирования

Собственно, проблема -  не получается п. 3.1


Реализация - см. код скрипта + прилагаю проект

var
   sUser: string = '';  idUser: integer;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// вход в программу                //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure frmLogin_OnShow (Sender: string; Action: string);
begin
     if VarToStr( SQLExecute('SELECT count(id) FROM users WHERE admin=1;') ) = '0' then
     begin
         ShowMessage('Пользователя с правами Администратора не найдено, поэтому он будет создан автоматически, с логином admin и паролем admin');
         SQLExecute('INSERT INTO users (login, password, admin) VALUES ("admin", "admin", 1);');
         UpdateDatabase('users');
         frmLogin.cbUser.dbItemID:= Last_Insert_id('users');
         frmLogin.edLogin.Text:= 'admin';
    end else
           frmLogin.cbUser.dbItemID:= 1;
end;


// событие закрытия окна для авторизации
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     // если пользотель не был определен, а пользователь закрыл окно авторизации, то и закрываем главную форму
   if sUser='' then Form1.Close;
end;


// событие при нажатии на кнопку Вход
procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // делаем SQL запрос, для проверки, есть ли такой пользователь в базе
     s := VarToStr( SQLExecute('SELECT count(id) FROM users WHERE (login = ''' + frmLogin.cbUser.Text + ''') AND (password = ''' + frmLogin.edLogin.Text + ''');') );
     if s <> '0' then    // если результат не равен нулю, значит пользователь есть с таким логином и паролем
      begin
         sUser := frmLogin.cbUser.Text; // запоминаем имя пользователя
         idUser := frmLogin.cbUser.dbItemID;  //запомнинаем id пользователя
          // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT admin FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then
            begin
               //Form1.bDicts.Enabled := False; // запрещаем нажимать кнопку для создания других пользователей
               //Form1.ButNewBook.Enabled := False;
               //Form1.ButDelBook.Enabled := False;
               //NewTask.BtTaskOk.Enabled := False;
               //NewTask.BtSubTaskNew.Enabled := False;
               //NewTask.BtEditSubTask.Enabled := False;
               //NewTask.BtDelSubTask.Enabled := False;
            end;
         frmLogin.Close; // закрываем форму авторизации
     end else MessageDlg('Неверный пароль', mtError, mbOk, 0); // сообщение если пароль неверный
end;



 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////// работа с Form1                 //////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure Form1_OnShow (Sender: string; Action: string);

begin

  Form1.ComboBox21.dbItemID :=idUser; // автоматически присваивание юзера и фильтр на основе него
  Form1.ComboBox21.Enabled := False; // блокировка юзера от возможности выбора другого

  frmLogin.bLogin.Default := True; // необходимо, чтобы кнопка Button1 автоматически нажималась при нажатии на Enter в Edit1 или Edit2
  frmLogin.edLogin.PasswordChar := '*';//Скрытие значения в строке пароля
  frmLogin.ShowModal; // показываем окно для авторизации

end;




//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////                    работа с формой NewUser          ///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////


////////добавление нового User - защита от дублирования логина и пустышки на месте логина и пароля

procedure NewUser_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
      // защита от пустых полей
      if (NewUser.Edit1.Text='') OR (NewUser.Edit2.Text='') then
            begin
              ShowMessage('Заполните обязательные поля "Пользователь" и "Пароль"!');
              Cancel := True; // отменяем действие кнопки
            end else
              // защита от дублирования поля
              if StrToInt(VarToStr(SQLExecute ('SELECT count(*) from users WHERE login="' + NewUser.Edit1.Text + '"'))) > 0 then
                 begin
                    ShowMessage('Такой Пользователь уже есть!');
                    Cancel := True;
                 end;
end;

////////////////////// переключение прав доступа ///////////////////////////////////

procedure NewUser_CheckBox1_OnClick (Sender: string);
begin
  NewUser.CheckBox2.Checked:= False;

end;

procedure NewUser_CheckBox2_OnClick (Sender: string);
begin
  NewUser.CheckBox1.Checked:= False;

end;



////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
begin
end.
Post's attachments

Attachment icon Test.zip 326.79 kb, 496 downloads since 2014-09-30 

Re: [Решено] Автоввод login из формы входа в ComboBox на Form1

есть предположение, что форма логина открывается все-таки через Form1 и idUser тупо еще равен 0...
Вопрос - как с этим бороться?

Re: [Решено] Автоввод login из формы входа в ComboBox на Form1

Решил через перенесение кода 

Form1.ComboBox21.dbItemID :=idUser; // автоматически присваивание юзера и фильтр на основе него

в процедуру

/ событие закрытия окна для авторизации
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     // если пользотель не был определен, а пользователь закрыл окно авторизации, то и закрываем главную форму
   if sUser='' then Form1.Close;
end;

новый вид кода:

var
   sUser: string = '';  idUser: integer;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// вход в программу                //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure frmLogin_OnShow (Sender: string; Action: string);
begin
     if VarToStr( SQLExecute('SELECT count(id) FROM users WHERE admin=1;') ) = '0' then
     begin
         ShowMessage('Пользователя с правами Администратора не найдено, поэтому он будет создан автоматически, с логином admin и паролем admin');
         SQLExecute('INSERT INTO users (login, password, admin) VALUES ("admin", "admin", 1);');
         UpdateDatabase('users');
         frmLogin.cbUser.dbItemID:= Last_Insert_id('users');
         frmLogin.edLogin.Text:= 'admin';
    end else
           frmLogin.cbUser.dbItemID:= 1;

end;


// событие закрытия окна для авторизации
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
      Form1.ComboBox21.dbItemID :=idUser; // автоматически присваивание юзера и фильтр на основе него
     // если пользователь не был определен, а пользователь закрыл окно авторизации, то и закрываем главную форму
   if sUser='' then Form1.Close;
end;


// событие при нажатии на кнопку Вход
procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // делаем SQL запрос, для проверки, есть ли такой пользователь в базе
     s := VarToStr( SQLExecute('SELECT count(id) FROM users WHERE (login = ''' + frmLogin.cbUser.Text + ''') AND (password = ''' + frmLogin.edLogin.Text + ''');') );
     if s <> '0' then    // если результат не равен нулю, значит пользователь есть с таким логином и паролем
      begin
         sUser := frmLogin.cbUser.Text; // запоминаем имя пользователя
         idUser := frmLogin.cbUser.dbItemID;  //запомнинаем id пользователя

          // проверка прав администратора
          s := VarToStr( SQLExecute('SELECT admin FROM users WHERE (login = ''' + sUser + ''');') );
          if s='0' then
            begin
               //Form1.bDicts.Enabled := False; // запрещаем нажимать кнопку для создания других пользователей
               //Form1.ButNewBook.Enabled := False;
               //Form1.ButDelBook.Enabled := False;
               //NewTask.BtTaskOk.Enabled := False;
               //NewTask.BtSubTaskNew.Enabled := False;
               //NewTask.BtEditSubTask.Enabled := False;
               //NewTask.BtDelSubTask.Enabled := False;
            end;

         frmLogin.Close; // закрываем форму авторизации
     end else MessageDlg('Неверный пароль', mtError, mbOk, 0); // сообщение если пароль неверный
end;



 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////// работа с Form1                 //////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure Form1_OnShow (Sender: string; Action: string);

begin


  Form1.ComboBox21.Enabled := False; // блокировка юзера от возможности выбора другого

  frmLogin.bLogin.Default := True; // необходимо, чтобы кнопка Button1 автоматически нажималась при нажатии на Enter в Edit1 или Edit2
  frmLogin.edLogin.PasswordChar := '*';//Скрытие значения в строке пароля
  frmLogin.ShowModal; // показываем окно для авторизации

end;




//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////                    работа с формой NewUser          ///////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////


////////добавление нового User - защита от дублирования логина и пустышки на месте логина и пароля

procedure NewUser_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
      // защита от пустых полей
      if (NewUser.Edit1.Text='') OR (NewUser.Edit2.Text='') then
            begin
              ShowMessage('Заполните обязательные поля "Пользователь" и "Пароль"!');
              Cancel := True; // отменяем действие кнопки
            end else
              // защита от дублирования поля
              if StrToInt(VarToStr(SQLExecute ('SELECT count(*) from users WHERE login="' + NewUser.Edit1.Text + '"'))) > 0 then
                 begin
                    ShowMessage('Такой Пользователь уже есть!');
                    Cancel := True;
                 end;
end;

////////////////////// переключение прав доступа ///////////////////////////////////

procedure NewUser_CheckBox1_OnClick (Sender: string);
begin
  NewUser.CheckBox2.Checked:= False;

end;

procedure NewUser_CheckBox2_OnClick (Sender: string);
begin
  NewUser.CheckBox1.Checked:= False;

end;



////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
begin
end.

Не уверен, что это самое лучшее решение. Если не сложно, DriveSoft, посмотрите, плиз.

Re: [Решено] Автоввод login из формы входа в ComboBox на Form1

Все верно )

Dmitry.