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

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

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

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

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

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

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

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

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

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

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

Вы для начала поделитесь, каким образом Вы пытались это сделать(полный код для работы с текстом), какие варианты пробовали?

Sprinter500

Конечно. Вот текст:

procedure RENTable();//Чтение таблицы
var
  I,J, L, RW,CL:integer;
begin
     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;
     for J := 0 to pDrawTables.Count-1 do
         begin
            pDrawTable:= pDrawTables.Item[J] 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
                                     if pCellText.Str<>'@' then
                                        begin
                                          SourceStr:= pCellText.Str;
                                          pCellText.Str := REPTEXT(SourceStr);
                                        end
                                     else
                                        begin
                                          READVERTICAL(pCellText);
                                          pCellText.Clear;
                                          for L := 0 to Length(MS)-1 do
                                            begin
                                              MS[L]:=REPTEXT(MS[L]);
                                               pCellText.AddTextLine(ksTLVerticalText,MS[L]);
                                             end;
                                          end;
                                     pDrawTable.Update;
                                     end;
                                 end;
                            end;
                       end;
                   end;
         end;
  end;
  pDrawTable:=nil;
  pDrawTables:=nil;
end;



procedure READVERTICAL(pTxt : IText);
var
I,K : integer;
S : Widestring;
pText1 : IText;
pTextLine1:ITextLine;
pTextItem:ITextItem;
begin
  I:=pTxt.Count;
  Dec(I);
  S:='';
  while I<>-1 do
    begin
      pTextLine:=pTxt.TextLine;
      if pTextLine<>nil then
        if pTextLine.TextLineType=ksTLVerticalText then pText1:=pTextLine.TextLineData as IText;
          if pText1<>nil then
            begin
              K:=pText1.Count;
              Setlength(MS,K);
              Dec(K);
              while K<>-1 do
                begin
                  pTextLine1:=pText1.TextLine[K];
                  if pTextLine1<>nil then
                      begin
                          MS[K]:=pTextLine1.Str;
                      end;
                  Dec(K);
                end;
            end;
         Dec(I);
    end;
end;

Sprinter500

В общем вот эта строка кода только одну строку вертикального текста добавляет, все что дальше идет в ту же ячейку игнорируется.
pCellText.AddTextLine(ksTLVerticalText,MS[L]);

Какие варианты пробовал? Уже не помню к сожалению - действовал шустро и стихийно, быстро менял, не сохраняя. Да и уже несколько дней прошло.

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

Sprinter500

Что значит "ячейку до конца отрабатывать"?

Всё вставляет, красным обвёл структуру текста.
Если нужен текст, как показан на второй картинке, то у него структура другая.
+ Благодарностей: 1

Sprinter500

Да мне нужен как на второй картинке. Можете код процедуры выложить, а то на скрине много что "загорожено" и не видно?

Как на перовй у меня тоже не получился. Второе обращение игонировалось, хотя может Update надо было следом а не вне цикла проводить/

Я код не писал, а на картинке, по моему четко видно(смотри структуру текста), что вертикальный текст вставлен один раз и в нём две строки.

Sprinter500

А как тебе удалсоь вставить 2 строки, если код не писал? Хоть что то наверно все равно поменял? Просто на скриен половина кода скрыта от глаз.

30.04.14, 11:05:05 #109 Последнее редактирование: 30.04.14, 11:33:34 от Sabahs
Вставил вручную, чтобы структуру текста посмотреть.
Полный текст кода давал в этом http://forum.ascon.ru/index.php/topic,24881.msg191330.html#msg191330 сообщении, что ещё нужно?
Можно и программно.
+ Благодарностей: 1

Sprinter500

Не хотит работать, хотя все сделал как на скриншотах. Что то не везет мне с API7 ....   :(

Вы код показывать не забывайте, я не экстрасенс.

Sprinter500

Вот:

procedure RENTable();//Чтение таблицы
var
  I,J, L, RW,CL:integer;
  //FCX : IText;
  Stroka: widestring;
begin
     pViewsAndLayersManager := pKompasDocument2D.ViewsAndLayersManager;
     //if pKompasDocument2D1<>nil then 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;
     for J := 0 to pDrawTables.Count-1 do
         begin
            pDrawTable:= pDrawTables.Item[J] 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
                                     if pCellText.Str<>'@' then
                                        begin
                                          SourceStr:= pCellText.Str;
                                          pCellText.Str := REPTEXT(SourceStr);
                                        end
                                     else
                                        begin
                                          READVERTICAL(pCellText);
                                          pCellText.Clear;
                                          {
                                          for L := 0 to Length(MS)-1 do
                                            begin
                                              MS[L]:=REPTEXT(MS[L]);
                                              //Stroka:=Stroka+MS[L]+#13+#10;
                                              Stroka:='dfh'+#13+#10+'abc'+#13+#10+'rty'+#13+#10;
                                              //FCX.AddTextLine(ksTLVerticalText,'абв');
                                              //pCellText.AddTextLine(ksTLVerticalText,MS[L]+#13+#10+'dfsf');
                                              //pCellText.AddTextLine(ksTLVerticalText,inttostr(L));
                                              //pCellText.AddTextLine(ksTLText,'789');
                                              //pCellText.AddTextLine(ksTLVerticalText,'123');

                                              //pDrawTable.Update;
                                              //pDrawTable.Update;
                                            end;
                                            }
                                            pCellText.AddTextLine(ksTLVerticalText,'dfh'+#13+#10+'abc'+#13+#10+'rty');
                                            pDrawTable.Update;
                                           //pCellText:=FCX;
                                        end;
                                     pDrawTable.Update;
                                     end;
                                 end;
                            end;
                       end;
                   end;
         end;
  end;
  pDrawTable:=nil;
  pDrawTables:=nil;
end;



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

Еще вопрос: чем отличаются от обычных Disp-интерфейсы? Может мне 2D1 подключить как Disp-интерфейс?

Во вложении процедура, меняет символы в строках вертикального текста местами, для более сложного состава текста процедура будет ещё сложнее.
На рисунке текст до и после нажатия на кнопку, при повторном нажатии вернёт вертикальный текст в первоначальное состояние.
+ Благодарностей: 1