только mt.contents мне кажется ибо text только getДа. Основная моя мысль в коде была в том, что нужно из MLeader сначала получить MText, потом MText модифицировать и затем установить MLeader.MText в новое значение MText.
а как быть с тем что при замене contents на text слетает все форматирование мтекста?Замени:
а вот как заменить чтоб ничего не испортилось?Это достаточно сложно. Для этого следует использовать метод MText.ExplodeFragments, выполнять поиск и замену во фрагментах, а потом объединять их. Ну а если поисковый текст окажется сразу в нескольких фрагментах, то это еще сложнее...
1. Куча-мала из объектов транзакций и объектов полученных через ObjectId.GetObject. Я б не стал так рисковать. Это ж работа без транзакций, так?Нет. Это работа с TopTransaction (если конечно хотя бы одна транзакция запущена).
Нет.Не явное использование TopTransaction ?
Да.Нет.Не явное использование TopTransaction ?
ДаОК. Как бы запомнить... Тогда пункт 1 чисто про оформление кода. using не нужен
ОК. Как бы запомнить...Это просто: .GetObject(...) - это транзакция, а .Open(...) - это без транзакции.
у меня корректно написано в плане транзакций?Корректно, но некрасиво. Если уж используешь tr.GetObject(...) в одном месте, то и в других используй его, а не objId.GetObject(...)
т е по факту obid.getobject и tr.getobject(obid) это одно и тоже просто вопрос красоты?В твоём коде - одно и тоже. В общем случае нет, если запущено несколько транзакций.
Да именно так. Эту фичу только в последней студии добавили к оператору is .т е "is mleader ml" это еще и объявление переменной как выноски?
т е "is mleader ml" это еще и объявление переменной как выноски?Да. Только не mleader, а MLeader - C# регистрозависимый язык.
tr.getoblect я беру объект из какой то конкретной транзакции а obid.getobject.. ?objId.GetObject берёт из так называемой TopTransaction - самой последней запущенной в данной базе данных (Database) активной транзакции.
из той транзакции в которой нахожусь?
т е по факту obid.getobject и tr.getobject(obid) это одно и тоже просто вопрос красоты?В будущем возможно понадобится заменить Transaction на OpenCloseTransaction. И если первая "понимает" ObjectId.GetObject, то вторая - нет. И при замене одного на другое будет фаталить. Так что, в качестве совета: лучше явно использовать метод транзакции.
Так что, в качестве совета: лучше явно использовать метод транзакции.Плюсую. В ряде случаев попытка открыть объект через ObjectId.GetObject(TopTransaction) приводила к фатальным ошибкам, через Transaction проблем не было. Возможно имеют место конфликты повторного открытия объекта, или попытки открыть с другими правами в TopTransaction, которые решаются использованием Transaction.
В ряде случаев попытка открыть объект через ObjectId.GetObject(TopTransaction) приводила к фатальным ошибкам, через Transaction проблем не былоМожет не было ни одной транзакции в данном документе/базе?
Так что, в качестве советаВаши советы очень ценны! Активно впитываю. Благодарю)
Ваши советы очень ценны! Активно впитываю. Благодарю)В таком случае тут принято плюсовать карму ;)
А можно вкратце чем отличается openclosetransactionПогугли по нашему форуму и сайту. Найдёшь много ответов (в том числе и мои). Например:
Несколько комментариев к коду:
1. Куча-мала из объектов транзакций и объектов полученных через ObjectId.GetObject. Я б не стал так рисковать. Это ж работа без транзакций, так? А тогда, объект полученный без транзакции должен быть ликвидирован. Т.е. забыт using
2. MText, полученный из MLeader по документации тоже должен быть ликвидирован. Т.е. тоже берите через using
3. Нет проверки ContentType - на выноске вовсе не обязательно текст, может быть и блок. И тогда надо работать с атрибутами блока. Или менять ContentType
4. И не зачем объявлять переменные типа object.Код - C# [Выбрать]можно записать как
object obj = obid.GetObject(OpenMode.ForRead); if (obj is MLeader) { MLeader ml = obj as MLeader; ...Код - C# [Выбрать]
if (tr.GetObject(obid, OpenMode.ForRead) is MLeader ml) {
Поправил по замечаниям и получилось что внутри if еще одно if и более ничего-объеденил все в одно условие.. отсюда вопрос: корректен ли следующий код?код корректен, благодаря "is MText mt) &&" т.е. если он MText только тогда будет обращение к свойству mt.Text
смущает что в одной части условия я только объявляю и присваиваю переменную, а в другой уже ее опрашиваю.. И все внутри одного условия
simson43,будет редактироваться, это не весь код
Только по этому коду не понятно нужно ли OpenMode.ForWrite или было бы достаточно OpenMode.ForRead, так как в нём этот примитив не редактируется.
Т.к. ты все в один if записал и сделал "плохо читаемый код".Есть хорошие рекомендации в книге "Совершенный код" С.Макконнелла. Глава 19.1.
единого совета быть не может как сделать "хорошо читаемый код"
MText mt = ol.MText;
mt.Text = mt.Text.Replace(find.Text, "need.Text");
ol.MText = mt;
выходит после этих моих махинацией тоже следует удалить mt?Да. Об этом в этой теме уже писал avc:
2. MText, полученный из MLeader по документации тоже должен быть ликвидирован. Т.е. тоже берите через using
это аналогично mt.Dispose?Да.Код - C# [Выбрать]
using (MText mt = ol.MText) { }