Link Hotspot

Статус
Закрыто для дальнейших ответов.

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#1
Всем привет!
Вопрос. Как на lotusscript создать Link Hotspot?
AppendDocLink не подходит
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#2
NickProstoNick
AppendDocLink не подходит
потому как там своя функция или как?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#3
AppendDocLink рисует только Notes-линки. А мне еще надо рисовать вебовские.
Два метода описывать не хочется.
Link Hotspot подходит как нельзя лучше. Ему все равно на что ссылаться
 

RAJ

Well-known member
17.01.2007
440
0
#4
Создан: Dmitry Akulov; Heineken 01/08/2003 04:54 PM
Папка:
05. Notes APIs (C/DXL/etc) Тип сообщения:
Мне лень заполнять это поле

Сообщение:

08.01.2003 14:59:52 Denis Samoylovich написал:

> Дима, а дальше простого примера это ушло?
> интересует в частности: ограничение на размер HTML есть? отчетик там на пару
> тысяч строк потянет?


да, конечно , но, увы , за размером item'a надо следить самому. ДЕло в том , что HTML item не может быть больше 64к. Надо немного изменить функцию MakeHTMLItem, в первый вызов надо проверять и удалять существующий айтем, тогда айтем правильного типа будет создан, далее следить за размером html кода ( это трудно, так как в declare я указал LMBCS префикс, т.е. конвертация строки в LMBCS происходит неявно), но можно резать (IMHO можно не обращать внимание на структуру html, лотус перед показом канкатенирует все айтемы) с запасом, и не удалять существующий айтем. Причем, что интересно, что при пересохранении с воркспейса, тип у айтема меняется на RichText /Mime_Part в зависимости от настроек формы, но NB важно сначала сохранить айтем в back-end'e. И еще одна ложка дегтя, у LN примитивная реализация отображения HTML, ну ооооочень примитивная.

Declarations
<!--shcode--><pre><code class='vb'>Const ITEM_NOFLAG% = &H0
Const CLASS_NOCOMPUTE = 0 '(0 << 8)
Const TYPE_HTML = 21 + CLASS_NOCOMPUTE ' LMBCS-encoded HTML, >64K handled by more than one item of same name concatenated
Declare Function W32_NSFItemAppendS Lib "nnotes.dll" Alias "NSFItemAppend" (Byval nHandle As Long, Byval iFlags As Integer, Byval iName As Lmbcs String, Byval iNameLength As Integer, Byval iType As Integer, Byval iValuePointer As Lmbcs String, Byval iValueLength As Long) As Integer

Function NewHTMLItem(doc As NotesDocument, itemName As String, html As String) As Integer
If doc.HasITem(itemName) Then
doc.RemoveItem(itemName)
End If
NewHTMLItem=W32_NSFItemAppendS(doc.Handle,ITEM_NOFLAG,itemName,Len(itemName),Cint(TYPE_HTML), html, Len(html))
End Function

Function AppendHTMLItem(doc As NotesDocument, itemName As String, html As String) As Integer
AppendHTMLItem=W32_NSFItemAppendS(doc.Handle,ITEM_NOFLAG,itemName,Len(itemName),Cint(TYPE_HTML), html, Len(html))
End Function[/CODE]
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#5
Усложняю задачу. Линк надо рисовать в определенной ячейке таблицы.

В общем задача вот какая. Есть класс. В нем метод копирования таблички из документа шаблона (строка-шапка, строка для данных ... набор столбцов) И метод заполнения таблички путем добавления строк AddRow. Дальше в цикле заполняется таблица.
Ну так в определенный момент в ячейку надо рисовать Link Hotspot. Как это сделать?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#6
Вот решил сделать так... Брать документ с готовой заполненной таблицей.... в местах где надо ставить Link Hotspot - расставляю метки, которые потом собираюсь заменять на хотспоты
Экспортировать его в XML. А потом заменять метки на XML-код хотспота который предварительно был получен.
Но вот беда - после замены меток на код импортер ругается на не правильную структуру документа :blink:
Как это победить?
 

divankin

Senjor developer
13.08.2009
182
0
#7
Создайте форму, на форме несколько разных Link Hotspot, сохраните, а затем посмотрите XML c помощью Tools->DXL Utilities->Exporter.
Там и увидите, как правильно оформлять Link Hotspot в XML.

