Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Создание таблицы в Word-е


Автор: GraNit 21.12.2009, 08:55
Здравствуйте, Уважаемые господа!

Столкнулся с проблемой переноса кода Delphi на C++ Builder 5.
Мне по наследству досталась прога на С++, приходится поддерживать. Суть в следующем: требуется создать таблицу в ВОРДЕ и запихать туда данные. На Дельфях это выглядет вполне просто:
Код

     // y - строки
     // x - столбцы
      WordApplication1.Selection.Tables.Add(WordApplication1.Selection.Range, y,x,EmptyParam, EmptyParam);
      Tbl := WordApplication1.Selection.Tables.Item(1);
      Tbl.Borders.InsideLineStyle := wdLineStyleSingle;
      Tbl.Borders.OutsideLineStyle := wdLineStyleSingle;

ну и так далее... Все замечательно работает.
А на С++ не могу.
Код

        // Вставляем таблицу
        My_Word_App->Selection->Tables->Add(My_Word_App->Selection->Range, 1,6,EmptyParam, EmptyParam);
        // Вот здесь собака и порылась. Две следующие строки не правильные.
        Table *Tbl = new Table(this);
        Tbl = *My_Word_App->Selection->Tables->Item(1);


На объявление Tbl компилятор ругается: Cannot create instance of abstract class 'Table'
Прошу помощи, Уважаемые господа!!!

Автор: smoke_man 21.12.2009, 09:38
А если так:
Код

RangePtr MyRange = My_Word_App->Selection->Range;
TablePtr MyTable = MyRange->Tables->Add(MyRange, 1, 6, EmptyParam, EmptyParam);
MyTable->Columns->Item(1)->SetWidth(125, wdAdjustNone);

Автор: vikaz 21.12.2009, 09:38
А может надо так?
Код

TTable *Tbl = new TTable(this);

Автор: Usper 21.12.2009, 09:45
Обязательно использовать стандартные компоненты Borland`а?  Вот вариант без них:
Код
#include  <ComObj.hpp>
void Foo (void)
{
    Variant VWord;
    Variant VDoc;
    Variant VTable;
    VWord=CreateOleObject("Word.Application");
    VWord.OlePropertySet("Visible",true);
    VWord.OlePropertyGet("Documents").OleProcedure("Add");
    VDoc=VWord.OlePropertyGet("Documents").OleFunction("Item",1);
    VDoc.OlePropertyGet("Paragraphs").OleProcedure("Add");
    VDoc.OlePropertyGet("Tables").OleProcedure("Add",
        VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",1).OlePropertyGet("Range"), // здесь указываем место куда надо вставить таблицу (в данном случае параграф 1)
        3, //кол-во строк
        9, //кол-во столбцов
        1, //если ноль - то у таблицы невидимые границы
        0); //если единица - то таблица не растягивается на всю страницу по ширине
    VTable=VDoc.OlePropertyGet("Tables").OleFunction("Item",1);
        VTable.OleFunction("Cell",1,2).OlePropertyGet("Range"). OlePropertySet("Text","Данные"); //Запихиваем в таблицу данные
}


Автор: GraNit 21.12.2009, 10:41
2 vikaz

Пробовал, не пойдет. TTable это не Table. Тоже думал, что Table может оказаться каким-нить там родителем для TTable. Компилятор ругается. Грит, что не может преобразовать Table в TTable.

2 smoke_man
Цитата(smoke_man @ 21.12.2009,  09:38)
А если так:
Код

RangePtr MyRange = My_Word_App->Selection->Range;
TablePtr MyTable = MyRange->Tables->Add(MyRange, 1, 6, EmptyParam, EmptyParam);
MyTable->Columns->Item(1)->SetWidth(125, wdAdjustNone);

А TablePtr объявим как? Так?
Код

Table *TablePtr = new Table (this);

Ошибка будет та же. У меня проблема с объявлением класса (или объекта, как правильно?), а потом мне нужно наследовать все свойства от My_Word_App->Selection->Tables->Item(1).
Или что-то я не понимаю?

2 Usper

Так не обязательно, но в OLE классе я пока не разбирался.
Понимаю, что это подходящий момент... но видите, даже с нормальным объявлением класса разобраться не могу smile

Автор: smoke_man 21.12.2009, 10:59
Посмотри http://forum.sources.ru/index.php?showtopic=51366 Там приведена статья по работе с msword из Builder`а.

Автор: GraNit 21.12.2009, 11:28
Цитата(smoke_man @ 21.12.2009,  10:59)
Посмотри http://forum.sources.ru/index.php?showtopic=51366 Там приведена статья по работе с msword из Builder`а.

Интересная штука TablePtr. Только не понятная, откуда она взялась? smile
Все работает, Уважаемые господа!
Приношу извинения smoke_man-у. Совет был правильный. Из-за незнания не проверил.
Вопрос закрыт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)