Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.10.20;
Скачать: [xml.tar.bz2];

Вниз

Копировать из одного документа MSWord в другой, без буфера обмена   Найти похожие ветки 

 
O'ShinW ©   (2013-01-22 16:19) [0]

Запущен Ворд W
W := CreateOleObject("Word.Application");

Есть документ образец D1
D1 := W.Documents.Open(Pattern);

Есть новый документ D2
D2 := W.Documents.Add;

Хочу в новом документе D2 наделать страниц по образцу D1

  while not(DS.Eof) do
   begin
     Copy1Paste2(W, D1, D2, a, b);
     W.Selection.InsertBreak(OleVariant(7));
     W.Selection.Start := a;
     W.Selection.End := b;
     ReplaceByRecord(W, DS);
     DS.Next;
   end;

procedure TWordExporter.Copy1Paste2(W, D1, D2: Variant; a,b:Integer);
begin
 D1.Activate;
 D1.Range(a, b).Select;
 W.Selection.Copy;
 D2.Activate;
 W.Selection.Paste;
end
;

все работает. Но есть нюанс..
W.Selection.Copy помещает копируемое в системный буфер обмена, и если переключится на любое другое приложение, что-то скопировать в буфер и вставить, то вставится не ожидаемое, а содержимое шаблонного документа D1(равно как и скопированное в другом приложении может быть вставлено в D2).

Пытался писать
COPY_TEMPL := W.Selection;
 но потом в  
COPY_TEMPL.paste;
 получаю ошибку "Объект уничтожен"


 
sniknik ©   (2013-01-22 16:26) [1]

> Пытался писать
> ...
нафига??? че то смысл ускользает. напиши комментарии к своим действиям...

> помещает копируемое в системный буфер обмена
ну так, сохрани "системный буфер обмена" до, восстанови после... не?


 
clickmaker ©   (2013-01-22 16:33) [2]

а просто значение из Д1 нельзя присвоить в Д2 что-ли?


 
sniknik ©   (2013-01-22 16:36) [3]

у selection-ов куча методов кроме Copy и Paste вообще то (работать н вариантами а интерфейсами)... например есть Text т.е. -
W2.Selection.Text:= W1.Selection.Text;
должно сработать.


 
O'ShinW ©   (2013-01-22 16:38) [4]


> нафига??? че то смысл ускользает. напиши комментарии к своим
> действиям...

D1 := W.Documents.Open(Pattern);
D1.Range(a, b).Select;
COPY_TEMPL := W.Selection; //один раз, не в буфер взять, а в переменную

и потом
 while not(DS.Eof) do
  begin
    COPY_TEMPL.paste; // только вставлять, не копируя каждый раз
    W.Selection.InsertBreak(OleVariant(7));
    W.Selection.Start := a;
    W.Selection.End := b;
    ReplaceByRecord(W, DS);
    DS.Next;
  end;
----------


> ну так, сохрани "системный буфер обмена" до, восстанови
> после... не?

т.е. имеешь ввиду, аля так:

procedure TWordExporter.Copy1Paste2(W, D1, D2: Variant; a,b:Integer);
begin
D1.Activate;
PUSH_BUFF;
D1.Range(a, b).Select;
W.Selection.Copy;
D2.Activate;
W.Selection.Paste;
POP_BUFF;
end;

?
но могут поместить что-то в буфер м/д этими действиями.


 
O'ShinW ©   (2013-01-22 16:42) [5]


> а просто значение из Д1 нельзя присвоить в Д2 что-ли?

нет

d1 содержит всякое форматирование и разметку, на одном листе
#ACCOUNT#
#NAME#
#INN#                                                 #HOUSE_ID#

это все вставляется на первый лист нового документа
потом #FIELD# меняется по значению записи совпадающего поля DS
только на первом листе (что бы не парсил ворд все листы, т.к. долго. Там до тысячи может быть листов)

в d2 на выходе много листов, оформленных по образцу из d1

>> W2.Selection.Text:= W1.Selection.Text;
тогда разметка сбивается


 
O'ShinW ©   (2013-01-22 16:45) [6]


> но могут поместить что-то в буфер м/д этими действиями.

тогда  хук?
ну ,на изменение буфера..

а нельзя ли как-то все-таки куда то скопировать, не в буфер
а потом из него вставлять?


 
O'ShinW ©   (2013-01-22 16:46) [7]


