Работа с выделенными ячейками таблицы

Автор Sprinter500, 16.08.14, 23:53:45

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Sprinter500

Добрый день! Необходимо возвратить номера строк и столбцов (начало и конец) выделенного диапазона ячеек таблицы.

Зависает подчеркнутая строка в коде:

procedure SelCellNum();//Возврат номеров строк и столбцов выделенных ячеек
var
I, J: integer;
NRW, NCL, KRW, KCL: integer;
begin
NRW:=0;
NCL:=0;
if (RW1<>0) or (RW2<>0) or (CL1<>0) or (CL2<>0) then exit;

     pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
     pSelectionManager := pKompasDocument2D1.SelectionManager;

     for I := 0 to  pTable.RowsCount - 1 do
        begin
            for J := 0 to pTable.ColumnsCount - 1 do
                begin
                  pCell:= pTable.Cell[I,J];
                  if (pSelectionManager.IsSelected(pCell)) and (NRW=0) and (NCL=0) then
                    begin
                      RW1:=I+1; CL1:=J+1; NRW:=1; NCL:=1;
                    end;
                  if (pSelectionManager.IsSelected(pCell)) and (KRW<=I) then
                    begin
                      RW2:=I+1; KRW:=I;
                    end;
                  if (pSelectionManager.IsSelected(pCell)) and (KCL<=J) then
                    begin
                      CL2:=J+1; KCL:=J;
                    end;
                end;
        end;
end;


Все что надо вызвать до pTable есть раньше в вызывающей функцию процедуре - так что ошибка не в этом.  Если делать через ICHOOSEMANAGER то тоже самое. Может менеджер выделенных объектов не работает для ячеек?

pCell - тип интерфейса соответствует входному параметру pSelectionManager.IsSelected?
ЦитироватьМожет менеджер выделенных объектов не работает для ячеек?
Чтобы ответить на этот вопрос, выделите в документе только часть ячеек в таблице и посмотрите, что вернёт pSelectionManager.SelectedObjects, если вернёт ячейки, то есть смысл пересмотреть свой алгоритм в сторону pSelectionManager.SelectedObjects, зачем перебирать всю таблицу, когда сразу можно получить все выделенные ячейки.
P.S. Исходя из того, что в свойстве IKompasAPIObject.Type - Тип объекта присутствует значение ksObjectTableCell - 10703 - Ячейка таблицы, то делаем вывод, что ISelectionManager работает с ячейками таблицы.
+ Благодарностей: 1

Sprinter500

И чему присваивать pSelectionManager.SelectedObjects ? С чем сравнивать? И как из этого получить диапазон ячеек? Есть пример кода?

ЦитироватьИ чему присваивать pSelectionManager.SelectedObjects ?
В справке же написано, черным по белому: Свойство позволяет получать массив выделенных объектов. Если возвращается один объект, то тип VARIANT-а будет VT_DISPATCH, если возвращается несколько объектов, то тип VARIANT-а будет VT_ARRAY | VT_DISPATCH.
Air:OleVariant;
Air:=pSelectionManager.SelectedObjects;

ЦитироватьЕсть пример кода?
В данной теме есть пример, но с другими объектами.
http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294
ЦитироватьИ как из этого получить диапазон ячеек?
ITableCell.Row - Номер строки
ITableCell.Column - Номер колонки
+ Благодарностей: 1

Sprinter500

Добрый день. Вновь взялся за эту тему. Прочитал тему в ссылке. Но там изымается объект из массива Safearray. А как сравнить тип изъятого объекта, как Вы советуете, с целевым типом. Скажем является ли тип изъятого объекта (элемента массива Air)  ячейкой таблицы после следующей операции: Air:=pSelectionManager.SelectedObjects; ?

Хотелось бы поподробнее. И где вообще про эти SafeArray в доступной форме можно почитать? Я так понял что это входит в технологию COM.

Можно сразу отфильтровать, если выделенных ячеек нет, то строка вернёт пустой массив, если есть то там будут только выделенные ячейки таблицы.
Air:=pSelectionManager.SelectedObjects[ksObjectTableCell];
+ Благодарностей: 1

Sprinter500

А как понять тогда что массив пустой?

В верху ссылка на образец кода была.
+ Благодарностей: 1

Sprinter500

Так есть промежуточные результаты. Набросал такую процедуру:

procedure SelCellNum();//Возврат номеров строк и столбцов выделенных ячеек
var
Air: OleVariant;
Obj1: IKompasAPIObject;
begin
     pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
     pSelectionManager := pKompasDocument2D1.SelectionManager;
     pChooseManager := pKompasDocument2D1.ChooseManager;
     Air:=pSelectionManager.SelectedObjects;
     //Air:= pChooseManager.ChoosenObjects;
     if (VarType(Air)=VT_DISPATCH) then Obj1:=IDispatch(Air) as IKompasAPIObject;
     ShowMessage(inttostr(Obj1.Type_));
end;

Она выводит сообщение с кодом типа объекта. Проверял - работает для выделенных объектов: и для отрезка, и для текста и таблицы. Для всех выдает соответствующий код типа объекта.

Но!!!! Для выделенной ячейки - выдает код просто таблицы.

Как быть? Наверно есть какой то другой путь?

Может и есть, но мне некогда сидеть и за Вас разбираться.

На этой строке Компас уходит в ступор -
if pSelectionManager.IsSelected(pTableCell as IKompasAPIObject) then Kompas.ksMessage('vhjvbjh');
С помощью ISelectionManager не узнаете диапазон выделенных ячеек, только таблицу в которой они выделены.
+ Благодарностей: 1

Sprinter500

Получается это баг Компаса? Или просто не предусмотрено?

Но ведь в Компасе же реально вручную выделить диапазон ячеек, копировать и вставить диапазон ячеек. Это же как то работает. Значит теоретически и через API можно реализовать. В каком направлении мне дальше "рыть"?

Скорее всего, просто ещё не реализовано, т.к. таблица сложный объект.
Теоретически можно.
Скопировать выделенные ячейки можно только в таблицу, поэтому алгоритм такой:
- копируете выделенные ячейки,
- создаёте таблицу с одной ячейкой,
- вставляете в эту таблицу то, что скопировали,
- распознаёте текст,
- ищете в исходной таблице текст и определяете диапазон ячеек,
- удаляете временно созданную таблицу.
Далее делаете то, что хотели с этими ячейками.
+ Благодарностей: 1

Sprinter500

Хорошее решение, "через Китай" конечно, но должно сработать. Раз необходимый функционал еще не реализован то другого пути нет. Спасибо.

А как программно вставить в созданную таблицу то что скопировано в буфер обмена Компаса? Или имеется ввиду что п.1 и п.3 надо выполнять вручную?

Можно попробовать через ExecuteKompasCommand - Выполнить команду системы КОМПАС, но не факт, что получится, т.к. нужен будет запуск связки команд.
+ Благодарностей: 1

Sprinter500

Придумал еще пару вариантов вместо прямого выделения диапазона:
1. Выделить диапазон - временно поменять стиль текста в ячейках вручную - произвести операции - вернуть прежний стиль. Ну или с цветом текста тоже самое.
2. Добавить вручную в тексты ячеек спец. знаки (для лев верх скажем { или [, для прав. нижн. - } или ] )  - произвести операции - удалить спец. знаки.