![]() |
| ||
|
|
Новости |
Поиск |
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;
получаю ошибку "Объект уничтожен"
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 т.е. -
не? т.е. пример работает, т.е. правда, почему не посмотреть остальное?