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

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

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

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

Richtext поле

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

nila

Помогите пожалуйста разобраться.
Код работает медленно. Может я делаю что то не так.
Код:
' 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

Подскажите пожалуйста, как можно правильнее сделать?
 
T

turumbay

Меня терзают смутные сомнения(с) : Call uidoc.Close в конце - ничего лишнего на queryClose не висит?

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

nila

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

turumbay

спасибо за ответ!!!
время получается такое 2.3 сек. 1.9 сек
ну как то грузновато.
Я правильно понимаю: 1.9 - время до uidoc.Close, 2.3 - общее время?
2 секунды в UI - не такая уж засада. Повесьте progressBar, чтоб юзеру нескучно было :)

Спрофилируйте код целиком( Тупо через строчку принтовать таймштампы. ) Найдете причину тормозов...
P/S/ Попрубуйте формировать html и вставлять его в поле либо через NotesUIDocument.Import("HTML File" , filename)
либо на лету в бэкэнде через
Код:
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к данных за раз. если надо больше - резать строку на куски и применять последовательно....
 
A

Akupaka

ой-ей! прогресс-бар та еще лажа! из-за него часто бывает больше проблем, чем из-за собственного кода )) имхо
а еще он при дебагере валит клиент...
хотя, может мы о разных прогрессах говорим :)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
прошу прощения, а почему бы все не сделать в бекэнде?
или uidoc - это не UI-шный?
 
N

nila

uidoc это ui-шный.

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Обычно! В бекенде тоже можно заполнять Richtext. Хотя наверное вряд ли это поможет 2 секунды как по мне вполне нормально

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

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

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

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

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

nila

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Замерь время выполнения разных кусков программы.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
да чего тут мерять? судя по приведенному коду - тут нечему тормозить.
Единственное что смущает - это UI-шный документ.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
а почему не организовать через новый док:
-в первом - заполняем поля и жмем кнопку
-второй открывается с заполненым РТ (можно и версионность сделать, попутно)
-списочком к первому (как респонсы) цепляем все сформированные
-разумеется, у сформированых, трем поля Authors - дабы неповадно было :)
 
Мы в соцсетях:

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