Добавление нового пользователя
Реализуем добавление нового пользователя. Сгенерируйте обработчик нажатия на кнопку "Добавить". Код обработчика следующий:
{Нажали "Добавить"}
procedure TfMain.bAddUserClick(Sender: TObject);
begin
//вначале очистим данные, которые могут быть
//в редакторе пользователей:
fEditor.eUser.Text:= '';
fEditor.ePass.Text:= '';
fEditor.ePass2.Text:= '';
fEditor.eName.Text:= '';
fEditor.eMiddle.Text:= '';
fEditor.eLast.Text:= '';
//теперь показываем форму:
fEditor.ShowModal;
//если изменений делать не нужно, просто выходим:
if not Editor.izmen then Exit;
//иначе готовим компонент IBSS к созданию нового пользователя.
IBSS.Active:= True;
try
//теперь вводим данные нового пользователя:
IBSS.UserName:= fEditor.eUser.Text;
IBSS.Password:= fEditor.ePass.Text;
IBSS.FirstName:= fEditor.eName.Text;
IBSS.MiddleName:= fEditor.eMiddle.Text;
IBSS.LastName:= fEditor.eLast.Text;
//вызываем метод AddUser, который добавляет пользователя:
IBSS.AddUser;
finally
IBSS.Active:= False; //закрываем компонент
end; //try
//перечитываем информацию о пользователях:
ReloadUsers;
end;
Поскольку пользователь у нас новый, данных на него пока никаких нет. Значит, вначале мы очистим все Edit на форме редактора, и только потом покажем ее.
Когда администратор закончит работу с формой, и закроет ее, начинает работу следующая строка процедуры:
//если изменений делать не нужно, просто выходим:
if not Editor.izmen then Exit;
То есть, если администратор не нажал кнопку "Подтвердить", мы просто выйдем, ничего не делая. Если же процедура работает дальше, то нужно сохранить нового пользователя:
IBSS.Active:= True;
try
//теперь вводим данные нового пользователя:
IBSS.UserName:= fEditor.eUser.Text;
IBSS.Password:= fEditor.ePass.Text;
IBSS.FirstName:= fEditor.eName.Text;
IBSS.MiddleName:= fEditor.eMiddle.Text;
IBSS.LastName:= fEditor.eLast.Text;
//вызываем метод AddUser, который добавляет пользователя:
IBSS.AddUser;
…
Как видите, при сохранении данных мы используем свойства компонента IBSecurityService UserName (логин), Password (пароль), FirstName (имя), MiddleName (отчество) и LastName (фамилия). Есть еще два свойства, которые мы не использовали, и которые устанавливаются по умолчанию в ноль: UserID (идентификатор пользователя) и GroupID (идентификатор группы), обычно программисты не задействуют эти параметры. Физически новый пользователь добавляется методом AddUser. В заключение процедуры мы отключаем IBSecurityService и вызываем процедуру ReloadUsers для обновления данных.
Сохраните проект, скомпилируйте его и попробуйте добавить нового пользователя. Пользователь должен появиться в окне ListBox, кроме того, он должен быть виден и в утилите IBConsole, в разделе Users дерева серверов.
Редактирование пользователя
Редактирование выбранного пользователя вызывается кнопкой "Редактировать". Сгенерируйте этот обработчик. Вот его код:
{Нажали "Редактировать"}
procedure TfMain.bModifyUserClick(Sender: TObject);
var i: Integer; //счетчик
begin
//если не один пользователь не выбран, просто выходим:
if LB1.ItemIndex = -1 then begin
ShowMessage('Выберите пользователя!');
Exit;
end
//если выбран SYSDBA, тоже выходим:
else if LB1.Items[LB1.ItemIndex] = 'SYSDBA' then begin
ShowMessage('Редактировать пользователя SYSDBA нельзя.');
Exit;
end; //else if
//иначе редактируем
//установим у IBSecurityService выбранного пользователя:
IBSS.Active:= True;
IBSS.UserName:= LB1.Items[LB1.ItemIndex];
//найдем в IBSS индекс нужного пользователя:
for i:= 0 to IBSS.UserInfoCount - 1 do
if IBSS.UserInfo[i].UserName =
LB1.Items[LB1.ItemIndex] then break;
//теперь i содержит индекс пользователя
//заполняем редактор пользователей данными:
fEditor.eUser.Text:= IBSS.UserInfo[i].UserName;;
//раз пользователь уже есть, выводим единички в качестве пароля:
fEditor.ePass.Text:= '11111111111111111111';
fEditor.ePass2.Text:= '11111111111111111111';
fEditor.eName.Text:= IBSS.UserInfo[i].FirstName;
fEditor.eMiddle.Text:= IBSS.UserInfo[i].MiddleName;
fEditor.eLast.Text:= IBSS.UserInfo[i].LastName;
//теперь покажем редактор:
fEditor.ShowModal;
//если изменений делать не нужно, просто выходим:
if not Editor.izmen then Exit;
//иначе сохраняем их:
try
//Имя пользователя менять не будем.
//Сохраним пароль, если там не единички:
if fEditor.ePass.Text <> '11111111111111111111' then
IBSS.Password:= fEditor.ePass.Text;
//Далее сохраняем остальные параметры:
IBSS.FirstName:= fEditor.eName.Text;
IBSS.MiddleName:= fEditor.eMiddle.Text;
IBSS.LastName:= fEditor.eLast.Text;
//сохраняем изменения физически методом ModifyUser:
IBSS.ModifyUser;
finally
IBSS.Active:= False;
end; //try
//перечитываем информацию о пользователях:
ReloadUsers;
end;
Подробно разбирать весь код не будем, так как комментариев достаточно, но остановимся на некоторых моментах. Строка
IBSS.UserName:= LB1.Items[LB1.ItemIndex];
делает в компоненте IBSS текущим пользователем того, который в данный момент выбран в списке ListBox. Затем мы находим индекс этого пользователя в списке. Зачем это нужно? Дело в том, что данные о пользователе можно вытащить только через свойство UserInfo. Другими словами, если мы хотим посмотреть отчество пользователя, то IBSS.MiddleName вернет пустую строку, даже если отчество есть, а IBSS.UserInfo[i].MiddleName вернет отчество. При сохранении отчества нужно напротив, обращаться к IBSS.MiddleName. Физическое изменение данных реализуется методом ModifyUser. Сохраните проект, скомпилируйте его и попробуйте отредактировать какого либо существующего пользователя, например, добавив к нему дополнительные данные (фамилию, имя, отчество). После сохранения результата, в утилите IBConsole должны отобразиться эти данные.
