Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание таблицы в воде и её редактирование. 
:(
    Опции темы
westt
Дата 19.4.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

WordApplication1->Documents->Add(EmptyParam, EmptyParam);
WordDocument1->ConnectTo( WordApplication1->ActiveDocument);
WordApplication1->set_Visible(true);
WordApplication1->Selection->InsertAfter(TVariant ("ghbdtn"));
WordApplication1->Selection->InsertAfter(TVariant ("\n"));
TVariant Direction = wdCollapseEnd ;
WordApplication1->Selection->Collapse(Direction);

Clipboard()->Assign(Image1->Picture);
WordApplication1->Selection->Paste();
Direction = wdCollapseEnd ;
WordApplication1->Selection->Collapse(Direction);

WordApplication1->Selection->Tables->Add(WordDocument1->Range(EmptyParam, EmptyParam), 8, 7, EmptyParam, EmptyParam);


Задача: сначала должен вставляться текст, потом картинка, потом табличка. А получается, что табличка вставляется вместо всего что было раньше написано. Как сделать так, чтобы таблица вставлялась после текста и картинки?
PM MAIL   Вверх
Klin
Дата 20.4.2009, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У меня раньше не было необходимости возиться с WordApplication, но после 10-ти минут пришел к следующему. Если вы нажмете на отмену действия в ворде, то поймете, как происходят все действия. У вас была ошибка в использовании Selection (я не уверен, что для вставки текста тоже нужно его использовать) и Range у вас был в свободном плавании.

Код

WordApplication1->Documents->Add(EmptyParam, EmptyParam);
WordDocument1->ConnectTo(WordApplication1->ActiveDocument);
WordApplication1->set_Visible(true);
WordApplication1->Selection->InsertAfter(TVariant ("ghbdtn\n"));
WordApplication1->Selection->Collapse();
Clipboard()->Assign(Image1->Picture);
WordApplication1->Selection->Paste();

WordApplication1->Selection->Collapse();

WordApplication1->ActiveDocument->Tables->Add(WordDocument1->Range(TVariant(8), TVariant(8)), 8, 7, EmptyParam, EmptyParam);



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Usper
Дата 20.4.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот кусок кода, который делает всё перечисленное:
Код

Variant vVarApp, vVarDoc,vVarDocs, vVarParagraphs, vVarParagraph, vVarRange,
        vVarTables, vVarTable;


    try
    {
        vVarApp=CreateOleObject("Word.Application"); //"указатель" на приложение
    }
    catch(...)
    {
        ShowMessage("Ошибка открытия сервера Word.");
        return;
    }
    vVarApp.OlePropertySet("Visible",true);
    vVarDocs=vVarApp.OlePropertyGet("Documents"); //"указатель" на все документы Word`а открытые сейчас
    vVarDocs.OleProcedure("Add");
    vVarDoc=vVarDocs.OleFunction("Item",1); //"указатель" на первый документ, открытый сейчас
    // int count=vVarDocs.OlePropertyGet("Count") //количество открытых документов в данный момент
    vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs"); //"указатель" на все параграфы в документе
    vVarParagraphs.OleProcedure("Add"); //добавляем параграф в документ
    vVarParagraph=vVarParagraphs.OleFunction("Item",1);//"указатель" на первый параграф
    vVarParagraph.OlePropertyGet("Range").OlePropertySet("Text","феноменально большой кусок текста :-)");
    vVarParagraphs.OleProcedure("Add");
    vVarParagraph=vVarParagraphs.OleFunction("Item",2);
    vVarRange=vVarParagraph.OlePropertyGet("Range");
    vVarDoc.OlePropertyGet("Tables").OleProcedure("Add", vVarRange, 3, 9,1,1); //добавляем таблицу 3х9
    vVarTable=vVarDoc.OlePropertyGet("Tables").OleFunction("Item",1);
    vVarTable.OleFunction("Cell",1,2).OlePropertyGet("Range").
         OlePropertySet("Text","Куча текста"); //добавляем текст в ячейку, находящуюся в первой строке, второй колонке
    vVarParagraphs.OleProcedure("Add");
    int count;
    count=vVarParagraphs.OlePropertyGet("Count"); //общее количество параграфов
    vVarParagraph=vVarParagraphs.OleFunction("Item",count); //"ссылка" на последний параграф, внимание в этом примере кол-во параграфов на данный момент равно 33, судя по всему каждая ячейка таблицы - это параграф
    //vVarParagraph.OlePropertyGet("Range").OlePropertySet("Text","феноменально большой кусок текста :-)");
    vVarParagraph.OlePropertyGet("Range").OlePropertyGet("InlineShapes").OleFunction("AddPicture","c:\\1.bmp"); //вставляем картинку в документ

Рекомендую почитать http://wladm.narod.ru/Borland/olebegin.html

Это сообщение отредактировал(а) Usper - 20.4.2009, 09:48


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
westt
Дата 20.4.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как объединить несколько ячеек в таблице, созданной методом описанным выше?

Это сообщение отредактировал(а) westt - 20.4.2009, 21:21
PM MAIL   Вверх
Usper
Дата 21.4.2009, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Например так:
Код

    vVarTable.OleFunction("Cell",2,3).OleFunction("Merge",vVarTable.OleFunction("Cell",3,5));

В этом коде объединяются 6 ячеек от 2, 3 (2-я строка, 3-я колонка) до 3, 5 (3-я строка, 5-я колонка).

Да, кстати, не забудьте подключить ComObj.hpp.

Это сообщение отредактировал(а) Usper - 21.4.2009, 08:31


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
westt
Дата 21.4.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile  спасибо!  smile 
PM MAIL   Вверх
Usper
Дата 21.4.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, кстати, объединение ячеек не работает в 2007 Ворде :(. С этим 2007 офисом вообще беда: куча кода, который без проблем работает с офисом через OLE, в предыдущих версиях офиса не работет с этой версией :(. При том, что код, генерируемый макрорекордером (так я определяю какие команды надо дать офису, чтобы получить тот или иной эффект) абсолютно одинаков.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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