> у selection-ов куча методов кроме Copy и Paste

смотрел.. Все через буфер идет


 
sniknik ©   (2013-01-22 16:48) [8]

> COPY_TEMPL := W.Selection; //один раз, не в буфер взять, а в переменную
Selection это объект в документе, т.что это не "взять в переменную" содержимое как ты похоже считаешь, а скопировать ссылку на этот объект к себе, "содержимое" где было там и осталось.

> COPY_TEMPL.paste; // только вставлять, не копируя каждый раз
а оно и не копируется каждый раз, если ты этого не сделал. (а бы делаешь см. Copy1Paste2).


 
sniknik ©   (2013-01-22 16:50) [9]

>>> W2.Selection.Text:= W1.Selection.Text;
> тогда разметка сбивается
еще раз
> у selection-ов куча методов кроме Copy и Paste вообще то (работать н вариантами а интерфейсами)... например есть Text т.е. -
не? т.е. пример работает, т.е. правда, почему не посмотреть остальное?


 
sniknik ©   (2013-01-22 16:53) [10]

> смотрел.. Все через буфер идет
врешь. давай возьмем например Text ... буфер меняется ???


 
O'ShinW ©   (2013-01-22 17:05) [11]


> врешь. давай возьмем например Text ... буфер меняется ??
> ?

нет. Но и не работает, форматирование другое получается.


> Selection это объект в документе,
т.что это не "взять в переменную" содержимое как ты похоже считаешь, а скопировать ссылку на этот объект к себе, "содержимое" где было там и осталось.

понимаю. Я взял только указатель. Я об этом сказал, когда написал что получил ошибку.
Надеялся,что Variant может как-то сам выделится / создаться.


> а оно и не копируется каждый раз, если ты этого не сделал.

Copy1Paste2. - это я так сейчас написал.
Раньше постоянно не копировал заново, копировал один раз.
и любое использование буфера плодило тысячи страниц с содержимым отличным от D1, равным тому ,что скопировали в буфер.


>  у selection-ов куча методов кроме Copy и Paste вообще то

Хорошо, взял я текст. Он вставится. только будет не

           (Логотип(картинка))

Адрес                    
                       Дорогой, ФИО


а

(Логотип(картинка))
Адрес
Дорогой, ФИО


 
clickmaker ©   (2013-01-22 17:11) [12]

так форматирование, вроде как, отдельно можно взять-присвоить.


 
sniknik ©   (2013-01-22 17:13) [13]

> нет. Но и не работает
работает. так как ему положено, это текст. не самообманывайся, называй вещи своими именами.

> Хорошо, взял я текст. Он вставится. только будет не
я тебе не навязываю текст, я его как пример привел. и ты не делай одолжений "хорошо беря" его, тебе очевидно нужно другое ... еще раз - там КУЧА методов.


 
sniknik ©   (2013-01-22 17:15) [14]

> так форматирование, вроде как, отдельно можно взять-присвоить.
там не только форматирование, там вообще все что ворд делает можно извне "дергая за веревочки" реализовать... теоретически. т.к. как конкретно это надо разбираться, а это дело пишущего.


 
O'ShinW ©   (2013-01-22 17:26) [15]


> работает. так как ему положено, это текст. не самообманывайся,
>  называй вещи своими именами.

Что так будет работать - я знаю. Поэтому и даже не рассматривал вариант.


> тебе очевидно нужно другое ... еще раз - там КУЧА методов

Открыл макрос, набрал Selection(.) посмотрел.
не очень много.
Некоторые уже пробовал (класс писался мной еще год назад, тогда ни к чему н пришел, помнится. Просто сейчас решил дописать по-человечески)


> и ты не делай одолжений

мне совершенно незачем повышать шрифт :)  на кого бы то ни было, тем более на такого уважаемого мной человека, как ты.
Сказал же так, потому чт ты настойчиво предлагал использовать TEXT (хоть и , например)


> так форматирование, вроде как, отдельно можно взять-присвоить.

наверное..
но потом, скорее всего, придется прыгать по абзацам, строкам вручную..
т.е. не получится вроде такого
format := такой, text := такой
и 1:1 по образцу.


 
sniknik ©   (2013-01-22 17:34) [16]

