• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

вопрос по Dialgbox

  • Автор темы NeoSimvolist
  • Дата начала
N

NeoSimvolist

В общем, ситуация такая:
- Вызываю диалог:
if ws.DialogBox("dlgCreateUser",True,True,True,False,False,False,"Реквизиты пользователя",dDlgCreateUser,True,True) then
end if
- На форме dlgCreateUser есть две кнопочки с типом "OK", "Cancel".

Я хочу:
Кнопочку типа "OK" сделать типа "Normal".
И хочу написать код на эту кнопочку. Н-р поля на форме заполненные корректно то кнопочка срабатывает как OK, если не корректно заполнены, то кнопка не срабатывает.
Вопрос:
Как в контексте диалога симулировать нажатие OK на LS?
 
N

nayke

if ws.DialogBox("dlgCreateUser",True,True,True,False,False,False,"Реквизиты пользователя",dDlgCreateUser,True,True) then
'код на ОК
end if

Может я вас неправильно понял и вы хотите использовать именно свои кнопки. Но вообще в dialogBox есть стандартные Ок и Cancel, чтобы их отобразить нужно поставить свойство noOkCancel в false при вызове dialogbox.

flag = notesUIWorkspace.DialogBox( form$ , [autoHorzFit] , [autoVertFit] , [noCancel] , [noNewFields] , [noFieldUpdate] , [readOnly] , [title$] , [notesDocument] , [sizeToTable] , [noOkCancel] , [okCancelAtBottom] )

при этом код после нажания ОК необходимо описывать между if и then.
 
N

NeoSimvolist

нет. Я нарочно скрыл стандартные кнопки. Мне нужно именно то что я написал.
Например в Delphi можно форме вернуть ModalResult = mrOK.
Можно ли на LS сделать также?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
нет. Я нарочно скрыл стандартные кнопки. Мне нужно именно то что я написал.
Например в Delphi можно форме вернуть ModalResult = mrOK.
Можно ли на LS сделать также?
Не знаю.. я пользуюсь стандартными кнопками DialogBox'a
И весь нужный код пишу в событиях формы или после вызова диалога.
Причем диалог можно вызвать только с кнопкой Ok. Делов-то
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Чтобы кнопочка типа "Normal" сработала как кнопочка типа "ОK" и DialogBox вернул True нужно сделать notesUIWorkspace.RefreshParentNote.
Хотя не понятно, почему не поставить кнопке тип "OK".
 

Kizarek86

Green Team
20.07.2007
871
7
BIT
37
при чем здесь notesUIWorkspace.RefreshParentNote
<_<
Я думаю имелось ввиду Source.DialogBoxCanceled

Код:
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
If Not Source.DialogBoxCanceled Then Continue = QSCorrect_DIALOG(Source.Document)
End Sub

В функции QSCorrect_DIALOG делай проверку на корректность заполнения формы)
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Добрый день.

Дабы не плодить тем, спрошу тут:
есть ли у dialoxbox`a еще свойства, кроме DIALOGBOXCANCELED?

мне нужно, чтобы моя кнопка в dialogbox`e отрабатывала как ОК, Ок и Cancel я скрыл, и чтобы крестиком его закрыть тоже нельзя было. На кнопке висит такой код:
@SetEnvironment("ClientType"; "Зарплатный клиент");
FIELD ClientType:="Зарплатный клиент";
@Command( [RefreshParentNote]);
@Command([FileCloseWindow])

На Queryclose поставил заглушку:
Код:
	If source.DIALOGBOXCANCELED Then
Continue=False
End If
В итоге получается, что нажатие моей кнопки отрабатывает как cancel, а dialogbox обязательно надо зыкрыть. Подскажите, может его модно закрыть как то по другому?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
На моей кнопке "ОК" висит только:
@Command([RefreshParentNote]);
@Command([FileCloseWindow])

DialogBox при этом возвращает True.

вызов на LS делаю:
Код:
	res = ws.DialogBox(tmpDoc.GetItemValue("Form")(0),True,True,True,False,False,False,"Выберите сотрудников",tmpDoc,True,True)
If Not res Then Goto endh
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Т.е. Ок и Cancel/крестик должны выполнять одно и то же?
В параметрах вызова диалогбокса можно оставить одну кнопку и весь код написать на Queryclose.
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
а кроме @Command([FileCloseWindow]), еще как то можно закрыть dialoxbox?

Добавлено:
На моей кнопке "ОК" висит только:
@Command([RefreshParentNote]);
@Command([FileCloseWindow])

DialogBox при этом возвращает True.

вызов на LS делаю:
Код:
	res = ws.DialogBox(tmpDoc.GetItemValue("Form")(0),True,True,True,False,False,False,"Выберите сотрудников",tmpDoc,True,True)
