Форум: "Начинающим";
Текущий архив: 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