Шаг 7.3 - Изменение контекстного меню.
Дважды щелкние по компоненту puab (TPopupActionBar) мышкой, на экран загрузится редактор меню (см. рис. 7.3):
Рис. 7.3.
Создайте три пункта меню с двумя разделителями и настройте в инспекторе свойств некоторые свойства пунктов следующим образом:
TMenuItem - Разделитель.
Свойство |
Значение |
Комментарий |
Action |
... |
Действие (TAction), соответствующее данному пункту меню, оставьте пустым. |
Caption |
- |
Символ "-" означает разделитель. |
TMenuItem - Администрирование.
Свойство |
Значение |
Комментарий |
Action |
AdminObj |
Действие (TAction), соответствующее данному пункту меню. |
ShortCut |
Ctrl+A |
"Горячая клавиша", соответствующая данному пункту меню. |
TMenuItem - Автор-создатель.
Свойство |
Значение |
Комментарий |
Action |
AuthorObj |
Действие (TAction), соответствующее данному пункту меню. |
ShortCut |
Ctrl+U |
"Горячая клавиша", соответствующая данному пункту меню. |
TMenuItem - Разделитель.
Свойство |
Значение |
Комментарий |
Action |
... |
Действие (TAction), соответствующее данному пункту меню, оставьте пустым. |
Caption |
- |
Символ "-" означает разделитель. |
TMenuItem - Изменить состояние.
Свойство |
Значение |
Комментарий |
Action |
ShangeState |
Действие (TAction), соответствующее данному пункту меню. |
ShortCut |
Ctrl+S |
"Горячая клавиша", соответствующая данному пункту меню. |
Теперь внесем изменения в правила управления видимостью некоторых пунктов меню. Для этого встаньте на компонент puab - TPopupActionBar, в инспекторе свойств перейдите на закладку Events и откройте процедуру для события OnPopup. Усложним процедуру puabPopup и внесем в нее следующие изменения:
procedure TfmLibOKP.puabPopup(Sender: TObject);
var
inAcc, inLock: byte;
begin
inherited;
Self.InsLib.Enabled:=Self.vltv.boInsDel;
// проверим возможность редактирования таблицы
// public свойство boInsDel таблицы заполняется по умолчанию при регенерации таблицы
if Self.vltv.IsEmpty then
begin
// если таблица пуста перечисленные ниже действия отключить
Self.OpLib.Enabled:=False;
Self.DelLib.Enabled:=False;
Self.AdminObj.Enabled:=False;
Self.AuthorObj.Enabled:=False;
Self.ChangeState.Enabled:=False;
end
else
begin
// если таблица не пуста
inAcc:=Self.vltv.cdsTV.FieldByName('_ACCESSLEVEL').AsInteger;
inLock:=Self.vltv.cdsTV.FieldByName('_LOCKED').AsInteger;
// получим из таблицы значения уровней доступа и блокировок
// к выделенному объекту базы данных
Self.OpLib.Enabled:=True;
// включить процедуру редактирования выделенного объекта
// проверка уровня доступа и блокировки к выделенному объекту
// будут производиться в вызванной для редактирования форме
Self.DelLib.Enabled:=Self.vltv.boInsDel;
// проверить возможность удаления выделенного объекта
Self.AuthorObj.Enabled:=True;
// включить процедуру просмотра информации об авторе-создателе выделенного объекта
if ((inAcc>1) and (inLock<2)) then Self.ChangeState.Enabled:=True
else Self.ChangeState.Enabled:=False;
// если уровень доступа и блокировки к выделенному объекту
// позволяют его редактировать, включить процедуру изменения состояния,
// если нет - выключить процедуру
if ((inAcc=3) and (inLock<2)) then Self.AdminObj.Enabled:=True
else Self.AdminObj.Enabled:=False;
// если уровень доступа к выделенному объекту - администрирование
// и он не заблокирован "чужим" пользователем, включить процедуру администирования,
// если нет - выключить процедуру
end;
end;
Далее...