Rt навигатор глюки

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
получаю малевича на строке Remove
не умею я с ним работать :)
смысл кода - замена тегированного текста в РТ
Код:
Function ReplaceTemplate(xDoc As NotesDocument, rtitem As NotesRichTextItem)
On Error Goto ErrorHandler
Dim rtrange As NotesRichTextRange
Dim rtnav As NotesRichTextNavigator
Dim s As String

Set rtnav=rtitem.CreateNavigator()

While rtnav.FindFirstString("${")
Set rtrange=rtitem.CreateRange()		
Call rtrange.SetBegin(rtnav)
If rtnav.FindFirstString("}") Then
rtnav.SetPositionAtEnd(rtnav)
rtrange.SetEnd(rtnav)
s=rtrange.TextParagraph
s=Strleft(s,"}")
s=Strright(s,"${")
Call rtrange.Remove()
s=xDoc.GetItemValue(s)(0)
rtitem.BeginInsert(rtnav)
rtitem.AppendText(s)
Call rtitem.EndInsert
Call rtitem.Compact
Call rtitem.Update
Set rtrange=rtitem.CreateRange()
Set rtnav=rtitem.CreateNavigator()
End If
Wend
ExitFunction:
Exit Function
ErrorHandler:
Call RaiseError()
Resume ExitFunction
End Function
 
O

Omh

Дорогой друг, почему не используешь rtRange.FindAndReplace?

Как-то так:
Код:
Dim rtNav As NotesRichTextNavigator
Set rtNav = Body.CreateNavigator
Call rtNav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)

Dim rtRange As NotesRichTextRange
Set rtRange = Body.CreateRange

While rtRange.FindAndReplace(ReplaceFrom, ReplaceTo, RT_FIND_CASEINSENSITIVE) > 0
Call Body.Update
Wend
Я делал несколько функциональностей с заменой тегов в RT и с FindAndReplace пробем не было.

А приведённый код действительно чутка стрёмный :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
дело в том, что название и кол-во полей (в доке) заранее неизвестно...
а rtitem - из набора шаблонов и подстановка осущ. в ходе их заюзывания под конкретный док (поля могут и отсутствовать)
с т.з. логики - всё нормально выглядит, а тот факт, что "криворучки" не смогли классы по-человечьи написать, удручает
но беде не в этом, а в том, что нет нормального описания - как с этим глюкалом работать
я опиралься на этот код
и версия нотусов - 7.03
 
O

Omh

Ща опишу, как я делал (правда, это было несколько лет назад ужо), может тебе чем-то поможет:

1. Берёшь шаблонный richtext (c тегами)
2. Берешь от него текст и вычитываешь теги (у меня это были @формулы)
3. Вычисляешь теги (у меня это был просто evaluate в нужном документе)

На выходе, допустим, мы имеем list of strings вида
Код:
TagsData(<TAG_1>) = <TAG_VALUE_1>
TagsData(<TAG_2>) = <TAG_VALUE_2>
Пробегаемя по list'u науськивая на target richtext FindAndReplace.
Вроде всё.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
спасибо
походу придется подобное и делать...
очередной жирный минус "индусам", писавшим код "навигатора" :)
и очередная зарубка - не юзать эти глюкоклассы
 
O

Omh

Там Малевича получить проще простого.
Но если юзать аккуратно, то всё работает почти как часы.
Я бы не был столь категоричен: когда-то на RT классах схавал если не пуд соли, то предостаточно :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
эх... времени не хватает, вот собирусь... ;)
чем ходить по граблям - проще ДХЛ заюзать, но там есть несколько особенностей (кот., возможно, не решены и в этих классах):
текст параграфа и текст-ран
формально - искать в ДХЛ можно ежели стиль строки поиска - "неразрывный", в противном случае, возникает текс-ран, кот. "рвет" текст тегами и обработка усложняется
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
может я чё сослепу не увидел, но очередная глюковина...
делаем две ф-ции , выполнение последней, иногда!, "мусорит" перед последней "заменой"
строка в РТ такая:
Уважаемые господа,
Информируем вас о том, что ${dateOut} в адрес ${SendToGrp} было отправлено информационное письмо ${subjectOut}.
Письмо см.во вложении.

Письмо зарегистрировано в системе Lotus Notes по ссылке

ф-ции такие:
Код:
Function GetTemplateFields(rtitem As NotesRichTextItem, xFields List As String)
On Error Goto ErrorHandler
Dim s As String
s=rtitem.GetUnformattedText()
Erase xFields
Dim v As Variant
v=Split(s,"${")
Dim i As Integer
For i=Lbound(v) To Ubound(v)
xFields(Strleft(v(i),"}"))=""
Next
ExitFunction:
Exit Function
ErrorHandler:
Call RaiseError()
Resume ExitFunction
End Function

Function ReplaceTemplate(xDoc As NotesDocument, rtitem As NotesRichTextItem)
On Error Goto ErrorHandler
Dim rtrange As NotesRichTextRange
Dim rtnav As NotesRichTextNavigator
Dim search As String, search1 As String
Dim latch As Boolean
Dim s As String, f As String

Set rtnav=rtitem.CreateNavigator()
Set rtrange=rtitem.CreateRange()
search="${"
search1="}"
Dim fields List As String
Call GetTemplateFields(rtitem, fields)
Forall e In fields
s=Listtag(e)
If s<>"" Then
f=Cstr(xDoc.GetItemValue(s)(0))
If f <> "" Then
Call rtrange.FindandReplace(search+s+search1, f, RT_FIND_CASEINSENSITIVE+RT_REPL_ALL)
End If
End If
End Forall
'	Call rtitem.Compact	
Call rtitem.Update
ExitFunction:
Exit Function
ErrorHandler:
Call RaiseError()
Resume ExitFunction
End Function
 
H

hosm

это у Вас просто опечатка в шаблоне, что тег [/b] попал внутрь скобок?
Код:
[b]${dateOut[/b]}
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
это у Вас просто опечатка в шаблоне, что тег [/b] попал внутрь скобок?
Код:
[b]${dateOut[/b]}
угу - исправил
иначеб не работал файндэндреплэйс, о чем упоминал выше ("индусы" очень ленивы) ;)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
возможно... удалось побороть :)
по-крайней мере частота появления глюка изменилась, из 20-ти попыток не получил ни одного (ранее из 5-и гарантировано)
было:
текст в шаблоне был перенесён как РТФ из письма, кусками подправлен
стало:
отменил форматирование текста (выдение, цвет, шрифт), и заново задал (для нужных частей)
 
Мы в соцсетях:

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