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


Автор: =Женек= 19.8.2012, 10:36
Код

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");

text_temp="Отчет системы о дежурстве охраны за "+IntToStr(day)+"."+IntToStr(month)+"."+IntToStr(year)+" года.";
VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",1).OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Bold",1);
VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",1).OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Size",29);
VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",1).OlePropertyGet("Range").OlePropertySet("Text",text_temp.c_str());
VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",1).OlePropertyGet("Range").OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", 1);

VDoc.OlePropertyGet("Paragraphs").OleProcedure("Add");
VDoc.OlePropertyGet("Tables").OleProcedure("Add",
VDoc.OlePropertyGet("Paragraphs").OleFunction("Item",2).OlePropertyGet("Range"), 1+REPORT.bypasses_count*REPORT.checkpoints_count+REPORT.bypasses_count, //кол-во строк
4, //кол-во столбцов
1, //если ноль - то у таблицы невидимые границы
0); //если единица - то таблица не растягивается на всю страницу по ширине

VDoc.OlePropertyGet("Tables").OleFunction("Item",1).OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Bold",0);
VDoc.OlePropertyGet("Tables").OleFunction("Item",1).OlePropertyGet("Range").OlePropertyGet("Font").OlePropertySet("Size",10);


VTable=VDoc.OlePropertyGet("Tables").OleFunction("Item",1);


VTable.OlePropertyGet("Borders").OlePropertyGet("wdBorderLeft").OlePropertySet("LineWidth","wdLineWidth050pt"); // в этой строке засада....



Таблицу рисует нормально, но вот эта строка: 
VTable.OlePropertyGet("Borders").OlePropertyGet("wdBorderLeft").OlePropertySet("LineWidth","wdLineWidth225pt");
приводит Word в недоумение - пишет, неизвестное имя. Где я ошибся?

Автор: korian 19.8.2012, 11:31
VTable.OlePropertyGet("Borders").OlePropertyGet("wdBorderLeft").OlePropertySet("LineWidth", 18 /* wdLineWidth050pt */);

Автор: =Женек= 19.8.2012, 12:03
Цитата(korian @ 19.8.2012,  11:31)
VTable.OlePropertyGet("Borders").OlePropertyGet("wdBorderLeft").OlePropertySet("LineWidth", 18 /* wdLineWidth050pt */);

Все равно пишет - неизвестное имя.

Автор: volvo877 20.8.2012, 14:16
Проверять, какое именно имя неизвестно - не пробовал? В данном случае ты неправильно обращаешься к wdBorderLeft. Надо вот так:

Код

VTable.OlePropertyGet("Borders").OleFunction("Item", -2 /* wdBorderLeft */).OlePropertySet("LineWidth", 4 /* wdLineWidth050pt */);

Автор: =Женек= 21.8.2012, 09:07
А на будущее - как проверить что за имя неизвестно?

Автор: volvo877 21.8.2012, 10:58
Как всегда: разбивать длинные выражения на короткие, и смотреть, где программа вылетает. Было бы так:
Код
Variant borders = VTable.OlePropertyGet("Borders");
Variant item = borders.OlePropertyGet("wdBorderLeft"); // <--- Вылет тут
item.OlePropertySet("LineWidth", 18 /* wdLineWidth050pt */);

- сразу понятно, что к чему

Автор: =Женек= 21.8.2012, 18:52
А как изменить толщину сразу всех границ? 
Я перебрал все варианты цифр - были и правая граница и нижняя и меж ячеек, как только внешнюю границу таблицы сделать жирной? ПОиск в интернете не помогает...

Автор: volvo877 21.8.2012, 19:57
Перебрать все нужные границы:
Код
    for(int k = 1; k <= 4; k++)
    {
        VTable.OlePropertyGet("Borders").OleFunction("Item", -k).OlePropertySet("LineWidth", 18 /*wdLineWidth225pt*/);
    }

Автор: =Женек= 22.8.2012, 09:15
Да я так и сделал, просто предполагаю наличие более изящного варианта. Тем более, что в самом ворде кнопка такая есть.

Автор: volvo877 22.8.2012, 13:06
Кнопка в самом Ворде работает именно таким образом: перебирает все границы, и зарисовывает те, которые выбраны. Можешь убедиться: запиши макрос во время изменения Borders and Shading, и посмотри, что он делает.

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