
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
![]() |
|
|
Поискал по форуму - подымался этот вопрос ни раз, но ответа так и не было.
Вот код : ![]() ![]() #include <ComObj.hpp> Variant Word, Doc, Table,Tables, Cell, Range; Word = CreateOleObject("Word.Application.8"); Word.OlePropertySet("Visible",(Variant)true); Doc = Word.OlePropertyGet("Documents"); Doc.OleProcedure("Add"); Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1); Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row); Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row); Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row); Простенькое создание нескольких таблиц. Проблема в том что каждая последущая таблица рисуется в первой ячейке предыдещей таблицы ![]() ![]() ![]() Я решил эту проблему воспользовавшись компонентом TWordApplication, там после каждого создания таблицы выполнял : ![]() ![]() OleVariant L=wdStory; WordApplication1->Selection->EndKey(L,EmptyParam); Так с компонентами тоже не всё в порядке - не хочет запускаться на лругих ПК ![]() ![]() ![]() |
Сообщ.
#2
,
|
|
|
Дима, эти вопросы поднимались уже не раз. В ворде записываешь макрос и переводишь с бейсика на ole
![]() Здесь, скорее всего, тебе всего и надо-то записать то, что получается при нажатии Ctrl+End - перевод каретки в конец документа после создания таблицы. |
Сообщ.
#3
,
|
|
|
Цитата записываешь макрос и переводишь с бейсика на ole Читал об этом только конечных решений этого не видел. Сам пытался. На Basik получилось: ![]() ![]() Sub End() Selection.EndKey Unit:=wdStory End Sub В переводе на OLE - это переход в конец документа. Откуда берут эти значения для OLE я не допёр. По форуму нашёл вот такой перевод в конец : ![]() ![]() Word.OlePropertyGet("Selection").OleFunction("EndKey",wdStory,EmptyParam); Ставил его перед и после каждого создания таблицы - НИЧЕГО не получилось. Как правильно сделать подскажаите, пожалуйста? |
![]() |
Сообщ.
#4
,
|
|
Цитата Дима @ Откуда берут эти значения для OLE я не допёр. ![]() ![]() Word_2K.h .... typedef enum WdUnits { wdCharacter = 1, wdWord = 2, wdSentence = 3, wdParagraph = 4, wdLine = 5, wdStory = 6, wdScreen = 7, wdSection = 8, wdColumn = 9, wdRow = 10, wdWindow = 11, wdCell = 12, wdCharacterFormatting = 13, wdParagraphFormatting = 14, wdTable = 15, wdItem = 16 } WdUnits; |
Сообщ.
#5
,
|
|
|
Bas, а куда это вставлять?
![]() Вообще вот эта вещь : ![]() ![]() Word.OlePropertyGet("Selection").OleFunction("EndKey",wdStory,EmptyParam); переводит курсор в конец документа. Это я таблицы как-то так криво вставляю. Видимо вот это : ![]() ![]() Doc.OleFunction("Range",0,0) указывает вставлять таблицу сначала документа. Пытался делать вот такое: ![]() ![]() Variant isRange = Doc.OleFunction("Range",0,0); Range = Doc.OleFunction("Range",isRange.OlePropertyGet("End"),isRange.OlePropertyGet("End")); Doc.OlePropertyGet("Tables").OleFunction("Add", Range, Col, Row); На второй строчке вылетает ошибка (просто исключительная ситуация и окно с текстом "ошибка"). Добавлено Bas, я имел ввиду где можно взять описание как выполнять при помощи OLE разные действия с Word-ом? Где описано что вот так отрывать Word: ![]() ![]() Variant Word = CreateOleObject("Word.Application.8"); ??? Где описано что вот так таблицу создавать : ![]() ![]() Doc = Word.OlePropertyGet("Documents"); Doc.OleProcedure("Add"); Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1); Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row); ??? Где можно почитать как текст вставлять, его стиль и шрифт менять? |
Сообщ.
#6
,
|
|
|
Цитата Дима @ Ну, именно это надо просто один раз запомнить.Где описано что вот так отрывать Word: Variant Word = CreateOleObject("Word.Application.8"); Цитата Дима @ Где описано что вот так таблицу создавать : Цитата Дима @ А всё остальное - перевод макросов. К сожалению, сейчас нету под рукой экселя - попробуй записать макрос вставки своих таблиц (полностью, т.е. вставка таблицы, переход в конец в документа, вставка следующей таблицы) и приведи его здесь.Где можно почитать как текст вставлять, его стиль и шрифт менять? Кстати, посмотри и приведи тут, описание метода Tables.Add из справки Экселя. |
Сообщ.
#7
,
|
|
|
Adil, допустим даже если разбераться в Basic, то как всё-таки прикрутить эти операции к OLE в Builder?
Вот код того как вставлется одна таблица, потом переводится курсор в конец документа + жму Enter, далее вставляю след. табл. : ![]() ![]() Sub Макрос1() ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> "Сетка таблицы" Then .Style = "Сетка таблицы" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With Selection.EndKey Unit:=wdStory Selection.TypeParagraph ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> "Сетка таблицы" Then .Style = "Сетка таблицы" End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With End Sub Мне надо бы в С++ написать вот этот кусочек : ![]() ![]() Selection.EndKey Unit:=wdStory Selection.TypeParagraph |
![]() |
Сообщ.
#8
,
|
|
Основная трудность превода в том что ворд вставляет Selection куда не поподя. Поэтому надо явно поределять выделенную область методом Range.
Второй вариант попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы (InsertAfter) а потом уж вставить таблицу. |
Сообщ.
#9
,
|
|
|
Цитата попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы Bas, это первое что я пробовал. Курсор нормально перемещаетсяв конец документа, а вот таблица вставляется в начало ![]() Я вставляю таблицу вот так: ![]() ![]() Doc.OlePropertyGet("Tables").OleFunction("Add", Doc.OleFunction("Range",0,0), Col, Row); Из сего видно что я сам принудительно пишу с начала документа - Doc.OleFunction("Range",0,0). Как задать этот Range так чтоб писалось в конце документа? Пробовал туда Selection передать - так пишет несовпадение типов. Ещё по ходу дела вопрос - как менять размер и имя шрифта? Basic выдал вот это : Selection.Font.Size = 14 Как это прикрутить к OLE в Builder? |
![]() |
Сообщ.
#10
,
|
|
Вот древний код, даже незнаю рабочий ли он (дааааавно это было)
![]() ![]() void __fastcall TForm1::WordApplicationDocumentChange(TObject *Sender) { WordDocument1->ConnectTo(WordApplication1->ActiveDocument); //WordApplication1->Selection->SetRange(1,20); WordApplication1->Selection->InsertAfter(TVariant("\nПереход к документу :"+TVariant(WordApplication1->ActiveDocument->Name))); long s=WordApplication1->Selection->get_Start(); long e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant("\n произведен :"+DateTimeToStr(Now()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant("\n пользователь :"+TVariant(WordApplication1->Get_UserName()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant("\n Printer :"+TVariant(WordApplication1->Get_ActivePrinter()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant("\n Path :"+TVariant(WordApplication1->Get_Path()))); } //--------------------------------------------------------------------------- |
Сообщ.
#11
,
|
|
|
Bas, с компонентами у меня в этом плане проблем нет, спасибо. Как без компонентов реализовать встаку таблицы в конце документа?
Может есть другой способ вставки не требующий параметра Range? Или что поставить в Range чтоб таблица прорисовалась в конце документа? ![]() ![]() ![]() ![]() Добавлено СДЕЛАЛ!!!! ![]() Вот кому надо весь код вставки нескольких таблиц подряд. Нормально подряд: ![]() ![]() Variant Word, Doc, Selection; Word = CreateOleObject("Word.Application.8"); Word.OlePropertySet("Visible",(Variant)true); Doc = Word.OlePropertyGet("Documents"); Doc.OleProcedure("Add"); Doc = Word.OlePropertyGet("Documents").OleFunction("Item", 1); Selection = Word.OlePropertyGet("Selection"); //курсор в конец документа Selection.OleFunction("EndKey",wdStory,EmptyParam); //новый параграф Selection.OleFunction("TypeParagraph"); Doc.OlePropertyGet("Tables").OleFunction("Add",Selection.OlePropertyGet("Range"),Col, Row); //курсор в конец документа Selection.OleFunction("EndKey",wdStory,EmptyParam); //новый параграф Selection.OleFunction("TypeParagraph"); Doc.OlePropertyGet("Tables").OleFunction("Add",Selection.OlePropertyGet("Range"),Col, Row); // и т.д. |
Сообщ.
#12
,
|
|
|
Ну, вот видишь как все просто оказалось. Кстати, если в басике функция не функция
![]() |