Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WORD OLE - анализ слов в строке, нужно проанализировать стили слов 
:(
    Опции темы
gAlexKo
Дата 23.3.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Решил позаниматься программированием в OLE на C++(я использую CBULDER) и придумал такую задачу:

Представьте строку в WORD документе из 5 слов с разными (произвольными) стилями
Например:

one two three four

где 
1 слово "one" написано нормальным фонтом
2. курсивом
3. утолщенным
4. перечеркнутым

Нужно составить отчет и написать какое слово как написано:
типа
1 слово - норма
2 слово 0 курсив и т.д.

Начал я было делать,  

  launch_word();
  my_app.OlePropertySet("Visible",true);
  my_doc =  my_app.OlePropertyGet("Documents");
  this_doc = my_doc.OleFunction( "Open", TVariant(dlg_open_word_doc->FileName.c_str()) );
  this_doc.OleProcedure("Activate");
  my_paras = this_doc.OlePropertyGet("Paragraphs");
  my_para = my_paras.OleFunction("Item",1);

Что дальше делать? Если кто захочет помочь закончить эту задачу, то я буду очень признателен. Что-то у меня недостаточно материалов на эту тему.
PM MAIL   Вверх
gAlexKo
Дата 24.3.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(gAlexKo @ 23.3.2011,  12:59)
Решил позаниматься программированием в OLE на C++(я использую CBULDER) и придумал такую задачу:

Представьте строку в WORD документе из 5 слов с разными (произвольными) стилями
Например:

one two three four

где 
1 слово "one" написано нормальным фонтом
2. курсивом
3. утолщенным
4. перечеркнутым

Нужно составить отчет и написать какое слово как написано:
типа
1 слово - норма
2 слово 0 курсив и т.д.

Начал я было делать,  

  launch_word();
  my_app.OlePropertySet("Visible",true);
  my_doc =  my_app.OlePropertyGet("Documents");
  this_doc = my_doc.OleFunction( "Open", TVariant(dlg_open_word_doc->FileName.c_str()) );
  this_doc.OleProcedure("Activate");
  my_paras = this_doc.OlePropertyGet("Paragraphs");
  my_para = my_paras.OleFunction("Item",1);

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

Попробую упростить вопрос уважаемому All и переквалифицировать его. Я копаю конечно сам, но нахожу, что никак не могу найти простой и нужной информации. К примеру, я нашел как анализировать слова параграфа:

 my_range  = my_para.OlePropertyGet("Range");
 my_words = my_range.OlePropertyGet("Words");  //слова параграфа
 my_word_count = my_words.OlePropertyGet("Count"); //число слов

  for( int i=1; i<=my_word_count; i++ ) //анализируем слова
  {
   my_word =  my_words.OleFunction( "Item", (Variant) i );  //получаем слово
  ...

  }

Но дальше я не знаю из каких пропертей состоит к примеру my_word. Где можно посмотеть иерархию объектов MSWord? Типа "параграф состоит из words, words состоит из word, аттрибуты которых имеет такие  то и такие проперти. А то получается я в темноте и делаю все на ощупь. Или вынужден искать по интернету примеры, которых часто нет для моих нужд.
PM MAIL   Вверх
ViterAlex
Дата 25.3.2011, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 7.10.2009
Где: Харьков

Репутация: 7
Всего: 7



my_word у тебя будет объектом типа Range. Вообще, любой кусок текста — абзац, предложение, слово или буква это объект типа Range.
Все свойства этого объекта ты можешь найти в справке Word для разработчика.
Тебе в данном случае нужен шрифт (Font), характеризующий твоё слово. А у шрифта тебе нужно проверить свойства Bold, Italic, Underline и StrikeThrough. Сами эти свойства могут быть принимать три значения: True (1), False (0) и wdUndefined (9999999). Значение wdUndefined будет в том случае, если, например, в слове одна буква наклонная, а другая нет. Тогда у свойства Italic будет значение wdUndefined
Как-то так
PM MAIL WWW ICQ   Вверх
gAlexKo
Дата 25.3.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(ViterAlex @ 25.3.2011,  04:14)
my_word у тебя будет объектом типа Range. Вообще, любой кусок текста — абзац, предложение, слово или буква это объект типа Range.
Все свойства этого объекта ты можешь найти в справке Word для разработчика.
Тебе в данном случае нужен шрифт (Font), характеризующий твоё слово. А у шрифта тебе нужно проверить свойства Bold, Italic, Underline и StrikeThrough. Сами эти свойства могут быть принимать три значения: True (1), False (0) и wdUndefined (9999999). Значение wdUndefined будет в том случае, если, например, в слове одна буква наклонная, а другая нет. Тогда у свойства Italic будет значение wdUndefined
Как-то так

Да, спасибо я докопался тоже. Вот только проперти объектов я был вынужден смотреть в заголовочном файле word_2k.h. Неужели нигде нет доступной документации в нормальном виде? Кстати, я правильно понял, что нет способа узнать что слов написано обычным шрифтом не сделав впереди анализ исключающий Bold Italic и т.п. 

Вот цикл анализа слов параграфа который я сделал:

  for( int i=1; i<=my_word_count; i++ ) //analyse of words
  {
   my_word =  my_words.OleFunction( "Item", (TVariant) i );  //getting a word
   astr = AnsiString(my_word.OlePropertyGet("Text")).Trim();
   if(astr.IsEmpty()) continue;   //если текст начался с пробелов
   my_word_font = my_word.OlePropertyGet("Font");
   my_word_style = my_word.OlePropertyGet("Style");

      //теперь анализируем атрибуты слов
   if(italic_word.IsEmpty())
   if(my_word_font.OlePropertyGet("Italic"))
      { italic_word = my_word.OlePropertyGet("Text") + (AnsiString)" - is italic; ";  continue; }

   if(bold_word.IsEmpty())
   if(my_word_font.OlePropertyGet("Bold"))
      { bold_word = my_word.OlePropertyGet("Text") + (AnsiString)" - is bold; ";  continue; }

   if(cross_word.IsEmpty())
   if(my_word_font.OlePropertyGet("StrikeThrough"))
    {cross_word = my_word.OlePropertyGet("Text") + (AnsiString)" - is crossed; ";  continue; }

   if(norm_word.IsEmpty())
      { norm_word = my_word.OlePropertyGet("Text") + (AnsiString)" - is normal; "; continue; }
  }

  astr = norm_word + italic_word + bold_word + cross_word;
  ShowMessage(astr);
  close_word(); //стандартная процедура закрытия

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.