Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Набор закладок в вордовском документе   Найти похожие ветки 

 
ИМХО ©   (2004-10-06 22:09) [0]

Здравствуйте.

Ситуация такова: имеется вордовский документ, с которым я работаю через OLE-автоматизацию.

Задача: получить список закладок, но не по имени, а по положению.

Дело в том, что если делать так:
 WD := CreateOleObject("Word.Application");
 WD.Visible := False;
 WD.Documents.Open("документ.doc");
 BookM_Count := WD.ActiveDocument.Bookmarks.Count;
 for I := 1 to BookM_Count do
   ListBox.Items.Add(WD.ActiveDocument.Bookmarks.Item(I).Name);

то получаем список по имени.

Как получить список закладок по положению в документе???


 
Babay ©   (2004-10-07 09:26) [1]

WD.ActiveDocument.Bookmarks.item(i).Range.BookmarkID - так можно получить номер закладки по расположению в документе, дальше сортируй и выводи сам ручками.

Успехов.


 
ИМХО ©   (2004-10-08 08:00) [2]

Спасибо за ответ.

Интересная ситуация получается с некоторыми документами. Бывают такие, что несколько закладок имеют одинаковый BookmarkID.

Как это понимать?


 
ИМХО ©   (2004-10-11 09:32) [3]

up!


 
YurikGL ©   (2004-10-11 10:30) [4]


> ИМХО ©


У WD.ActiveDocument.Bookmarks.item(i). есть свойство start которое характеризует, если не ошибаюсь, номер символа, после которого стоит начало диапазона закладки. Можешь отсортировать по нему.


 
ИМХО ©   (2004-10-11 11:01) [5]

YurikGL, привет!

У меня тут с OLE-автоматизацией Ворда проблема за проблемой.
Пытаюсь кусок вордовского файла, заданного закладкой, сохранить на диск?

уже все перепробовал (вроде бы), но он сохраняет весь документ на диск.

не подскажешь, как решить проблему?


 
YurikGL ©   (2004-10-11 11:30) [6]


> ИМХО ©   (11.10.04 11:01) [5]

Самый простой способ -
Выделяешь текст между закладками. Пихаешь в буфер. Создаешь новый документ. Из буфера вставляешь нужный кусок. Затем сохраняешь.


 
ИМХО ©   (2004-10-11 12:02) [7]

Не получается выделить закладку и скопировать ее в буфер :(

     Pos := WD.ActiveDocument.Bookmarks.Item(I).Range.Start;
     Pos2 := WD.ActiveDocument.Bookmarks.Item(I).Range.End;
     myRange := WD.ActiveDocument.Range(Pos, Pos2).Select;
     WD.Selection.Copy;


 
ИМХО ©   (2004-10-11 12:03) [8]

по какому-то року Pos и Pos2 равны, и WD.Selection.Copy дает ошибку ("Нет выделенного текста")


 
ИМХО ©   (2004-10-11 12:07) [9]

так тоже не работает:

     Pos := WD.ActiveDocument.Bookmarks.Item(I).Start;
     Pos2 := WD.ActiveDocument.Bookmarks.Item(I).End;


 
YurikGL ©   (2004-10-11 12:12) [10]


> ИМХО ©   (11.10.04 12:02) [7]

Дык ты выделяй текст между закладками...


 
YurikGL ©   (2004-10-11 12:20) [11]


> по какому-то року Pos и Pos2 равны, и WD.Selection.Copy
> дает ошибку ("Нет выделенного текста")

Когда ставишь закладку, сохраняется текущий выбранный диапазон.  Если у тебя, в момент установки закладки был выбран текст, то в start будет первый символ выбранного текста, а в end_ - последний. Однако если у тебя в момент установки закладки выбранного текста не было, то и в start и в end_ сохранится положение курсора.

Кстати, я использую компоненты и у меня end_ идет с подчеркиванием.


 
Babay ©   (2004-10-11 12:27) [12]

А если так ?

 Pos := WD.ActiveDocument.Bookmarks.Item(I).Start;
 Pos2 := WD.ActiveDocument.Bookmarks.Item(I+1).Start;
 WD.ActiveDocument.Range(Pos, Pos2).Select;
 WD.Selection.Copy;

У меня так сработало, только надо учесть ситуацию что для последнего значения I нет I+1 поэтому здесь End это конец документа


 
ИМХО ©   (2004-10-11 12:43) [13]


> Babay ©   (11.10.04 12:27) [12]


это хороший способ, но я юзаю закладки по положению, а не по имени.


 
ИМХО ©   (2004-10-11 12:44) [14]


> YurikGL ©   (11.10.04 12:12) [10]
>
> > ИМХО ©   (11.10.04 12:02) [7]
>
> Дык ты выделяй текст между закладками...


Как, маэстро?????


 
YurikGL ©   (2004-10-11 12:49) [15]


> ИМХО ©   (11.10.04 12:44) [14]


Сначала пробегаешься по всем закладкам, в массив сохраняешь их start-ы. Потом массив сортируешь. Далее пробегаешься по отсортированному массиву. В чем проблемы?


 
ИМХО ©   (2004-10-11 12:53) [16]

как это всё не по людски...

решение должно быть красивым, с использованием минимального кол-ва кода


 
ИМХО ©   (2004-10-11 12:55) [17]


> YurikGL ©   (11.10.04 12:20) [11]
> Кстати, я использую компоненты и у меня end_ идет с подчеркиванием.


end_ нету в Microsoft Word Visual Basic Reference


 
Babay ©   (2004-10-11 12:58) [18]

>>это хороший способ, но я юзаю закладки по положению, а не по имени.

????????
а я тебе что предложил? или я чего не понял?
I это одна закладка I+1 я имел ввиду следующуу за ней по положению.  Наверное я просто неверно выразил свою мысль.

в общем наверное YurikGL ©   (11.10.04 12:49) [15] точнее выразился.


 
YurikGL ©   (2004-10-11 12:59) [19]


> ИМХО ©   (11.10.04 12:53) [16]
> как это всё не по людски...
>
> решение должно быть красивым, с использованием минимального
> кол-ва кода

Ну можешь попробовать в самом ворде закладки отсортировать :-) А так, кода ИМХО не так уж и много...


 
ИМХО ©   (2004-10-11 13:39) [20]