Если не получится, то код в студию или хотя бы XML c неправильной структурой.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#8
Да самое обидно - ошибка возникает и при замене метки на какое-нить слово :blink:
Я уже издеваюсь над кодом как могу....
есть вот такая процедура в классе. Входной параметр - документ с табличкой
Код:
	Private Sub AddLink( doc As NotesDocument )

On Error GoTo errh

Dim tmpdoc As NotesDocument 
Dim rtitem As NotesRichTextItem
Dim tmpRtitem As NotesRichTextItem
Dim tmp As Variant
Dim tmpLink As Variant
Dim dxl As String


If doc.Hasitem( "tmp_rtitem" ) Then
Call doc.Removeitem( "tmp_rtitem" )
Call doc.Save( True, False, True )
End If


If doc.Hasitem( "$Revisions" ) Then
Call doc.Removeitem( "$Revisions" )
Call doc.Save( True, False, True )
End If

doc.xml = ""

Set tmpdoc = Me.curDb.Createdocument()
tmpdoc.Form = "Kill"
Set rtitem = tmpdoc.Createrichtextitem( "tmp_rtitem" )
Set tmpRtitem = tmpdoc.Createrichtextitem( "tmp_rtitem1" )

Call Me.exporter.Setinput( doc )
Call Me.exporter.Setoutput( rtitem )
Call Me.exporter.Process()

tmpRtitem.values = rtitem.values

doc.xml = tmpRtitem.Values
Call doc.Save(true, false, true)



Call Me.importer.Setinput( tmpRtitem )
Call Me.importer.SetOutput( Me.curDb )
Call Me.importer.Process

Delete Rtitem
Delete tmpRtitem
Delete tmpdoc 

Set tmpdoc = Me.curDb.GetDocumentByID( Me.importer.GetFirstImportedNoteId )
Set rtitem = tmpdoc.GetFirstItem("Body")


If tmpdoc.Hasitem( "tmp_rtitem" ) Then
Call tmpdoc.Removeitem( "tmp_rtitem" )
End If


Call rtitem.Copyitemtodocument( doc, "Body")

Call tmpdoc.Remove( True )		


If doc.Hasitem( "tmp_rtitem" ) Then
Call doc.Removeitem( "tmp_rtitem" )
End If	

Exit Sub

errh:
MsgBox Me.importer.log
Exit Sub		

End Sub
После многих неудач уже решил экспериментировать...
Самым удобным для экспорта мне показалось поле типа RichText
эта строка в коде tmpRtitem.values = rtitem.values специально написана. мне было интересно как будет вести себя импорт. Оказалось что эта строка вызывает нарушение структуры :)
err.JPG
Ну и собственно то же самое вызывает любое изменение.
Ну и еще вот какая особенность во время замены метки на то что мне надо (этой строки в коде нет... пока режил победить самое простое :( )
Rtitem.values = Replace( rtitem.values, "@Link", "TEST" )
вызывает ДОПИСЫВАНИЕ значения в поле Rtitem, а не замену на новое значение :(
 

Вложения

  • 17.7 КБ Просмотры: 167

nvyush

Lotus team
22.04.2009
2 317
0
#9
Да самое обидно - ошибка возникает и при замене метки на какое-нить слово :(
Может проблема в каких-то своеобразных символах либо в метке, либо в слове?
Если попробовать метку 111111111111 заменить словом 2222222222 - так должно сработать.
Потом можно будет копать дальше.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#10
все символы кот. могут пересекаться с синтаксисом ХМЛ надо эскейпить
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#11
Прошу прощения!!! Что-то торможу я сегодня дико... недосып на лицо.
Я разобрался. Все получилось! Вместо RichText-полей использую потоки.
 
M

~Mikle

#12
HTML item не может быть больше 64к
Не принципиально - если всё сделать правильно, создаётся несколько одноимённых полей, которые при отображении клиент собирает в единый html и показывает правильно. Есть опыт :blink:

ps ненавижу индусов :) NotesRichTextNavigator не воспринимает hotspot как ссылку :(
 
Статус
Закрыто для дальнейших ответов.