• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Диалоговое окно: на какое событие повесить обработку?

  • Автор темы Автор темы Rosna
  • Дата начала Дата начала
R

Rosna

Есть диалоговое окно, которое вызывается из формы.

@DialogBox("Window"; [AUTOHORZFIT] : [AUTOVERTFIT] : [NONEWFIELDS]; "Please select")

Нужно не дать человеку назначить меньше 2 и больше 5 элементам списка определенное значение.

Проблема:
На какое событие повесить обработку, которая проверяет сколько элементов списка имет проверяемое значение, чтобы при нажатии ОК проверка проходила, а при нажатии Cancel проверка не делалась?
Если я вешаю на Queryclose, то срабатывает проверка в двух случаях и при OK и при Cancel.
На остальных событиях не срабатывает вообще...

Лотус 7.0.1
 
Попробуйте в Queryclose анализировать свойство Source.DialogBoxCanceled
 
а чем валидатор поля не подходит?
 
Да и получается размазанность кода тонким слоем по полям, вместо централизации в одном месте.
ну это как реализовать :unsure:
я делаю так:
@If(@ThisValue="";
@Failure(errblank+@GetField(@ThisName+"_title"));
@Success)
соответ. errblank - CFD поле с текстом ошибки (о пустом поле)
имена заголовков, для полей, динамически беруться из базы (при открытии формы):
key:=cLocale+"|fld|"+@LeftBack(@ThisName;"_");
v:=@DbLookup("":"ReCache";"":"";intlView;key;cIntl);
@If(@IsError(v);@ThisName;v)

Добавлено: для ситуаций, когда валидатор, в базовом виде, нежелателен (из-за блокировок при рефреше и т.п.), меняеся на:
err:=errblank+@GetField(@ThisName+"_title")+"|"+@ThisName;
@If(@Trim(@ThisValue)="";
@SetField("notValid";@Trim(@Unique(notValid:err)));
@SetField("notValid";@Trim(@Unique(@Replace(notValid;err;""))))
);
@Success
и скрипт при кверисэйв:
Код:
	Dim v As Variant
v=curdoc.GetItemValue({notValid})
'проверка валидности заполнения, для полей, валидация кот. невозможна "налету"
If Isarray(v) Then
Dim s As String
Forall m In v
If m<>"" Then s=s+Chr(10)+Strleft(m,{|})
'Replace(Source.FieldGetText(m+"_title"),":","")
End Forall
If s<>"" Then
Dim title As String
title=curdoc.ParentDatabase.Title
Msgbox Source.FieldGetText({notValid_header}) & s, 48, title
Print "right:"+Strright(v(0),{:})
Source.GotoField(Strright(v(0),{|}))
Exit Sub
End If
End If
 
Ну, сам факт помещения кода проверки в поле, а не в ф-ию валидации, вызываемую на QS, уже является размазыванием кода.
Я понимаю, что можно написать универсальную ф-ию, без хардкодинга имён полей и т.д., но, на мой взгляд, правильный путь - это вызыв ф-ии на QS в котором собраны все проверки.

Открыв эту ф-ию ты сразу видишь, какие поля проверяются, какие условия и т.д.
А открыв форму, у которой проверки натыканы на InputValidation'ы у полей, никакого общего впечатления о том, что тут проверятся - нету.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab