Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизRange.Find.Execute - Слишком длинный строковый параметр Найти похожие ветки
← →
YUKLA © (2004-12-07 20:12) [0]Уважаемые Господа!
Есть функция:
Procedure FindAndReplaceInWordDoc(WD:TWordDocument;Const oStr,nStr:string);
Var
oldString, newString, Replace:OleVariant;
Begin
//Замена всех строк oStr на строку nStr в открытом документе Word2000
Replace :=wdReplaceAll; oldString:=oStr; newString:=nStr;
WD.Range.Find.Execute(oldString, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, newString, Replace,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
End;
Она используется ШИРОКО в коде нескольких программ. Происходит замена некоторых строк из шаблона (например @Up ) на строки, сформированные программой.
Среда - Delphi 5 + SP#1, Word 2000 + SP#3, используются компоненты те, что для Office 2000 (dcloffice2k50.bpl).
В случае если длина строки больше 255 символов получаем надпись "Слишком длинный строковый параметр". Что делать?
Не подскажите ли, как обойти данное ограничение?
С уважением.
← →
MBo © (2004-12-07 20:20) [1]>В случае если длина строки больше 255 символов получаем надпись "Слишком длинный строковый параметр". Что делать?
составлять строку из нескольких с помошью "+"
← →
YUKLA © (2004-12-07 20:34) [2]Спасибо
Но, к сожалению, так нельзя. Прийдется переписывать связанные программы, которые вызывают данную функцию. А это - проблематично.
Можно ли каким-нибудь ИНЫМ образом произвести замену строки на другую в открытом документе MS Word?
С уважением.
P.S. Может быть, я Вас неправильно понял? Что значит "составлять строку из нескольких с помошью "+""? Она у меня и так составляется из нескольких с помощью "+", а потом результат передается указнной выше функции.
← →
Leonid Troyanovsky (2004-12-07 20:52) [3]YUKLA © (07.12.04 20:12)
Есть функция:
Procedure FindAndReplaceInWordDoc(WD:TWordDocument;Const oStr,nStr:string);
Вот скажи мне, уважаемый, ведь этот вопрос был же размещен
в rsdn? И уже там он оброс некоторыми подробностями.
Например, автор знает как сделать оное на VBA, но
не знает как на дельфи.
Ну, а зачем скрывать эти сведения от людей, которые
могут знать как это сделать на дельфи (хотя они могут
даже плохо представлять, что такое VBA).
Ты скажи, ты скажи, что ты хочешь, что ты хочешь ;)
--
С уважением, LVT.
← →
YUKLA © (2004-12-07 21:06) [4]Ув. LVT
Вот, например, с сайта Microsoft предлагается такое решение:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q181110
Что касается публикации в других форумах, то это вопрос был размещен и в Delphi Kingdom.
Вопрос срочный, а ответов по существу нет...
С уважением.
← →
Leonid Troyanovsky (2004-12-07 22:15) [5]
> YUKLA © (07.12.04 21:06) [4]
> Вот, например, с сайта Microsoft предлагается такое решение:
> http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q181110
Ну, и, что мешает оному воплощению?
--
С уважением, LVT.
← →
YUKLA © (2004-12-07 22:19) [6]Пробовал, не получается. ;)
Господа!
Не уж то никто не сталкивался? Я весь Гугль перерыл с Альтавистой в придачу. Нигде ничего внятно не написано. Вариант Микрософт я, увы, на Delphi адекватно перевести не смог. Может быть, кто-нибудь поможет?
С уважением.
← →
Cobalt © (2004-12-07 22:28) [7]2 YUKLA © (07.12.04 22:19) [6]
И что же конкретно у тебя не получилось?
Давай разберёмся вместе.
← →
YUKLA © (2004-12-07 22:41) [8]Ув. Cobalt!
пример Майкрософт говорит о косвенной проблеме и приводит косвенное ее решение. В данном сулчае (в базе знаний Майкрософт) речь идет о "полях", тогда как у меня - не поля, а просто текст.
Конкретно - нужно вот что. Есть шаблон *.doc, в котором вместо слов (или вообще абзацев) стоят слова-заглушки ("@Up","@Who" и т.д.)
Программа готовит нужный текст и заменяет указанной выше функцией ВСЕ вхождения "слов-заглушек" в шаблоне ( а их - вхождений - может быть несколько).
Чисто банально это решается разделением заглушек на часть (типа "@Up1", "@Up2" и т.д.). Но это некузяво и к тому же потребует как переписывать сами программы, так и переделывать шаблоны.
С уважением.
← →
Leonid Troyanovsky (2004-12-07 22:55) [9]
> YUKLA © (07.12.04 22:19) [6]
> Пробовал, не получается. ;)
Вот отсюда и нужно подробнее.
--
С уважением, LVT.
← →
Leonid Troyanovsky (2004-12-07 23:05) [10]
> YUKLA © (07.12.04 22:41) [8]
> пример Майкрософт говорит о косвенной проблеме и приводит
> косвенное ее решение. В данном сулчае (в базе знаний Майкрософт)
> речь идет о "полях", тогда как у меня - не поля, а просто
> текст.
>
> Конкретно - нужно вот что. Есть шаблон *.doc, в котором
> вместо слов (или вообще абзацев) стоят слова-заглушки ("@Up","@Who"
> и т.д.)
>
> Программа готовит нужный текст и заменяет указанной выше
> функцией ВСЕ вхождения "слов-заглушек" в шаблоне ( а их
> - вхождений - может быть несколько).
Гы. Что нужно чтобы вскипятить чайник?
1. Налить воду
2. Включить чайник.
Что нужно, чтобы вскипятиь полный чайник? Вылить воду
и далее по инструкции.
Ну замени свои слова на поля, а далее по прописи.
Если уж не можешь сделать свою FindAndReplace.
--
С уважением, LVT.
← →
YUKLA © (2004-12-07 23:12) [11]Вариант, который я пробовал "преевести в Delphi"
http://word.mvps.org/FAQs/MacrosVBA/SetLongFmFldResult.htm
How to set the result of a text formfield using VBA, if the string is longer then 256 characters
Article contributed by Dave Rado
If you use:
Dim FmFld As FormField, Str1 As String
Str1 = (a long string > 256 characters)
Set FmFld = ActiveDocument.FormFields(1)
FmFld.Result = Str1
You get an error: “String too long” (a ridiculous “design” feature, given that you can do it manually without problems!).
Same if you use:
ActiveDocument.Formfields("Text1").Result = Str1
You can get round this by using:
ActiveDocument.Unprotect
FmFld.Range.Fields(1).Result.Text = Str1
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
Or if you"re referring to the formfield by name:
ActiveDocument.Unprotect
ActiveDocument.Bookmarks("Text1").Range.Fields(1).Result.Text = Str1
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
Пусть мы ищем строку "@Up" как Bookmark
Т.е. пишем
TmpBookmark:=WD.Bookmarks.Item("@Up");
Это уже ошибка, а как иначе сделать? Т.е., как работать с свойсвтом Bookmarks? Т.е. как внятно перевести приведенный выше код в Delphi?
С уважением.
← →
Leonid Troyanovsky (2004-12-07 23:46) [12]
> YUKLA © (07.12.04 23:12) [11]
> Вариант, который я пробовал "преевести в Delphi"
..
Пусть мы ищем строку "@Up" как Bookmark
Издеваешься, да?
Вот пример из хелпа ВБ, как искать
With Selection.Find
.Forward = True
.ClearFormatting
.MatchWholeWord = True
.MatchCase = False
.Wrap = wdFindContinue
.Execute FindText:="Microsoft"
End With
Ежели слово найдено и выделено, что мешает его заменить,
т.е. TypeText?
--
С уважением, LVT.
← →
YUKLA © (2004-12-07 23:57) [13]Блин. Кто, интересно, издевется!
МНЕ VB НЕ НУЖЕН! Я В НЕМ НЕ РАЗБИРАЮСЬ.
Мне бы пример как сделать АНАЛОГ Range.Find.Execute в Delphi
Кто-нибудь может ПОМОЧЬ ПО СУЩЕСТВУ? Без "пальцев"?
← →
Leonid Troyanovsky (2004-12-08 00:09) [14]
> YUKLA © (07.12.04 23:57) [13]
> МНЕ VB НЕ НУЖЕН! Я В НЕМ НЕ РАЗБИРАЮСЬ.
Ну, раз сам не знаешь, найми кого-нибудь знающего.
--
С уважением, LVT.
← →
YUKLA © (2004-12-08 08:21) [15]Ой, спасибо!
Сам решил проблему... Помощи от форума - РОВНО НОЛЬ. Треп один.
Итого. Решение проблемы "стока длинее 255 байт".
- Встречаем в шаблоне строку для замены (например, "@Up")
- В случае, если длина строки ЗАМЕНЫ более 255 байт выполняем предварительную замену строки "@Up" на "@Up#1@Up#2...@Up#N"
- Делим строку ЗАМЕНЫ на куски <256 символов
- Последовательно заменяем @Up#1..@Up#N на соответсвующие подстроки.
Спасибо ЕЩЕ РАЗ! Я ОЦЕНИЛ Ваш уровень мастерства как программиста.... ;)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c