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


sniknik   (2013-01-22 16:48:00) [21]

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

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


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


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

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


O'ShinW   (2013-01-22 16:45:00) [23]


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

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

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


O'ShinW   (2013-01-22 16:42:00) [24]


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

нет

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

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

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

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


O'ShinW   (2013-01-22 16:38:00) [25]


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

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;

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


sniknik   (2013-01-22 16:36:00) [26]

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


clickmaker   (2013-01-22 16:33:00) [27]

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


sniknik   (2013-01-22 16:26:00) [28]

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

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


Страницы:   1 2

Наверх

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