Richtext поле

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

  1. nila

    nila Гость

    Помогите пожалуйста разобраться.
    Код работает медленно. Может я делаю что то не так.
    Код (Text):
    ' RichStyle
    Set body = New NotesRichTextItem( doc, "Body" )
    Set richStyle = session.CreateRichTextStyle
    richStyle.FontSize = 10
    richStyle.NotesFont = body.GetNotesFont("Arial", True) 

    'append info to RTItem
    Call body.AppendText("Meeting Run By : " + uidoc.FieldGetText("MeetingRunBy") + " on " + uidoc.FieldGetText("Date") + " from " + uidoc.FieldGetText("From") + " to " + uidoc.FieldGetText("To") )  

    Call body.AddNewLine( 2 )

    richStyle.Bold = True              
    Call body.AppendStyle(richStyle)
    Call body.AppendText("A. Attendance")
    richStyle.Bold = False
    Call body.AppendStyle(richStyle)

    Call body.AddNewLine( 1 )

    c = 0  
    For j% = 1 To 10
    If Not (uidoc.FieldGetText("Name_" + Cstr( j ) ) = "") Then
    c = c + 1
    Call body.AppendText(Cstr(c) + ". " + uidoc.FieldGetText("Name_" + Cstr( j )) + " ( " + uidoc.FieldGetText("JobCode_" + Cstr( j )) + " )")
    Call body.AddNewLine( 1 )
    End If
    Next

    Call body.AddNewLine( 2 )

    richStyle.Bold = True              
    Call body.AppendStyle(richStyle)
    Call body.AppendText("B. Topic Summary")
    richStyle.Bold = False
    Call body.AppendStyle(richStyle)   

    Call body.AddNewLine( 1 )

    c = 0  
    For j% = 1 To 2
    If Not (uidoc.FieldGetText("Topic_" + Cstr( j ) ) = "") Then
    c = c + 1
    Call body.AppendText(Cstr(c) + ". " + uidoc.FieldGetText("Topic_" + Cstr( j )) )
    Call body.AddNewLine( 1 )
    End If
    Next

    Call body.AddNewLine( 2 )

    richStyle.Bold = True              
    Call body.AppendStyle(richStyle)
    Call body.AppendText("C. Participation")
    richStyle.Bold = False
    Call body.AppendStyle(richStyle)
    Call body.AddNewLine( 1 )

    c = 0  
    For j% = 1 To 5
    If Not (uidoc.FieldGetText("Question_" + Cstr( j ) ) = "") Then
    c = c + 1
    Call body.AppendText(Cstr(c) + ". " + uidoc.FieldGetText("Question_" + Cstr( j )) )
    Call body.AddNewLine( 1 )
    End If
    Next

    Call body.AddNewLine( 2 )

    richStyle.Bold = True              
    Call body.AppendStyle(richStyle)
    Call body.AppendText("D. Follow up")
    richStyle.Bold = False
    Call body.AppendStyle(richStyle)   

    Call body.AddNewLine( 1 )
    Call body.AppendText(uidoc.FieldGetText("FollowUp"))
    ' end append info to RTItem

    doc.Status = "3"   
    Call doc.Save(False, True)
    doc.SaveOptions=0
    Call uidoc.Close
    Call workspace.ViewRefresh
    Подскажите пожалуйста, как можно правильнее сделать?
     
  2. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Меня терзают смутные сомнения(с) : Call uidoc.Close в конце - ничего лишнего на queryClose не висит?

    Если нет: Вы уверены, что тормоза возникают именно в это куске? Какой канал до сервера?
    Дайте время работы кода в секундах...
    Врежьте в начало:
    Код (Text):
    Dim startTic As Long
    startTic = Getthreadinfo(6)
    И в хвост:
    Код (Text):
    Dim seconds As Double
    seconds = (Getthreadinfo(6) - startTic) / Getthreadinfo(7)
    Print Format$(seconds, "##0.0") & " сек."
    И таки померяйте время работы до uidoc.Close и после.
     
  3. nila

    nila Гость

    спасибо за ответ!!!
    время получается такое 2.3 сек. 1.9 сек
    ну как то грузновато.
     
  4. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Я правильно понимаю: 1.9 - время до uidoc.Close, 2.3 - общее время?
    2 секунды в UI - не такая уж засада. Повесьте progressBar, чтоб юзеру нескучно было :)
    http://www.bizzybee.be/2007/08/31/a-progre...in-lotus-notes/
    Спрофилируйте код целиком( Тупо через строчку принтовать таймштампы. ) Найдете причину тормозов...
    P/S/ Попрубуйте формировать html и вставлять его в поле либо через NotesUIDocument.Import("HTML File" , filename)
    либо на лету в бэкэнде через
    Код (Text):
    Const ITEM_NOFLAG% = &H0
    Const CLASS_NOCOMPUTE = 0
    Const TYPE_HTML = 21 + CLASS_NOCOMPUTE

    Declare Function W32_NSFItemAppendStr Lib "nnotes" Alias "NSFItemAppend" (_
    Byval hNote As Long,_
    Byval flags As Integer,_
    Byval ItemName As String, Byval ItemNameLength As Integer,_
    Byval itemType As Integer,_
    Byval Buff As Lmbcs String, Byval BuffLength As Long) As Integer

    Declare Function crt_strlen Lib "MSVCRT.dll" Alias "strlen" (Byval FormulaText As Lmbcs String) As Long


    Public Function importHTML( i_doc As NotesDocument , i_fieldName As String , i_htmlSource As String )
    .... ' почистить поле если надо...

    Call W32_NSFItemAppendStr( i_doc.handle,_
    ITEM_NOFLAG,_
    i_fieldName ,crt_strlen( i_fieldName ),_
    Cint(TYPE_HTML),_
    i_htmlSource , crt_strlen( i_htmlSource )
    )
    ....
    End Function
    Ограничения:
    windows онли( если надо под *nix - авось гуры додумают ).
    32к данных за раз. если надо больше - резать строку на куски и применять последовательно....
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ой-ей! прогресс-бар та еще лажа! из-за него часто бывает больше проблем, чем из-за собственного кода )) имхо
    а еще он при дебагере валит клиент...
    хотя, может мы о разных прогрессах говорим :)
     
  6. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    о разных.
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    прошу прощения, а почему бы все не сделать в бекэнде?
    или uidoc - это не UI-шный?
     
  8. nila

    nila Гость

    uidoc это ui-шный.

    Сейчас человек вводит инфу в поля, при заполнении всех полей при нажатии на кнопку отрабатывает этот код.
    он заполняет все инфу в Richtext.
    а как вы предлагаете это сделать в бекэнде?
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Обычно! В бекенде тоже можно заполнять Richtext. Хотя наверное вряд ли это поможет 2 секунды как по мне вполне нормально

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

    Один нюанс работы с Richtext в бекенде - все Richtext-поля желательно поместить в секции контролируемого доступа и запретить редактировать ее (я запрещаю всем. даже авторам), а Richtext-поля оставить редактируемыми.

    ммм.... почему именно так? Зачем пользователю ждать пока то что он ввел куда-то запишется?
    Может стоит перенести эту задачу на серверный агент? Ну к примеру чтоб он запускался ночью и заполнял все что надо.

    На сервере такая задача выполнится на много быстрее.

    Только надо будет переписать код без использования UI-шных классов
     
  10. nila

    nila Гость

    Да я переоткрывала этот документ, но на быстроту это не повлияло!?
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Замерь время выполнения разных кусков программы.
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    да чего тут мерять? судя по приведенному коду - тут нечему тормозить.
    Единственное что смущает - это UI-шный документ.
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    а почему не организовать через новый док:
    -в первом - заполняем поля и жмем кнопку
    -второй открывается с заполненым РТ (можно и версионность сделать, попутно)
    -списочком к первому (как респонсы) цепляем все сформированные
    -разумеется, у сформированых, трем поля Authors - дабы неповадно было :)
     
Загрузка...

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