Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1101970888
vecna
2004-12-02 10:01
2004.12.26
Льготы и компенсации


14-1102164214
Andy BitOff
2004-12-04 15:43
2004.12.26
Чьи файлы?


1-1102484762
ORMADA
2004-12-08 08:46
2004.12.26
Icon на WinApi


9-1093586545
Nic
2004-08-27 10:02
2004.12.26
Помогите!


1-1102693122
_Дельфин_
2004-12-10 18:38
2004.12.26
Как сделать прозрачным фон TAnimate?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский