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

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 30 июн 2009.

  1. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    получаю малевича на строке Remove
    не умею я с ним работать :)
    смысл кода - замена тегированного текста в РТ
    Код (Text):
    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
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Дорогой друг, почему не используешь rtRange.FindAndReplace?

    Как-то так:
    Код (Text):
    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 пробем не было.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    дело в том, что название и кол-во полей (в доке) заранее неизвестно...
    а rtitem - из набора шаблонов и подстановка осущ. в ходе их заюзывания под конкретный док (поля могут и отсутствовать)
    с т.з. логики - всё нормально выглядит, а тот факт, что "криворучки" не смогли классы по-человечьи написать, удручает
    но беде не в этом, а в том, что нет нормального описания - как с этим глюкалом работать
    я опиралься на этот код http://www.breakingpar.com/bkp/home.nsf/0/...7256FAC005B6DAE
    и версия нотусов - 7.03
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ща опишу, как я делал (правда, это было несколько лет назад ужо), может тебе чем-то поможет:

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    спасибо
    походу придется подобное и делать...
    очередной жирный минус "индусам", писавшим код "навигатора" :)
    и очередная зарубка - не юзать эти глюкоклассы
     
  6. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Там Малевича получить проще простого.
    Но если юзать аккуратно, то всё работает почти как часы.
    Я бы не был столь категоричен: когда-то на RT классах схавал если не пуд соли, то предостаточно :)
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    эх... времени не хватает, вот собирусь... ;)
    чем ходить по граблям - проще ДХЛ заюзать, но там есть несколько особенностей (кот., возможно, не решены и в этих классах):
    текст параграфа и текст-ран
    формально - искать в ДХЛ можно ежели стиль строки поиска - "неразрывный", в противном случае, возникает текс-ран, кот. "рвет" текст тегами и обработка усложняется
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    может я чё сослепу не увидел, но очередная глюковина...
    делаем две ф-ции , выполнение последней, иногда!, "мусорит" перед последней "заменой"
    строка в РТ такая:
    Уважаемые господа,
    Информируем вас о том, что ${dateOut} в адрес ${SendToGrp} было отправлено информационное письмо ${subjectOut}.
    Письмо см.во вложении.

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

    ф-ции такие:
    Код (Text):
    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
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    это у Вас просто опечатка в шаблоне, что тег [/b] попал внутрь скобок?
    Код (Text):
    [b]${dateOut[/b]}
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    угу - исправил
    иначеб не работал файндэндреплэйс, о чем упоминал выше ("индусы" очень ленивы) ;)
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    возможно... удалось побороть :)
    по-крайней мере частота появления глюка изменилась, из 20-ти попыток не получил ни одного (ранее из 5-и гарантировано)
    было:
    текст в шаблоне был перенесён как РТФ из письма, кусками подправлен
    стало:
    отменил форматирование текста (выдение, цвет, шрифт), и заново задал (для нужных частей)
     
Загрузка...

Поделиться этой страницей