Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.10.20;
Скачать: CL | DM;

Вниз

Копировать из одного документа 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.006 c
1-1316694379
samalex2504
2011-09-22 16:26
2013.10.20
В TDateTimePicker автоматический переход от дней к месяцу и году


2-1359124701
pioli
2013-01-25 18:38
2013.10.20
Change wallpaper! Help


15-1367589979
Jambo
2013-05-03 18:06
2013.10.20
RAD Stuido XE3


15-1367958603
Юрий
2013-05-08 00:30
2013.10.20
С днем рождения ! 8 мая 2013 среда


1-1317222763
Ольга
2011-09-28 19:12
2013.10.20
Отображение в гриде текстов на иврите