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

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

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

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

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

Проверка на заполнение Richtext поля

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

Стояла задача - проверить на заполнение RichText (будь оно проклято) поля ещё до сохранения документа. Мне удалось найти функцию одного умного человека, которая кое-как решала эту задачу
Function IsRTFEmpty(rtfield As String) As Integer
'This function tests a Rich Text field to see whether or not it is null. It returns TRUE if the field is null, and returns FALSE if the field is not null. It works even if the rich
'text field contains a file attachment, doclink, or OLE object but does not contain any text.

On Error Goto Errhandle
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.ExpandAllSections
'This is only needed if your field is in a section that may be closed when this executes
Call uidoc.GotoField(rtfield)
Call uidoc.SelectAll

'The next line will generate a 4407 error message if the Rich Text Field is null

Call uidoc.DeselectAll
IsRTFEmpty = False
Exit Function

Errhandle:
Print Erl
Select Case Err
Case 4407
'the DeselectAll line generated an error message, indicating that the rich text field does not contain anything
If rtfield <> "" Then
Call uidoc.GotoField(rtfield)
End If
IsRTFEmpty = True
Exit Function
Case Else
'For any other error, force the same error to cause LotusScript to do the error handling
Error Err
End Select
Exit Function
End Function
Вот тут-то и началось самое интересное. При обычной проверке все Ок. Ошибки посыпались, если изменить документ а потом выходить из него, кликая на внедренное представление в другом фрейме, которое открывало новый документ в том фрейме, в котором находился проверяемый документ. О как =) Так вот, изменяю, кликаю, вылетает сообщение, что надобы сохраниться, сохраняюсь (в момент сохранения происходит проверка) и бах - ошибка. Посидел, поискал. Оказалось, что в момент сохранения workspace.CurrentDocument возвращает уже не наш документ, а документ, который хранится в фрейме внедренного представления. Поплевался. Проверил, делать проверку на queryClose формы - тот же результат. Ладно, передаю в функцию проверки UIDoc, теперь проверяем тот документ, который нужно. НО ОПЯТЬ ОШИБКА! В строке Call uidoc.SelectAll.
Сейчас начинается то, что вообще нельзя понять - если курсор стоит в проверяемом поле, то ошибка (если он стоит в другом поле, то все ок), если же в проверяемом поле выделить небольшую часть текста, то ошибки нет

Вот такой бестолковый я либо поганый УИ лотуса
 
O

Omh

Для: Medevic и fedotxxl :)

NotesUIDocument.Refresh(True) рулит.

UI объекты даже рядом не стоят: какое-то дибильное шастанье по полям, попытка пометить всё.
Тьфу, кака.
 
F

fedotxxl

Вроде решил проблему...
Function IsRTFEmpty(ndCurrent As NotesDocument, rtfield As String) As Boolean
On Error Goto ErrorLab
IsRTFEmpty = True

Dim rti As NotesRichTextItem
Set rti = ndCurrent.GetFirstItem(rtfield)

If Not rti Is Nothing Then
If Trim(rti.GetUnformattedText) <> "" Then IsRTFEmpty = False
End If
Exit Function


ErrorLab:
Msgbox "Error #" + Cstr(Err) + " in " + Cstr(Getthreadinfo(1)) + "(" + Cstr(Erl) + ") : " + Error, 48, "Ошибка исполнения"
Print "Error #" + Cstr(Err) + " in " + Cstr(Getthreadinfo(1)) + "(" + Cstr(Erl) + ") : " + Error
Exit Function
End Function
Перед проверкой следующий код:
If source.EditMode Then
'Обновляем документ т.к. есть RTI
Call source.Refresh(True)
End If

Set ndCurrent = source.Document
, где Source = NotesUIDocument

Для: Medevic
Для: Omh
Решил сам, ваши посты не видел =)
Но кто-то же написал такую функцию... и поведение у неё веселое, однако
 
O

Omh

<!--QuoteBegin-fedotxxl+15:02:2008, 16:22 -->
<span class="vbquote">(fedotxxl @ 15:02:2008, 16:22 )</span><!--QuoteEBegin-->пересохраняет документ
[snapback]98331" rel="nofollow" target="_blank[/snapback]​
[/quote]
Поведение не подтверждено :)
 
F

fedotxxl

Млин, ненавижу дни рандомайзных ошибок
Вот такой код в форме (помимо всего прочего)
Sub Querysave(Source As Notesuidocument, Continue As Variant)
If Source.EditMode Then
Call Source.Refresh(True)
End If
Continue = False
End Sub
Документ пересохраняется. Точно также сделал в тестовой базе - все нормально работает
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Забавная проверка...
<!--QuoteBegin-fedotxxl+15:02:2008, 17:45 -->
<span class="vbquote">(fedotxxl @ 15:02:2008, 17:45 )</span><!--QuoteEBegin-->If source.EditMode Then
[snapback]98340" rel="nofollow" target="_blank[/snapback]​
[/quote]


Для события QuerySave.
 
O

Omh

Для: fedotxxl
Смотри, что на QueryRecalc/PostRecalc
 
F

fedotxxl

Гыгы
Я Lotus так *цензура*ал, что он теперь при октрытии моей тестовой формы пишет "Not a form"
Как меня **** эта среда

Забавная проверка...
Для события QuerySave.
Туплю... хотя лишняя проверка никогда не помешает =)

ВОТ ОНО! SaveOptions = "1" + uidoc.Refresh(true) = Save
Как же долго я вычислял, почему происходит сохранение

Где бы про SaveOptions побольше почитать можно?
 
K

Kee_Keekkenen

SaveOptions = "0" не сохраняет и не спрашивает, если док был отредактирован при сохранении/выходе из дока
 
F

fedotxxl

Для: Kee_Keekkenen
А SaveOptions = "00"? Нужно бы больше инфы
 
Мы в соцсетях:

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