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

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

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

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

redfox

Добрый день!

Kompas V14 SP1, RAD Studio XE4
Мне немного непонятна логика работы по вставке строки вертикального текста в таблицу на чертеже. Когда произвожу вставку вертикального текста в ячейку, то помимо вставки происходит ещё добавление символа переноса строки (\n) уже не в вертикальный текст, а в обычную строку. Каким образом можно убрать этот перенос?
Делаю так:

   IDrawingTablePtr pDrawTable;
   ITablePtr pTable;
   ITableRangePtr pTableRange;
   ITableCellPtr pCell;
   ITextPtr pCellText;
   ITextLinePtr pTextLine;
   ISymbols2DContainerPtr pSym2DContainer;
   IViewPtr pActiveView;
   IApplicationPtr pKompas7;
   IViewsPtr pViews;
   IKompasDocument2DPtr pDoc2D;
   IViewsAndLayersManagerPtr pViewsAndLayersManager;
//Подготовка
   pKompas7 = (IDispatch*)CreateKompasApplication();
   pDoc2D = pKompas7->ActiveDocument;
   pViewsAndLayersManager = pDoc2D->ViewsAndLayersManager;
   pViews = pViewsAndLayersManager->Views;
   pActiveView = pViews->ActiveView;
   pSym2DContainer = pActiveView;
//Создание таблицы
   pSym2DContainer->DrawingTables->Add(2, 2, 50, 10, ksTableTileLayoutEnum::ksTTLNotCreate, &pDrawTable);
   pDrawTable->X = 0;
   pDrawTable->Y = 0;
   pTable = pDrawTable;
//Получение ячейки
   pCell = pTable->get_Cell(1, 1);
   pCellText = pCell->Text;
//Ввод вертикального текста
   pTextLine = pCellText->AddTextLine(ksTextLineType::ksTLVerticalText, StringToOleStr(UnicodeString(L"Текст")));
   pDrawTable->_Update();

Как вариант, можно попробовать сначала очистить от того, что было IText::Clear, но не факт, что поможет.
Да и почему AddTextLine, а не просто Add?

redfox

Попробовал pCellText->Clear() - не помогает.
Только с помощью AddTextLine и AddTextLineBefore можно добавить вертикальный текст, или я не прав?
До этого такой код проходил великолепно на KompasV11, а в V14 появилась эта проблема.

Нет, не правы IText::Add, возвращаемое значение: - указатель на интерфейс ITextLine строка текста.
ITextLine::TextLineType, может быть равно ksTLVerticalText - вертикальный текст.


redfox

ITextLine::TextLineType  доступно только для чтения, компилятор только что подтвердил

12.08.13, 23:38:47 #5 Последнее редактирование: 13.08.13, 02:36:23 от Sabahs
Да действительно только, для чтения.
Получилось только так удалить.

redfox

Попробовал по вашему методу
//Ввод вертикального текста
   pTextLine = pCellText->AddTextLine(ksTextLineType::ksTLVerticalText, StringToOleStr(UnicodeString(L"Текст")));
   pTextLine = pCellText->AddTextLine(ksTextLineType::ksTLVerticalText, StringToOleStr(UnicodeString(L"")));
   pDrawTable->_Update();
   pTextLine = pCellText->get_TextLine(1);
   if (pTextLine)
   {
   if (!(pTextLine->Delete())) ShowMessage("Delete() = False");
   pDrawTable->_Update();
   } else ShowMessage("pTextLine = NULL");

В итоге Delete() выдаёт false на любой строке.
А у вас на скриншоте в центральной ячейке перед 12345 стоит \n ?

Но у нас и языки разные, как раз не стоит, но мусор остался, от #10+#13.

redfox

А в вашем примере вы избавились от \n? Потому как на скриншоте видно что стоит \n после 12345

Ещё раз повторяю, остаётся мусор, пробовал по разному, через вариантные массивы, просто символами форматирования, но сама AddTextLine уже делает форматирование и вставку, а управляющие символы не попадают в массивы, строки и тем более подстроки.

