• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Вертикальный текст в таблице

Автор redfox, 12.08.13, 21:29:15

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

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

ISelectionManager.SelectedObjects - Получить массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH, если выделена одна таблица, то функция вернёт интерфейс IDispatch таблицы, то запись будет верна:
Air:=pSelectionManager.SelectedObjects;
pDrawTable:=Air as IDrawingTable;, но если выделенный элемент не таблица или их несколько, то при такой записи будет вылет.
+ Благодарностей: 1

Sprinter500

Sabahs, премного Вам благодарен. Еще маленький вопросик: как организовать удаление столбца/строки? И как быть если при этом есть пересекающие строки/столбцы - разбивать их, удалять или при удалении столбца/строки не вручную, а через API7 они мешать не будут?

Удалять программно не удалял, поэтому экспериментируйте, сделайте удаление в ручную, а затем повторите программно удовлетворивший Вас алгоритм.

Sprinter500

Цитата: Sabahs от 17.04.14, 22:21:03
ISelectionManager.SelectedObjects - Получить массив выделенных объектов в виде SAFEARRAY | VT_DISPATCH, если выделена одна таблица, то функция вернёт интерфейс IDispatch таблицы, то запись будет верна:
Air:=pSelectionManager.SelectedObjects;
pDrawTable:=Air as IDrawingTable;, но если выделенный элемент не таблица или их несколько, то при такой записи будет вылет.


Можно наверно и без массивов обойтись. Например при переборе объектов, который уже есть в коде проверять свойство:
ISelectionManager::IsSelected
Синтаксис Automation:

BOOL IsSelected( LPDISPATCH Object );

Я прав?



Зачем перебирать, когда можно сразу получить указатель на таблицу, ненужно бояться массивов, как огня.

Sprinter500

Не то что я боюсь массиво как огня. Просто не до конца разобрался с их использованием. Вы давали ссылку вот сюда: http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294   Тут лишь часть кода.
Неясно например как декларируется в разделе VAR   имя массива Air.


Sprinter500