> Открыл макрос, набрал Selection(.) посмотрел.
> не очень много.
не поленился, повторил, посчитал - 159 свойств/методов вперемешку, разделать/считать вложенные от "подобьектов" не стал.
да, мизер совсем.


 
O'ShinW ©   (2013-01-22 17:35) [17]

да..
воот :)

поэтому, я сразу и спросил, как бы мне
>Копировать из одного документа MSWord в другой, без буфера обмена

Например, один из вариантов, который представляется простым, имхо:
Весь selection насильно переписать в другую, не глобальную переменную,
может ей выделить, установить размер подходящий, и просто переместить туда из selection всё.

т.е. тот же
COPY_TEMPL := W.Selection;
но "вручную"
не приравнять указатель, а создать/ наполнить


 
O'ShinW ©   (2013-01-22 17:37) [18]

17 к 14

к 16
159  свойств/методов - это всего.
Там про Copy|PAste и аналогичных - немного


 
sniknik ©   (2013-01-22 17:41) [19]

> Там про Copy|PAste и аналогичных - немного
где логика? ты пишешь о проблеме с ними, хочешь по другому, а ищешь среди аналогичных... хотя искать нужно как раз во всех оставшихся.


 
sniknik ©   (2013-01-22 17:44) [20]

> всех оставшихся
НАПРИМЕР в "Text аналогичных", раз он работает так тебе нужно но без форматирования...


 
clickmaker ©   (2013-01-22 17:49) [21]

S1 := D1.Selection.FormattedText;
D2.Selection.FormattedText:= S1;

не?


 
O'ShinW ©   (2013-01-22 18:14) [22]

намекаешь на FormattedText?
Да, это почти как нужно..

Но, почти. Потому что еще картинки-логотипы не берутся и размеры листа не те, а по-умолчанию.
Картинки можно, конечно, и потом вставить. И размеры задать.

А если первый раз все-таки целиком вставить, как раньше, то и размеры задавать не надо, по размерам первого листа идет.


 
sniknik ©   (2013-01-22 18:19) [23]

> Но, почти.
рассмотрели 2, осталось 157 свойств/методов (155 без 2-х в [0]).


 
O'ShinW ©   (2013-01-22 18:20) [24]


> S1 := D1.Selection.FormattedText;
> D2.Selection.FormattedText:= S1;
>

ну да, почти

  W.Selection.Copy;
  COPY_TEMPL := W.Selection.FormattedText;
  D2 := W.Documents.Add;
  W.Selection.Paste; // для размеров листов
  while not(DS.Eof) do
  begin
     W.ActiveDocument.Range.FormattedText := COPY_TEMPL;
     W.Selection.InsertBreak(OleVariant(7));
и т.п.

В принципе, картинками теперь попадать осталось..
и таблицами
и еще чем-нибудь
но сначала проверить есть ли они..

блин, проще, наверное, буфер обмена залочить..


 
O'ShinW ©   (2013-01-22 19:12) [25]

нет, все-таки надо сделать уж

> sniknik ©


> clickmaker ©

Спасибо!


 
брат Птибурдукова   (2013-01-22 19:50) [26]


> O"ShinW ©   (22.01.13 16:42) [5]
Хе, делал такое же, когда лотусом занимался, только там не ворд был, а эксель. Если мне не изменяет склероз, мы тупо копировали файл шаблона (не через буфер, естественно), а потом копию наполняли данными.


 
O'ShinW ©   (2013-01-22 20:42) [27]


> брат Птибурдукова   (22.01.13 19:50) [26]

У екселя есть хороший метод copyto(destination), в обход буфера


 
O'ShinW ©   (2013-01-24 13:31) [28]

D2.Range(0,0).InsertFile( Pattern );
никакого буфера..


> sniknik ©

и не надо ничего говорить :)
ps
Спасибо!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.10.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.002 c
1-1317222763
Ольга
2011-09-28 19:12
2013.10.20
Отображение в гриде текстов на иврите


8-1214420600
Пётр
2008-06-25 23:03
2013.10.20
Альбомная графика в mp3


15-1367872203
Юрий
2013-05-07 00:30
2013.10.20
С днем рождения ! 7 мая 2013 вторник


1-1316769751
fd979
2011-09-23 13:22
2013.10.20
Экспорт в Excel


15-1367775508
NailMan
2013-05-05 21:38
2013.10.20
Еще не забыли летуна?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский