Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копировать из одного документа MSWord в другой, без буфера обмена [D7]


Страницы:   1 2

O'ShinW ©   (2013-01-22 16:19:00) 

Запущен Ворд 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;
 получаю ошибку "Объект уничтожен"


O'ShinW   (2013-01-24 13:31:00) [1]

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


> sniknik ©

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


O'ShinW   (2013-01-22 20:42:00) [2]


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

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


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


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


O'ShinW   (2013-01-22 19:12:00) [4]

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

> sniknik ©


> clickmaker ©

Спасибо!


O'ShinW   (2013-01-22 18:20:00) [5]


> 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));
и т.п.

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

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


sniknik   (2013-01-22 18:19:00) [6]

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


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

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

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

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


clickmaker   (2013-01-22 17:49:00) [8]

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

не?


sniknik   (2013-01-22 17:44:00) [9]

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


sniknik   (2013-01-22 17:41:00) [10]

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


O'ShinW   (2013-01-22 17:37:00) [11]

17 к 14

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


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

да..
воот :)

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

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

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


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

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


O'ShinW   (2013-01-22 17:26:00) [14]


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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


O'ShinW   (2013-01-22 17:05:00) [18]


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

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


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

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


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

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


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

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

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

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


а

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


sniknik   (2013-01-22 16:53:00) [19]

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


sniknik   (2013-01-22 16:50:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо