Страница 1 из 1

Ограничение в OLE

Добавлено: 01 Февраль 2011, 19:45
GuestSS
Clarion 5.5EE
Доброго времени суток всем!
Есть проблема и ничего не лезет в голову
имеется поле Cstring(1000), так вот при попытке вывода этого поля в word генерит ошибку "слишком длинный строковый параметр"
Посоветуйте как обойти?

Re: Ограничение в OLE

Добавлено: 01 Февраль 2011, 22:37
Larion
Пользуюсь шаблонами SoftMasters при работе c Word
функция Replace имеет ограничение 255 символов
пришлось написать свой метод в классе MSWordClass.ReplaceM
работаю через CLIPBOARD при этом ограничений по размеру нет.
Размер ограничен объемом CLIPBOARD.

нужно добавить эти строки в файл abword.clw

Код: Выделить всё

MSWordClass.ReplaceM               PROCEDURE(STRING Search,STRING Replace)
    CODE
    SETCLIPBOARD(Replace)
    SELF.Search(Search,False,True,False,False,False,False,False,False)
    SELF.Paste()
а в файл abword.inc в описание класса MSWordClass добавить эту строку.

Код: Выделить всё

    ReplaceM              PROCEDURE(STRING Search,STRING Replace),BYTE,VIRTUAL
шаблоны SoftMasters были ftp.

Re: Ограничение в OLE

Добавлено: 02 Февраль 2011, 13:51
GuestSS
Замечательно! То что надо!
а Вы не могли бы скинуть шаблон на samarin26@gmail.com
Заранее спасибо!

Re: Ограничение в OLE

Добавлено: 02 Февраль 2011, 14:21
GuestSS
Все не надо, разобрался без шаблона :-)
вот кусок текста может кому понадобится

feqOLE=create(0,CREATE:Ole)
feqOLE{Prop:Create}='Word.Application'
feqOLE{Prop:ReportException}=TRUE
feqOLE{'Visible'}=1
feqOLE{'Documents.Open("'&clip(loc:WordFileName)&'")'}

loc:FindStr='[метка]'
setclipboard(ПОЛЕ)
feqOLE{'Selection.Find.ClearFormatting'}
feqOLE{'Selection.Find.Replacement.ClearFormatting'}
feqOLE{'Application.Selection.Find.Execute("'&clip(loc:FindStr)&'", , , , , , 1, 1, ,)'}
feqOLE{'Application.Selection.Paste("'&clip(clipboard())&'")'}
...

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 9:28
Игорь Столяров
GuestSS писал(а):feqOLE{'Application.Selection.Find.Execute("'&clip(loc:FindStr)&'", , , , , , 1, 1, ,)'}
Столкнулся с следующей проблемой.
Если loc:FindStr = 'Название ООО Свисток' - то все работает правильно.
Если loc:FindStr = 'Название ООО "Свисток"' - то операция не работает и это правильно, т.к. кавычки не отрабатываются в строке.

Здесь видимо нужно использовать какой-то символ для замены кавычек на макроподстановку или код, что то вроде {34} или %34% вместо кавычек,
только вот какой ее формат при экспорте в MS Word ? Никто не сталкивался с таким вопросом ?

Заранее спасибо !

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 10:24
Ал
что-то такое было - надо рыться, а так помнится - в одном случае заменял на какие-то другие символы - типа ` или ``, причем при выводе в ОО и в ворд отображ по разному; в другом случае просто можно было обойтисьт без xls - делал вывод в cvs/xml и проч.
ps
както так

Код: Выделить всё

CheckNameProduct routine ! обработка " кавычек для OpenOff
 data
ii  long
Simvol  string(1)
 code
 if instring('"',VRD:NameProduct) ! есть хотя бы одни 1 " в наименовании
  loop ii = 1 to len(clip(VRD:NameProduct)) !1024
    Simvol = sub(VRD:NameProduct,ii,1)
    if Simvol = '"'
      VRD:NameProduct[ii] = ''''
      VRD:NameProduct = sub(VRD:NameProduct,1,ii-1)&''''''&sub(VRD:NameProduct,ii+1,1024)
    else
      VRD:NameProduct[ii] = Simvol
    .
    if ~instring('"',VRD:NameProduct) ! есть ещё " в наименовании
      break ! нет - выходим
    .
  .
!  stop(VRD:NameProduct)
 .
 exit

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 10:46
morkovin
Здесь видимо нужно использовать какой-то символ для замены кавычек на макроподстановку или код, что то вроде {34} или %34% вместо кавычек,
При работе с MS Word через OfficeTemplates (SoftMaster) всегда использую функцию QuoteOT( входит в OfficeTemplates)
Можно посмотреть и из VSA_STR.CLW (free шаблоны от Vincento Sorrenta, кажется):

Код: Выделить всё

vsStringClass.WrapQuotes             PROCEDURE(*STRING pText)
   CODE
    SELF.StripQuotes(pText)
    IF INSTRING(' ',(pText & ' '),1)<LEN(CLIP(pText)) OR INSTRING('/',pText,1) OR INSTRING('\',pText,1) OR INSTRING('|',pText,1) OR INSTRING(',',pText,1)
       pText = '"' & CLIP(LEFT(pText)) & '"'
       RETURN
    END
    IF NOT(pText)
       pText= '""'
       RETURN
    END

vsStringClass.StripQuotes            PROCEDURE(*STRING pText)
   CODE
   IF pText='""'
      pText=''
      RETURN
   END
   IF SUB(pText,1,1)='"' AND SUB(pText,LEN(CLIP(pText)),1)='"' ! There must be a matching quote
      pText=SUB(pText,2,LEN(CLIP(pText))-2) 
   END

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 11:23
Игорь Столяров
К чему эта функция ? Ну убрали кавычки и проставили кавычки. Сущность не меняется - при экспорте в MS Word кавычки приводят к сбою экспорта ...

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 11:52
morkovin
При работе с MS Word через OfficeTemplates (SoftMaster) всегда использую функцию QuoteOT
Если не использую QuoteOT - то действительно 100% сбой.

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 12:25
Игорь Столяров
А если использовать, то не выводятся кавычки ... ?

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 13:16
kreator
Я использую двойные кавычки. Типа loc:FindStr = 'Название ООО ""Свисток""'. Ессно, такую строку надо сделать до вставки в Word. Сейчас подниму текст, выложу.

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 13:32
Игорь Столяров
Все супер ! Мне текст не нужен - я его и сам за 5 сек. напишу, мне нужна идея или технология ...
Огромное спасибо ! Это то, что нужно, все работает как и требуется ... :)

Re: Ограничение в OLE

Добавлено: 08 Июнь 2011, 13:49
kreator
Вдогонку. Из хелпа.

Value parameters are passed to OLE/OCX objects as strings (except Boolean parameters). Since OLE/OCX objects are supposed to cast their input to the correct data types using a VARIANT mechanism (similar to Clarion's data type conversion), this allows the most compatibility with the least work. Any string which requires a double quote mark (") needs to include two ("").