• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

Rosna

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

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

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

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

Лотус 7.0.1
 
N

nvyush

Попробуйте в Queryclose анализировать свойство Source.DialogBoxCanceled
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
а чем валидатор поля не подходит?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
Да и получается размазанность кода тонким слоем по полям, вместо централизации в одном месте.
ну это как реализовать :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
 
O

Omh

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!