А как всё-таки обойтись без танцев с бубном?

Я имею в виду, не сохранять в буфер, а затем выдергивать из него, а сохранять содержимое закладки напрямую на диск?

Метод SaveAs относится к объекту Document.
WD.Selection имеет свойство Document.

Но когда я делаю так:
WD.Selection.Document.SaveAs

этот, пардон, чудак на букву М сохраняет ВЕСЬ документ.


 
ИМХО ©   (2004-10-11 17:56) [21]

up!


 
YurikGL ©   (2004-10-11 19:59) [22]


> ИМХО ©   (11.10.04 13:39) [20]

Послушай, насколько я знаю ворд, он принципиально не может сделать то, что ты хочешь. Ну, наверное, можно скопировать без использования буфера, но сохранить в отдельный документ часть текста без создания этого нового документа, по моему, нельзя.

Максимум, что я могу еще посоветовать - анализ выбранного текста+формирование нового документа не средствами ворд, а ручками... Или еще один невидимый ворд запустить...


 
ИМХО ©   (2004-10-11 21:15) [23]

да, наверное, ты прав.
наверное, я слишком многого хочу.
скромнее нужно быть...


 
Babay ©   (2004-10-12 05:57) [24]

А как формируется документ, ежели не секрет? Сам формируешь или он уже готовый в каком то виде? Может опишешь немного задачу и найдется другое (красивое) решение?


 
ИМХО ©   (2004-10-12 09:41) [25]

да, он уже готовый, с закладками

нужно вырвать некоторые куски и сохранить их на диск


 
Babay ©   (2004-10-12 09:52) [26]

Вот тока что нарвался, сам не проверял может тебе кое что из этого пойдет или натолкнет на мысль . Пересылаю как есть

Импорт активного документа Word
--------------------------------------------------------------------------------

Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Импорт активного документа Word

Импортирует текст активного документа Word в объект класса TStrings
(без форматирования). Если при открытом Worde результат отрицательный -
рекомендуется перезапустить приложение, поскольку дальнейшие вызовы
функции в подавляющем большинстве случаев будут приводить к ошибке

Зависимости: OleServer, Word97
Автор:       Dimka Maslov, mainbox@endimus.com, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        6 февраля 2004 г.
***************************************************** }

function ImportWordActiveDocument(Strings: TStrings): Boolean;
var
 Word: TWordApplication;
 Start, End_: Integer;
begin
 Result := True;
 try
   Word := TWordApplication.Create(nil);
   try
     Word.AutoConnect := False;
     Word.AutoQuit := False;
     Word.ConnectKind := ckRunningInstance;
     Word.Connect;
     Start := Word.Selection.Get_Start;
     End_ := Word.Selection.Get_End_;
     Word.Selection.SetRange(0, $7FFFFFFF);
     Strings.Text := Word.Selection.Text;
     Word.Selection.SetRange(Start, End_);
     Word.Disconnect;
   finally
     Word.Free;
   end;
 except
   Result := False;
 end;