У меня Delphi не узнает константу VT_DISPATCH. Где она задается или хотя бы чему она равна? В приведенном здесь: http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294   примере есть VT_DISPATCH и массив Air. У меня в аналогичном Step3_API7_3D ничего такого не находится. странно (((

Sprinter500

В начале этой темы затрагивалось добавление вертикального текста в таблицу. А как считать вертикальный текст? Приведенная процедура в этом случае выдает символ @ вместо текста, содержащегося в вертикальной строке в ячейке таблицы.

Sprinter500

Цитата: Sprinter500 от 18.04.14, 17:32:11
У меня Delphi не узнает константу VT_DISPATCH. Где она задается или хотя бы чему она равна? В приведенном здесь: http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294   примере есть VT_DISPATCH и массив Air. У меня в аналогичном Step3_API7_3D ничего такого не находится. странно (((

С этой проблемой разобрался - надо было в Uses модуля добавить ActiveX.
Однако после компиляции в процессе работы возникает ошибка в строке:
Air:=pSelectionManager.SelectedObjects;
Что не так?

Sprinter500

var
...
pKompasDocument2D1 : IKompasDocument2D1;
pSelectionManager : ISelectionManager;
Air:OleVariant;
....
begin
...
pSelectionManager := pKompasDocument2D1.SelectionManager;
Air:=pSelectionManager.SelectedObjects;
....

Вот так объявлял все. И почему то вылетает на Air:=pSelectionManager.SelectedObjects;

Sprinter500

Забыл объявить:
pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;

Теперь ошибка на этой строке - почему то pKompasDocument2D1 остается nil


Sprinter500

unit WKMPS;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  ksTLB,ksConstTLB,ComObj,
  ks2DCOM_TLB,ks3DCOM_TLB,LDefin2D,LDefin3D,ksAPI7,ksAuto, ActiveX;


var
Document2D: ksDocument2D;
DocumentParam: ksDocumentParam;
KOMPAS :IApplicationDisp;
ksDocs :IDocumentsDisp;
ksDoc :IKompasDocumentDisp;
//ksDoc2D1 :IKompasDocument2D1Disp;
pKompasDocument2D : IKompasDocument2D;
//pKompasDocument2D1 : IKompasDocument2D1;
pViewsAndLayersManager : IViewsAndLayersManager;
pViews : IViews;
pView : IView;
pSymbols2DContainer : ISymbols2DContainer;
pDrawingContainer : IDrawingContainer;
pLeaders : ILeaders;
pLeader : ILeader;
pPositionLeader : IPositionLeader;
pDrawingTexts : IDrawingTexts;
pDrawingText : IDrawingText;
pDrawingObject : IDrawingObject;
pText : IText;
pSelectionManager : ISelectionManager;

SM: widestring;
SourceStr: widestring;




procedure OpenDOC(Fname: string);//Открыть документ
procedure ReadTable();//Чтение таблицы
function InitCMPS(): bool;//Активация КОМПАСа





implementation


function InitCMPS(): bool;//Активация КОМПАСа
begin
  try
    KOMPAS:=GetActiveOleObject('KOMPAS.Application.7') as IApplicationDisp;
    ksDocs:=IDocumentsDisp(KOMPAS.ActiveDocument);
    ksDoc:=IKompasDocumentDisp(ksDocs);
    //ksDoc2D1:= IKompasDocument2D1Disp(ksDocs);
    result:=true;
  except
    KOMPAS:=CreateOleObject('KOMPAS.Application.7') as IApplicationDisp;
    KOMPAS.Visible:=TRUE;
    result:=false;
  end;
end;


procedure OpenDOC(Fname: string);//Открыть документ
begin
  TRY
    ksDocs:=IDocumentsDisp(KOMPAS.Documents);
    ksDoc:=IKompasDocumentDisp(ksDocs.Open(Fname, TRUE, FALSE));
  EXCEPT
    ksDocs:=nil;
    ksDoc:=nil;
  END;
end;





procedure ReadTable();//Чтение таблицы
var
  pDrawTable: IDrawingTable;
  pDrawTables: IDrawingTables;
  pTable: ITable;
  pTableRange: ITableRange;
  pCell: ITableCell;
  pCellText: IText;
  pTextLine: ITextLine;
  //Air:OleVariant;
  I,J, RW,CL:integer;
begin
     SM:='';
     pKompasDocument2D :=  ksDoc as iKompasDocument2D;
     //pKompasDocument2D1 :=  ksDoc2D1 as iKompasDocument2D1;
     pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
     //if pKompasDocument2D1<>nil then pSelectionManager := pKompasDocument2D1.SelectionManager;
     //pSelectionManager := pKompasDocument2D1.SelectionManager;
     pViews := pViewsAndLayersManager.Views;
for I := 0 to pViews.Count-1 do
  begin
     pView := pViews.ViewByNumber;
     pView.Current := true;
     pDrawingContainer := pView as iDrawingContainer;
     pSymbols2DContainer := pView as iSymbols2DContainer;
     pDrawTables:= pSymbols2DContainer.DrawingTables;
     //Air:=pSelectionManager.SelectedObjects;
     //if ( VarType(Air)=(VT_ARRAY Or VT_DISPATCH) ) then
          //begin

         // end;

                                  for J := 0 to pDrawTables.Count-1 do
                                      begin
     pDrawTable:= pDrawTables.Item[J] as IDrawingTable;
                              //if pSelectionManager.IsSelected(pDrawTable)=true then
                                //  begin
     pTable:= pDrawTable as ITable;
     if pTable<>nil then
        begin
          for RW := 0 to pTable.RowsCount-1 do
            begin
              for CL := 0 to pTable.ColumnsCount-1 do
                begin
                   pCell:= pTable.Cell[RW,CL];
                   if pCell<>nil then
                    begin
                        pCellText:=pCell.Text as IText;
                        if pCellText<>nil then
                          begin
                          if pCellText.Str='' then SM:= SM + 'пуст' + '    '
                          else  SM:= SM + pCellText.Str + '    ';
                          end;
                      end;
                 end;
            SM:=SM+#13+#10;
            end;
        end;
                                  //end;
                                      end;

  end;
  pDrawTable:=nil;
  pDrawTables:=nil;
end;




end.

var
ksDoc :IKompasDocument;
pKompasDocument2D : IKompasDocument2D;
pKompasDocument2D1 : IKompasDocument2D1;

ksDoc:=KOMPAS.ActiveDocument;
pKompasDocument2D :=  ksDoc as iKompasDocument2D;
pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;
Тут без проверок, если документ не 2D, то вылет.
+ Благодарностей: 1

Sprinter500

Сделал все как было предписано, и все равно вылетает на:
pKompasDocument2D1 :=  pKompasDocument2D as iKompasDocument2D1;

Прилагаю весь проект, может станет яснее что не так. Пока хотел в процедуре procedure ReadTable(); сделать эту функцию, а RENM() пока не трогал, хотя некоторые элементы туда тоже внес. Все что вызывает ошибки закомментировано.

19.04.14, 12:26:05 #36 Последнее редактирование: 19.04.14, 12:36:08 от Sabahs
http://yadi.sk/d/wpD8fY59MmEck
По ссылки ролик, пользуйтесь отладчиком, у меня работает, единственное пришлось вручную загрузить документ.
Чтобы не грузить документ вручную, загружаете программно (см. рис.).

Sprinter500

В общем все подключение мне придется переделывать чтобы заработало. С тем как удалять строки и столбцы я разобрался - ничего сложного. Правда жаль что програмно они как и вручную при наличии пересекающих их объединенных ячеек - не удаляются. Таким образом остался один не решенный вопрос:
Как считать вертикальный текст в таблице? В начале этой темы говорится лишь про запись вертикального текста.

19.04.14, 13:06:28 #38 Последнее редактирование: 19.04.14, 13:18:21 от Sabahs
А чем вертикальный текст отличается от горизонтального?
ITextLine.TextLineType

Sprinter500

Я так считывал:
                   pCell:= pTable.Cell[RW,CL];
                   if pCell<>nil then
                    begin
                        pCellText:=pCell.Text as IText;
                        if pCellText<>nil then
                          begin
                          if pCellText.Str='' then SM:= SM + 'пуст' + '    '
                          else  SM:= SM + pCellText.Str + '    ';
                          end;
                      end;
Хотя делал и через TextLine. В обоих случаях текст считывался, но только горизонтальный. Вертикальный в обоих случаях давал символ '@'.