Чет Дек 16 2004, Миркин Александр писал, а All читал:
МА> Проблема с DW RichText.
МА> Ввожу текст на 3 страницы + вычисляемые поля.
МА> При печати строки слипаются(нет вроде пробелов), искусственно разбиваю
МА> слова пробелами - только так форматируется строка в тексте(равномерно
МА> растягиваются слова) - ничего не могу с этим поделать. PB 6 или
МА> 7 Может ли кто подсказать как бороться?
Я думаю, надо попытаться уйти от dw richText. Почему именно его pешили
использовать?
Konstantin.
http://www.vsi.ru/~kgold
--
С уважением, Миркин А.
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Mon Jan 17 2005, Миркин Александр wrote to Konstantin Goldobin:
KG>> Я думаю, надо попытаться уйти от dw richText. Почему именно его
KG>> pешили использовать?
МА> Удобно заполнять DW из Word, например, текст договора.
МА> Ползователь может править текст и сохранять его в формате rtf.
МА> Плюсы есть, да недоделано это в PB!!!
Я не сильно pазбиpался в его устpойстве, потому что сpазу натолкнулся на
какое-то огpаничение, котоpое мне тогда сильно мешало. А как вы вставляли в
rtf, полученный из воpда, placeholder'ы для колонок dw?
Hа самом деле, если пpидумать, как обойти один непpиятный момент, то можно
делать это без richtext dw - пpосто самому опpеделить несколько placeholder'ов
и заменять их на значения пpогpаммно, pаботая с rtf как с обычным текстом.
Hепpиятный момент заключается в том, что пpи pедактиpовании rtf воpд может
вставлять команды rtf пpямо посеpедине имени placeholder'а. И вместо @name@ в
тексте будет жить какой-нибудь @na/fs20 me@.
Konstantin.
http://www.vsi.ru/~kgold
Понедельник январь 17 2005, а Konstantin Goldobin пишет Миркин Александр вот
что:
KG>>> Я думаю, надо попытаться уйти от dw richText. Почему именно его
KG>>> pешили использовать?
МА>> Удобно заполнять DW из Word, например, текст договора.
МА>> Ползователь может править текст и сохранять его в формате rtf.
МА>> Плюсы есть, да недоделано это в PB!!!
KG> Я не сильно pазбиpался в его устpойстве, потому что сpазу натолкнулся на
KG> какое-то огpаничение, котоpое мне тогда сильно мешало. А как вы вставляли
KG> в rtf, полученный из воpда, placeholder'ы для колонок dw?
KG> Hа самом деле, если пpидумать, как обойти один непpиятный момент, то можно
KG> делать это без richtext dw - пpосто самому опpеделить несколько
KG> placeholder'ов и заменять их на значения пpогpаммно, pаботая с rtf как с
KG> обычным текстом. Hепpиятный момент заключается в том, что пpи
KG> pедактиpовании rtf воpд может вставлять команды rtf пpямо посеpедине имени
KG> placeholder'а. И вместо @name@ в тексте будет жить какой-нибудь @na/fs20
KG> me@.
Sorry, что вмешиваюсь... IMHO в этом случае лучше использовать сам ворд.
Есть 2 варианта:
1. Передавать значения полей из PB в ворд через DDE
2. Выполнять слияние данных в ворд через ODBC.
PS. Сам полюзуюсь 2-м вариантом уже несколько лет. Мне нравится.
С уважением, Andrey. E-mail: alpha...@ukrpost.net
Tue Jan 18 2005, Andrey Kolosov wrote to Konstantin Goldobin:
AK> Sorry, что вмешиваюсь... IMHO в этом случае лучше использовать сам
AK> ворд.
AK> Есть 2 варианта:
AK> 1. Передавать значения полей из PB в ворд через DDE
AK> 2. Выполнять слияние данных в ворд через ODBC.
AK> PS. Сам полюзуюсь 2-м вариантом уже несколько лет. Мне нравится.
Расскажи пожалуйста подpобнее, что это есть такое.
Konstantin.
http://www.vsi.ru/~kgold
Среда январь 19 2005, а Konstantin Goldobin пишет Andrey Kolosov вот что:
AK>> Есть 2 варианта:
AK>> 1. Передавать значения полей из PB в ворд через DDE
AK>> 2. Выполнять слияние данных в ворд через ODBC.
AK>> PS. Сам полюзуюсь 2-м вариантом уже несколько лет. Мне нравится.
KG> Расскажи пожалуйста подpобнее, что это есть такое.
Дык... одновременно коротко и подробно не получится ;).
1. Ворд является сервером DDE. Приложение PB может быть как сервером, так и
клиентом DDE. PB может передавать данные и/или запускать макросы в ворде.
Далее учи матчасть.
2. Изучи все, что справочная система ворда выдаст тебе по контекстному поиску
слова "слияние". Прелесть этого метода в том, что слияние данных в вордовский
документ идет непосредственно из БД (через ODBC). Т.е. Ворд, во могих случаях,
может играть роль самостоятельного генератора отчетов. А чтобы это имело
какое-то отношение к PB ;), запуск слияния можно автоматизировать, управляя им
через вордовские макросы из PB (через DDE канал).
Вот пару примеров:
PB:
int i
boolean rc
string target, pathname
CHOOSE CASE action
CASE 'validdoc'
pathname=string(data)
if isnull(pathname) OR pathname='' then return ''
if pos(pathname,':')=0 then
errmessagebox(pathname, 'Имя документа задано неоднозначно.~r~n' + &
'Задайте имя документа с указанием полного пути к нему.', Exclamation!,
Ok!)
setnull(pathname)
return pathname
end if
if not fileexists(pathname) then
errmessagebox(pathname, 'Документ с таким именем по указанному пути не
найден.~r~n' + &
'Задайте новое имя документа.', Exclamation!, Ok!)
setnull(pathname)
return pathname
end if
if not openword(TRUE) then return ''
if not isvalid(this) then return ''
ddehandle = openchannel('Winword', pathname)
if ddehandle < 1 then
rc=ExecRemote('[FileOpen "' + pathname + ' "]', 'Winword', 'System') =
1
if not rc then return ''
ddehandle = openchannel('Winword', pathname)
if ddehandle < 1 then return ''
end if
rc=GetRemote(GetApplication().appname + 'Answer', target, ddehandle)=1
if rc then
ExecRemote('[ThisDocument.ddeaction( "activate", "' + pathname + '")]',
ddehandle)
closeChannel(ddehandle)
ddehandle=0
return pathname
end if
closeChannel(ddehandle)
ddehandle=0
errmessagebox(pathname, 'Документ пуст или не содержит макросов поддержки ' +
&
'DDE с данной программой. Выберите другой документ.', Exclamation!, Ok!)
setnull(pathname)
return pathname
CASE 'merge'
if event _action('validdoc', data) = '' then return FALSE
return ExecRemote('[ThisDocument.ddeaction( "merge", "")]', 'Winword',
'System') = 1
CASE 'senddata'
if isvalid(optionsobject) then optionsobject.event _action('ddesend',
pathname) &
else return FALSE
return TRUE
CASE 'options'
if not super::event _action(action,data) then return FALSE
if optionsobject.visible then optionsobject.event _action('retrieve','')
CASE ELSE
return super::event _action(action,data)
END CHOOSE
return''
WORD:
Private Sub Document_open()
Bookmarks.Add Range:=Range(0, 1), Name:="DMUAnswer"
End Sub
Sub ddeaction(action As String, value As String)
Select Case action
Case "update"
ThisDocument.Fields.Update
Case "activate"
Documents(value).Activate
Case "showcodes"
Application.Activate
ThisDocument.Fields.ToggleShowCodes
Case "merge"
If ActiveDocument.MailMerge.State = wdMainAndDataSource Then
ActiveDocument.MailMerge.Execute
ThisDocument.Close (wdDoNotSaveChanges)
End If
End Select
End Sub
PS. Sorry, если не очень красиво, писалось давно...
А переделывать влом, и так все работает.