Технические вопросы
Разработка

Перевод формы в ReadOnly

Добрый день!
Подскажите пожалуйста как лучше запретить пользователю редактирование данных на форме.
Пока я сделал следующим образом:
в событии onPrepare формы
wnd_BaseDBEditOnPrepare(Window);
if (dlData.Dataset.IsActive) {
if (dlData.Dataset.State == dstEdit) {
if (dlData.Dataset('HasRight') != 1) {
SwitchControlForm(Window,false);}
else {SwitchControlForm(Window,true);}
}
}
function SwitchControlForm(Window,Enable) {
for (var i = 0; i Window.ComponentCount; i++) {
var DataField = Window.Components(i).DataField;
if((!IsUndefined(DataField)) || (Window.Components(i).Name == 'btnOK')) {
Window.Components(i).IsEnabled = Enable;
/*if (Window.Components(i).Name == 'btnOK') {
Window.Components(i).IsEnabled = Enable;}
else
{DataField.IsReadOnly = !Enable;}*/
}
}
}

Но смущает что при открытии формы происходит явное мигание, т.е. вероятнее всего сначала отрисовывается форма с закрытыми на редактирование контролами, потом открываются контролы по доступу, а уже потом я их вновь закрываю. Причем, что Window.Components(i).IsEnabled = Enable; что DataField.IsReadOnly = !Enable это явно видно. Такое ощущение что можно сделать и по другому.

Нравится

15 комментариев

Александр, а если использовать функции

Window.BeginUpdate();

и

Window.EndUpdate();

Первую до начала перерисовки, вторую — после. Можно даже попробовать первую до вызова wnd_BaseDBEditOnPrepare, но не уверен, что заработает без ошибок.

Включить администрирование на таблице, в настройках администрирования запретить редактировать.
У Components есть Components на сколько помню. Нужно вызывать рекурсивную функцию, проныривающую на всю глубину. Впрочем если верхний эллемент заблокирован наверное и все остальное заблокируеться.

Александр, если приведенные выше рекомендации не помогут - обращайтесь.
Хорошего вечера!

Александр, использование Window.BeginUpdate(); практически не помог, я во всяком случае на глаз разницы не заметил.
Борис, включить администрирование по записям в данном случае не вариант, т.к. идет логическая проверка на основании неких условий, имеет или нет пользователь доступ к данной записи.
Коллеги, а где вообще происходит проверка и закрытие формы по доступу? Я рылся, по wnd_BaseDBEdit, но так и не нашел.

Не вижу смысла все ставить в readonly. Может просто блокировать всю форму?
Не знаю, как у вас там называются, например, у контрагентов будет так:

function SwitchControlForm(Window,Enable) {
     frmMain.IsEnabled = Enable;
     btnOK.IsEnabled = Enable;
}

Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}

"Крупский Александр" написал:

Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}


Сталиквался с тем, что есть есть код который передергивает это свойство для всех эллементов(скорей всего механизм администрирования). Так что xxxxxx.IsEnabled = false; писал в событие Show и все работало, а вот в Prepare ничего не работало.

Не понял, вы пытаетесь все окно закрыть?
У нас есть окно, в нем область данных и область кнопок, в области данных, есть страницы, в страницах есть форма. Вот ее уже надо блокировать. Ну если я не так вас понял, извините. Но от моргания думаю все равно не уйти.

Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}

Каким то ведь образом происходит закрытие формы при отсутствии доступа. Мне бы посмотреть на этот механизм, вот только найти его не могу.

"Крупский Александр" написал:

Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}


function wnd_IncidentEditOnShow(Window) {
if (Pages.ActivePage != pgIncident) {
Pages.ActivePage = pgIncident;
}
debugger;
wnd_IncidentEdit.IsEnabled=false;

}
wnd_IncidentEdit - отлично блокируется, кнопки Ок, Отмена становятся неактивными. Может после события OnShow у вас еще что то выполняйтся? (сборка 3.4.0)

Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))

"Крупский Александр" написал:

Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))


Значит, что то не так в начальном коде. Обновляйтесь или отсылайте дамп тестовой базы на припарирование. У меня например есть scr_SelectDataWithGroupUtils.xml трех версий от 3.4.0, код везде разный, последняя версия работает отлично, самая старая почти не работает.

Александр, направьте, пожалуйста, в Службу технической поддержки резервную копию БД для рассмотрения проблемы.

Показать все комментарии