Сбрасывается форматирование текста в таблице

Автор DragoAr, 29.05.24, 09:24:10

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

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

DragoAr

Здравствуйте!
При формировании текста в таблице есть случаи, при которых к нему не применяется форматирование (сбрасывается). Как я понял, зависит это от ширины колонки и длины строки текста. Например, у нас есть колонка шириной 30 мм и текст «Примечание», при их формировании не форматируя текст, но поменяв формат ячейки (в коде ниже) – текст построится и автоматически компас перенесет букву «е» на следующую строку, текст будет одинаков на обеих строках. Т.е. в itext сейчас две ItextLine

Теперь если же будем применять форматирование к тексту, например, уберем наклон и поменяем размер шрифта, то получится вот такой результат (скрин прилагаю ScreenshotFormatText). Здесь уже после вызова DrawTable.Update в Itext одна Itextline, у которой форматирование применилось только к букве «е». Также до вызова update у обоих TextLine через отладку можно увидеть, что форматирование применилось сразу к 2-ум textline, а после она только одна, и содержит 3 TItem. TextItem(0).str = "Примечани" - форматирование сбросилось, TItem(1).str = "e" - форматирование осталось, TItem(2).str = "" - форматирование дефолтное для текста.

text:= table.Cell[indexrow,indexColumn].Text as itext;
text.Str:= str;  //Запись текста, в нашем случае "Примечание"
if Text <> nil then
begin
  if text.TextLine[i] <> nil then
  begin
    if StrikeOut then //Зачеркнутый текст
    begin
        TextLine.Str:= '@169~$('+ TextLine.str + ')$';
    end;
    TextLine.Style:= ksTSTableCell;
    TextLine.Align:= ksAlignCenter;
    for a:= 0 to TextLine.Count do
    begin
      tItem:= TextLine.TextItem[a];
      if titem <> nil then
      begin
        tfont:= tItem as ITextFont;
        tfont.Height:= fontSize;
        tfont.Italic:= false;
        tItem.Update;
      end;
    end;
  end;
end;
if pos('Прим',str) > 0 then //В таблице есть еще ячейки, поэтому по тексту проверяем
begin
  showkompasmessage(inttostr(text.Count) + '- кол-во TextLine До DrawingTable.Update',1);
  DrawingTable.Update;
  showkompasmessage(inttostr(text.Count) + '- кол-во TextLine После DrawingTable.Update',1);
end;

//Формат ячеек в другой процедуре
for a := 0 to Table.ColumnsCount - 1 do
begin
  CellFormat:= table.Cell[i+4,a] as ICellFormat;
  CellFormat.VFormat:= false;   
  CellFormat.HFormat:= 2;
end; 

У проблемы есть решение - сразу записывать текст в text.textline[0]. Так ко всему тексту "Примечание" применится форматирование, но если зачеркнуть текст, то на следующую строку он уже не перенесется, да и форматирование длинного текста перестает работать. Короче решение это имеет еще больше недостатков.

Также можно увеличить ширину колонки или длину текста, тогда проблема исчезнет. Но этот вариант не подходит, т.к. происходит такое не только с колонкой шириной 30мм и текстом "Примечание".

И тут встает вопрос, сталкивался ли кто-нибудь с таким и имеет ли данная проблема решение?

ScreenshotFormatText.png

2 сообщение.png

1 сообщение.png