If Not res Then Goto endh
Сейчас сделал так:
На кнопке:
FIELD ClientType:="Зарплатный клиент";
@Command( [RefreshParentNote]);
@Command([FileCloseWindow])
На Queryclose:
Код:
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
If source.DIALOGBOXCANCELED Then
Messagebox("Сработало как отмена!")
'Continue=False
End If 
End Sub
каждый раз моя кнопка почему то отрабатывает как Cancel. :mellow:
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Eugen
Не валяйте дурака, укажите в параметрах диалога отображать стандартную кнопку Ok, а на QC диалога:
<!--shcode--><pre><code class='ls'>Sub Queryclose(Source As Notesuidocument, Continue As Variant)
If Source.DialogboxCanceled Then
Continue = False
Exit Sub
End If

'Ваш код, который должен срабатывать по Ok
Const IN_CLIENTTYPE = "ClientType"
Const IV_CLIENTTYPE = "Зарплатный клиент"

Dim ns As New NotesSession
Call ns.SetEnvironmentVar(IN_CLIENTTYPE, IV_CLIENTTYPE)

Call Source.Document.ReplaceItemValue(IN_CLIENTTYPE, IV_CLIENTTYPE)

'правда зачем эта ерунда нужна непонятно
Dim nuiws As New NotesUIWorkspace
Call nuiws.RefreshParentNote()
End Sub[/CODE]Код запишет переменную в notes.ini и поле "ClientType" в tmpDoc вызывающего скрипта.
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Сделал по другому:
Код:
Sub Queryclose(Source As Notesuidocument, Continue As Variant)
If source.document.ClientType(0)="" Then
If source.DIALOGBOXCANCELED Then
Messagebox("Укажите тип клиента!")
continue=False
End If  
End If
End Sub
 
B

beloff

так то же самое можно было прописать и в коде на dialogbox

step1:
flag = dialogbox ..
if flag = false then exit sub нажат канцел

потом проверку уже в документе утсроить если какое то поле не заполнено goto step1

или я чего то недопонял?
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Я это и сделал на форме, которая подкладывается в dialogbox
 
A

Anonimous

Также, чтоб не плодить тем. Кто обновлялся до версии Лотуса 8.5.3 ?
У меня вот тоже вопрос по dialogbox, но несколько другого рода.
В документе есть кнопка, которая вызывает dialogbox заданной формы. В диалоге Чекбоксы, значения которых добавляются из значений поля основной формы. Мы должны выбрать в диалоге одно или несколько значений, чтоб создать новый документ в другой базе и вставить их в него
Код кнопки

Dim session As New NotesSession
Dim ws As New NotesUIWorkspace

'БД, в которой создадим новый документ на основе значений, выбираемых в диалоге
Dim eval As Variant
eval = Evaluate({v := @DbLookup ("":"" ; @Environment("INTSwitch" + "S":"F");"DBLookup";"INTIncomingAccounts";"Address"); @If(@IsError(v); ""; v);})
If eval(1) = "" Then Msgbox {Список недоступен.}: Exit Sub
Set dbIncomingAccount = session.GetDatabase(eval(0), eval(1))


' Документ диалога
Dim docTemp As NotesDocument

Set docTemp = session.CurrentDatabase.CreateDocument

' Берем поле NameMTR из основной формы, которое имеет множественное значение. Импортируем его значения в поле Results диалога, типа Checkbox - для выбора в нем значений и создания нового документа

docTemp.ReplaceItemValue "NameMTR", docCur.GetItemValue("NameMTR")

If ws.DialogBox("DialogChooseComp",True ,True ,, , , , "", docTemp, True, , True) Then

'Если в диалоге не нажали Cancel, создаем новый документ в другой БД
Dim docIncomingAccount As New NotesDocument (dbIncomingAccount)

With docIncomingAccount
.ReplaceItemValue "Form", "IncomingAccount"
...
.ReplaceItemValue "NameMTR", docTemp.GetItemValue("SelectMTR")

End With

ws.CurrentDocument.Save

ws.CurrentDocument.Close True
'Конец - Открываем на редактирование созданный документ, в котором будут значения, выбранные в диалоге
'-----------------------------------------------------------------------------------------------------------------------------
ws.EditDocument True, docIncomingAccount
End If

End Sub

В самом диалоге поле только одно - чекбокс Results , в котором выбираем значения. Используем для них формулу

@Word(NameMTR;"|";2), где значения NameMTR мы добавили из основной формы при вызове диалога

В событии QueryClose диалога код такой

If Source.DialogboxCanceled Then Exit Sub
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim docCur As NotesDocument
Set docCur=ws.CurrentDocument.Document
If docCur.GetItemValue("Results")(0)="" Then
Msgbox {Пожалуйста, выберите хотя бы одно значение.}
Continue=False
End If

vNameMTR = Evaluate({@Trim(Results)},docCur)


docCur.ReplaceItemValue "SelectMTR", Fulltrim(vNameMTR)

End Sub

Далее открывается созданный новый документ с выбранными значениями.
В версии 8.5.2 было все нормально. А вот в версии 8.5.3 открываю этот диалог, выбираю некоторые значения - а в созданном документе они все отображаются!
С помощью msgbox-в понял, что при закрытии диалога событие QueryClose формы диалога не срабатывает, как и событие ее поля onChange (я пихал код туда). События диалоговой формы вообще не срабатывают! У кого-то бывал такой глюк? Заранее спасибо
 
Мы в соцсетях:

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