redfox

Я так понимаю что это баг. Как то можно уведомить разработчиков компаса чтобы откорректировали это в sp2?

Это не баг, а стандарты форматирования, просто Компас не относится к текстовым редакторам.

redfox

Ладно, если это не баг, то как сделать чтобы вертикальный текст в ячейке был ровно по средине а не сомещением?

ITextLine - установить нужные параметры форматирования.

redfox

//Ввод вертикального текста
   pTextLine = pCellText->AddTextLine(ksTextLineType::ksTLVerticalText, StringToOleStr(UnicodeString(L"Текст")));
   pTextLine->Align = ksAlignEnum::ksAlignCenter;

Такой метод не помог. Есть ли ещё способы как можно реализоват выравнивание по средине вертикального текста?

Можно не по центру выравнивать, а по какой либо стороне и за счёт отступов выравнивать.

redfox

Благодарю за советы!
Но я считаю это не доработкой, когда текст можно выровнить только если добавить строку перед вставкой вертикального текста (что помогло в моём случае, но не поможет если ячейку сжать повертикали). Перенос строки должен появлятся только после добавления второй и последующих строк.

Sprinter500

Добрый день! Подскажите пожалуйста как на Delphi при использовании API7 организовать чтение обычного горизонтального текста в ячейках существующей таблицы, задавая номер столбца и строки.
Набросал такой код процедуры, но он не работает (ошибка на закомментированной строке):

procedure ReadTable();//Чтение таблицы
var
  pDrawTable: IDrawingTable;
  pDrawTables: IDrawingTables;
  pTable: ITable;
  pTableRange: ITableRange;
  pCell: ITableCell;
  pCellText: IText;
  pTextLine: ITextLine;
  I,J:integer;
  SM: string;
begin
     SM:='';
     pKompasDocument2D :=  ksDoc as iKompasDocument2D;
     pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
     pViews := pViewsAndLayersManager.Views;
for J := 0 to pViews.Count-1 do
  begin
     pView := pViews.ViewByNumber[J];
     pView.Current := true;
     pDrawingContainer := pView as iDrawingContainer;
     pSymbols2DContainer := pView as iSymbols2DContainer;
     pDrawTables:= pSymbols2DContainer.DrawingTables;
     pDrawTable:= pDrawTables.Item[0] as IDrawingTable;
     pTable:= pDrawTable as ITable;
     pCell:= pTable.Cell[1,1];
     //pCellText:= pCell.Text;
     SM:= SM + pCellText.Str + '    ';
  end;
end;

Надеюсь на помощь знатоков Delphi и API7. Может я вовсе все неправильно делаю?

Внимательней читайте справку, на рисунке выше показано правильно.
http://forum.ascon.ru/index.php/topic,24881.msg180085.html#msg180085
+ Благодарностей: 1

Sprinter500

Спасибо, Sabahs !!!!
Вот какой код у меня получился - он рабочий:
procedure ReadTable();//Чтение таблицы
var
  pDrawTable: IDrawingTable;
  pDrawTables: IDrawingTables;
  pTable: ITable;
  pTableRange: ITableRange;
  pCell: ITableCell;
  pCellText: IText;
  pTextLine: ITextLine;
  I,J, RW,CL:integer;
begin
     SM:='';
     pKompasDocument2D :=  ksDoc as iKompasDocument2D;
     pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
     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;
     pDrawTable:= pDrawTables.Item[0] as IDrawingTable;
     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
                             SM:= SM + pCellText.Str + '    ';
                          end;
                      end;
                 end;
            SM:=SM+#13+#10;
            end;
        end;
  end;
  pDrawTable:=nil;
  pDrawTables:=nil;
end;

Только еще хотелось бы перебирать не все таблицы подряд (хотя в моем коде задана таблица с индексом 0), а по указанию или выделенную таблицу считывать. Как это сделать? Даже не представляю.