![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копировать из одного документа MSWord в другой, без буфера обмена [D7]
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]> Пытался писать
> ...
нафига??? че то смысл ускользает. напиши комментарии к своим действиям...
> помещает копируемое в системный буфер обмена
ну так, сохрани "системный буфер обмена" до, восстанови после... не?