end;

// Пример использования:
if not ImportWordActiveDocument(Memo1.Lines) then
 ShowMessage("Error");


Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay


 
ИМХО ©   (2004-10-12 10:02) [27]

спасибо, но мне кажется, это бред

пусть YurikGL выскажется


 
Babay ©   (2004-10-12 11:03) [28]

Тебе кажется или проверил? Это достаточно надежный источник.
Здесь предлагается взять выделенный текст и засунуть в TStrings, далее можно сохранить в файл. Правда форматирование и прочие штучки вордовские потеряются.... Но если это не пренципиально и нужен только текст, то по моему решение нормальное.

З.Ы. Сам бы проверил да некогда, а вот тебе как раз на это время убить можно. Не надо голословно заявлять что это бред.


 
ИМХО ©   (2004-10-12 11:13) [29]

нет, фишка в том, что форматирование ОЧЕНЬ НУЖНО. Ворд хорош форматированием (и не только им)


 
Babay ©   (2004-10-12 12:30) [30]

ну тогда по моему только через буфер....
Лично я невидел функции создать документ из выделенного или сохранить только выделенное, хотя печать выделенного фрагмента есть....


 
Babay ©   (2004-10-12 12:42) [31]

З.Ы. вот еще подумалось а может открыть документ убрать все НЕНУЖНОЕ и сохранить как....  Хотя тоже не очень красиво и кривовато :-(


 
YurikGL ©   (2004-10-12 14:40) [32]


> ИМХО ©   (12.10.04 10:02) [27]
> спасибо, но мне кажется, это бред
>
> пусть YurikGL выскажется

Не проверял, но ИМХО работать будет. Однако же проблемы это не решает.


 
ИМХО ©   (2004-10-12 14:52) [33]

TStrings и MS Word... несерьезно это как-то...

вордовский формат - это бинарный формат, его в TStrings не запихнешь.

другое дело, если бы RTF...
он текстовый, но описывает форматирование и прочие заморочки


 
ИМХО ©   (2004-10-12 14:59) [34]

кстати, давно хотел узнать, почему некоторые (например, YurikGL) так любят ранне связывание?

по идее, скомпилированный модуль привязан к той версии офисной библиотеки, которая установлена у разработчика, а у юзверя она может не пойти, так?


 
YurikGL ©   (2004-10-12 15:23) [35]


> почему некоторые (например, YurikGL) так любят ранне связывание?

Да вроде работает быстрее, хотя и глючнее. А по поводу привязки, использую 2000-е компоненты, проблем не встречал ни разу.


 
ИМХО ©   (2004-10-12 17:06) [36]

Господа!
Последняя заморочка осталась.

Таблы с сохранением последней закладки.
Как узнать позицию последнего символа в документе?
(иначе опять - "Выделенного текста нет")


 
ИМХО ©   (2004-10-13 09:15) [37]


> YurikGL ©   (12.10.04 15:23) [35]
>
> > почему некоторые (например, YurikGL) так любят ранне связывание?
>
> Да вроде работает быстрее, хотя и глючнее.


а что лучше: быстрее, но глючнее, или медленнее, но надежнее?


 
ИМХО ©   (2004-10-13 14:15) [38]

ась?


 
YurikGL ©   (2004-10-13 14:18) [39]


> ИМХО ©   (13.10.04 09:15) [37]

Это как сам решишь :-)

Через раннее связывание, обычно, больше мудохаешься, но работает в итоге быстрее, а через позднее - наоборот.

А еще, это - сила привычки.


 
ИМХО ©   (2004-10-13 17:27) [40]

понятно.
а как таки узнать позицию последнего символа в документе?



Страницы: 1 2 вся ветка

Форум: "Corba";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.032 c
4-1117600220
КиТаЯц
2005-06-01 08:30
2005.07.31
Своя закладка в "Свойства файла"


6-1114362406
Kosald
2005-04-24 21:06
2005.07.31
Страница в новом окне


1-1121087371
webpauk
2005-07-11 17:09
2005.07.31
Удаление компонента изнутри


14-1120591020
Гаврила
2005-07-05 23:17
2005.07.31
Код да Винчи


4-1117125568
чип
2005-05-26 20:39
2005.07.31
Как считать файл по битам?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский