![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Текущее положение курсора в документе MS Word [Delphi, Windows]
_Lucifer_ © (2005-12-09 16:35:00)Мне надо обратиться к документу MS Word и получить из него положение курсора. Точнее говоря номер таблицы, номер строки, номер столбца.
Возможно ли такое? Если да, то не подскажите как это сделать?
k2 (2005-12-16 04:02:00) [1]to [
> YurikGL © (15.12.05 22:17) [12]
да, но мне показалось што номер таблицы ему нужен, штобы с ней работать(судя по [10]), а к чему искать номер если можно сразу словить таблицу :)
у меня если чесно с аддинсами опыт маленький(один штук :)), но если интересно могу похвастать, зацените как профи
> _Lucifer_ © (15.12.05 12:12) [10]
собственоручная функция оно конешно завсегда надежнее :о)
YurikGL (2005-12-15 22:17:00) [2]
> if Selection.Information[wdWithInTable] then tbl := Selection.
> Tables.Item(1);
Т.е. таким образом мы не получаем номер таблицы в которой находится курсор, а получаем к ней доступ?
k2 (2005-12-15 12:18:00) [3]tbl.Cell(k,l).Range.InsertAfter(value); :))))
_Lucifer_ (2005-12-15 12:12:00) [4]Хм, и как я потом смогу выполнить следующую конструкцию:
Host.ActiveDocument.Tables.Item(i).Cell(k,l).Range.InsertAfter(value);?
Не я лучше воспользуюсь написанной функцией :) а то получится как у Кларка: http://lib.ru/KLARK/superior.txt
k2 (2005-12-15 12:02:00) [5]вестимо tbl: Table;
хотя диспатч или олевариант возможно тоже возьмет
_Lucifer_ (2005-12-15 11:54:00) [6]А какой тип у параметра 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 11:16:00) [7]а зачем перебором? :) в той же справке
if Selection.Information[wdWithInTable] then tbl := Selection.Tables.Item(1);
_Lucifer_ (2005-12-15 09:56:00) [8]Вот что по этому поводу говорит MSDN:
wdWithInTable Returns True if the selection is in a table.
то есть параметр полезный, но придётся перебором ...
YurikGL (2005-12-14 19:32:00) [9]
> А как узнать в какой я таблице нахожусь?
Теоритически - перебором таблиц и 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-14 09:18:00) [10]А как узнать в какой я таблице нахожусь?
_Lucifer_ (2005-12-12 12:01:00) [11]Та да. Итак нашёл как получить номер строки в таблице:
TableRowNumber:=Host.Selection.Information[wdStartOfRangeRowNumber];
где Host это ссылка на WordApplication.
_Lucifer_ (2005-12-12 11:49:00) [12]Задача: довольно примитивный объект автоматизации MS Word "упакованный" в Add-in.
По нажатию на кнопку, вынесенную на панель инструментов, вызывается обработчик, в задачу которого входит: взять данные из Word, выполнить обработку, результат обработки поместить в Word. Данные берутся из одной ячейки, помещаются в другую.
Такой извращённый метот обусловлен передачей, а затем получением данных из стороннего приложения.
По поводу сравнения не очень понял. Это что вроде цикла от .Range(1) до .Range(Range.Count-1), в котором мне следует сравнить стартвую и конечную позиция i-го диапазона со стартовой и конечной позицией моего Selection? Я раньше с таким не сталкивался.
YurikGL (2005-12-10 23:45:00) [13]selection.range.start дает номер символа, где стоит курсор.
У каждой ячейки таблицы тоже есть range. У каждого range есть Range.Start и Range.End_ которые означают начальный и конечный символ ячейки. Сравнивая по очереди в какой из промежутков входит selection.range.start и перебирая все таблицы, можно определить в какой из ячеек находится курсор.
Однако, может, опишете задачу подробнее?