Курсор в word delphi

@D1973, а если не использовать автозамену? Я хотел поставить «указатель» в нужную мне точку и создать там объект. Я хочу создавать именно кодом объекты и заполнять походу.

Если я буду использовать шаблоны, то у меня появляется проблема с 2мя таблицами, а именно: как выбирать между ними для заполнения? Создаю и заполняю я подобным образом в других документах:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  MSWord.Selection.Tables.Add(MSWord.Selection.Range, Student.Count+1, 4, wdWord9TableBehavior);
  MSWord.Selection.Tables.Item(1).columns.item(1).Width:=22;
  MSWord.Selection.Tables.Item(1).columns.item(2).Width:=22;
  MSWord.Selection.Tables.Item(1).Rows.Item(1).Select;
  MSWord.Selection.Paragraphs.Alignment := wdAlignParagraphCenter;
  MSWord.Selection.Tables.Item(1).columns.item(2).Width:=260;
  MSWord.Selection.Tables.Item(1).columns.item(3).Width:=80;
  MSWord.Selection.Tables.Item(1).columns.item(4).Width:=80;
  MsWord.Selection.Tables.Item(1).Cell(1,1).Range.Text:='№ п/п';
  MsWord.Selection.Tables.Item(1).Cell(1,2).Range.Text:='Ф.И.О. обучающегося';
  MsWord.Selection.Tables.Item(1).Cell(1,3).Range.Text:='Защита (оценка)';
  MsWord.Selection.Tables.Item(1).Cell(1,4).Range.Text:='Подпись';
   for j:=0 to Student.Count-1 do
   begin
    MsWord.Selection.Tables.Item(1).Cell(j+2,1).Range.Text:=IntToStr(j+1)+'.';
    MsWord.Selection.Tables.Item(1).Cell(j+2,2).Range.Text:=Student[j];
   end;
  MSWord.Selection.EndKey(6 ,EmptyParam);
  MSWord.Selection.TypeText(#10+'Заведующий отделением ИТ _____________________________________');
  MSWord.Visible:=True;

Я сделал шаблон и с одной таблицей понятно как, но с двумя — не знаю как работать

Pascal
1
2
3
4
5
6
Word:=CreateOleObject('Word.Application');
Word.Documents.Add;
Word.Documents.Open(ExtractFilePath(ParamStr(0))+'1.doc');
Word.Selection.Tables.Item(1).Cell(1,1).Range.Text:='№ п/п';
Word.Selection.Tables.Item(1).Cell(1,2).Range.Text:='Ф.И.О. обучающегося';
Word.Visible:=True;

Как получилось визуально: https://www.cyberforum.ru/atta… 1520966479

Если делаю с 2мя готовыми таблицами, то у меня ошибка со следующим текстом: «запрашиваемый номер семейства не найден». Ниже листинг:

Pascal
1
2
3
4
5
6
Word:=CreateOleObject('Word.Application');
Word.Documents.Add;
Word.Documents.Open(ExtractFilePath(ParamStr(0))+'2.doc');
Word.Selection.Tables.Item(1).Cell(1,1).Range.Text:='№ п/п';
Word.Selection.Tables.Item(1).Cell(1,2).Range.Text:='Ф.И.О. обучающегося';
Word.Visible:=True;

В нем я банально попытался заполнить таблицу как делал в первом шаблоне.

Вот шаблон, который использую: 2.doc

Если сейчас найдем решение как выбирать и заполнять эти 2 таблицы, то самая сложная часть завершена.

Бывалый
*

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

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

Помогите пожалуйста с такой ситуацией:

Создаю документ ворда, затем добавляю какой-то текст, и таблицу

Код
Table := MSWord.Selection.Tables.Add(DOC, 1 , stolbs );
MSWord.Selection.Font.Size := 12;
MSWord.Selection.Font.Bold := true;
Table.Cell(1,1).Range.Text := ' столб1;
Table.Cell(1,stolbs).Range.Text := ' столб последний;

после этого необходимо выйти из таблици и продолжить написание текста

Код
MSWord.Selection.TypeText(#13#10'Текст Текст'#13#10#13#10);

как?

уже третий день бьюсь и никак sad.gif

 
_Lucifer_ ©
 
(2005-12-09 16:35)
[0]

Мне надо обратиться к документу MS Word и получить из него положение курсора. Точнее говоря номер таблицы, номер строки, номер столбца.
Возможно ли такое? Если да, то не подскажите как это сделать?


 
YurikGL ©
 
(2005-12-10 23:45)
[1]

selection.range.start дает номер символа, где стоит курсор.
У каждой ячейки таблицы тоже есть range. У каждого range есть  Range.Start и Range.End_ которые означают начальный и конечный символ ячейки. Сравнивая по очереди в какой из промежутков входит selection.range.start и перебирая все таблицы, можно определить в какой из ячеек находится курсор.

Однако, может, опишете задачу подробнее?


 
_Lucifer_ ©
 
(2005-12-12 11:49)
[2]

Задача: довольно примитивный объект автоматизации MS Word «упакованный» в Add-in.
По нажатию на кнопку, вынесенную на панель инструментов, вызывается обработчик, в задачу которого входит: взять данные из Word, выполнить обработку, результат обработки поместить в Word. Данные берутся из одной ячейки, помещаются в другую.
Такой извращённый метот обусловлен передачей, а затем получением данных из стороннего приложения.

По поводу сравнения не очень понял. Это что вроде цикла от .Range(1) до .Range(Range.Count-1), в котором мне следует сравнить стартвую и конечную позиция i-го диапазона со стартовой и конечной позицией моего Selection? Я раньше с таким не сталкивался.


 
_Lucifer_ ©
 
(2005-12-12 12:01)
[3]

Та да. Итак нашёл как получить номер строки в таблице:
TableRowNumber:=Host.Selection.Information[wdStartOfRangeRowNumber];
где Host это ссылка на WordApplication.


 
_Lucifer_ ©
 
(2005-12-14 09:18)
[4]

А как узнать в какой я таблице нахожусь?


 
YurikGL ©
 
(2005-12-14 19:32)
[5]


> А как узнать в какой я таблице нахожусь?

Теоритически — перебором таблиц и range start-End_
Однако, можно попробовать выделенную позицию
type
 WdInformation = TOleEnum;
const
 wdActiveEndAdjustedPageNumber = $00000001;
 wdActiveEndSectionNumber = $00000002;
 wdActiveEndPageNumber = $00000003;
 wdNumberOfPagesInDocument = $00000004;
 wdHorizontalPositionRelativeToPage = $00000005;
 wdVerticalPositionRelativeToPage = $00000006;
 wdHorizontalPositionRelativeToTextBoundary = $00000007;
 wdVerticalPositionRelativeToTextBoundary = $00000008;
 wdFirstCharacterColumnNumber = $00000009;
 wdFirstCharacterLineNumber = $0000000A;
 wdFrameIsSelected = $0000000B;
 wdWithInTable = $0000000C;
 wdStartOfRangeRowNumber = $0000000D;
 wdEndOfRangeRowNumber = $0000000E;
 wdMaximumNumberOfRows = $0000000F;
 wdStartOfRangeColumnNumber = $00000010;
 wdEndOfRangeColumnNumber = $00000011;
 wdMaximumNumberOfColumns = $00000012;
 wdZoomPercentage = $00000013;
 wdSelectionMode = $00000014;
 wdCapsLock = $00000015;
 wdNumLock = $00000016;
 wdOverType = $00000017;
 wdRevisionMarking = $00000018;
 wdInFootnoteEndnotePane = $00000019;
 wdInCommentPane = $0000001A;
 wdInHeaderFooter = $0000001C;
 wdAtEndOfRowMarker = $0000001F;
 wdReferenceOfType = $00000020;
 wdHeaderFooterType = $00000021;
 wdInMasterDocument = $00000022;
 wdInFootnote = $00000023;
 wdInEndnote = $00000024;
 wdInWordMail = $00000025;
 wdInClipboard = $00000026;


 
_Lucifer_ ©
 
(2005-12-15 09:56)
[6]

Вот что по этому поводу говорит MSDN:
wdWithInTable  Returns True if the selection is in a table.
то есть параметр полезный, но придётся перебором …


 
k2 ©
 
(2005-12-15 11:16)
[7]

а зачем перебором? :) в той же справке  
if Selection.Information[wdWithInTable] then tbl := Selection.Tables.Item(1);


 
_Lucifer_ ©
 
(2005-12-15 11:54)
[8]

А какой тип у параметра tbl? Целочисленный не кушает.
К тому же я написал следующее:
function TDTExtensibility2.GetTableNumber():integer;
var
i,c:integer;
begin
c:=Host.ActiveDocument.Tables.Count;
if c<1 then Result:=0 else begin
 if Host.Selection.Information[wdWithInTable] then begin
  for i:=1 to c do begin
   if (Host.ActiveDocument.Tables.Item(i).Range.Start
        <=Host.Selection.Start)
        and (Host.ActiveDocument.Tables.Item(i).Range.End_
        >=Host.Selection.End_) then begin
    Result:=i;
    Break;
   end;
  end;
 end;
end;
end;

Вроде работает правильно.


 
k2 ©
 
(2005-12-15 12:02)
[9]

вестимо tbl: Table;
хотя диспатч или олевариант возможно тоже возьмет


 
_Lucifer_ ©
 
(2005-12-15 12:12)
[10]

Хм, и как я потом смогу выполнить следующую конструкцию:
Host.ActiveDocument.Tables.Item(i).Cell(k,l).Range.InsertAfter(value);?
Не я лучше воспользуюсь написанной функцией :) а то получится как у Кларка: http://lib.ru/KLARK/superior.txt


 
k2 ©
 
(2005-12-15 12:18)
[11]

tbl.Cell(k,l).Range.InsertAfter(value); :))))


 
YurikGL ©
 
(2005-12-15 22:17)
[12]


> if Selection.Information[wdWithInTable] then tbl := Selection.
> Tables.Item(1);

Т.е. таким образом мы не получаем номер таблицы в которой находится курсор, а получаем к ней доступ?


 
k2 ©
 
(2005-12-16 04:02)
[13]

to [
> YurikGL ©   (15.12.05 22:17) [12]

да, но мне показалось што номер таблицы ему нужен, штобы с ней работать(судя по [10]), а к чему искать номер если можно сразу словить таблицу :)
у меня если чесно с аддинсами опыт маленький(один штук :)), но если интересно могу похвастать, зацените как профи


> _Lucifer_ ©   (15.12.05 12:12) [10]

собственоручная функция оно конешно завсегда надежнее :о)


Понравилась статья? Поделить с друзьями:
  • Курсор в ms word что это
  • Курсор в excel двигает страницу
  • Курсовые расчеты в excel
  • Курсовые работы по таблицам excel
  • Курсовой с рамками word 2007