Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Обсуждение Stimulsoft Reports.Net
Ответить
Denov
Сообщения: 22
Зарегистрирован: 27 сен 2011, 08:00

Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Сообщение Denov » 23 май 2019, 07:12

Здравствуйте!
Есть ли возможность средствами StimulReport узнать высоту StiText с многострочным текстом в коде в событии GetValue, чтобы в случае большого текста разделить этот текст на несколько частей по высоте?
Пробую как-то так:

Код: Выделить всё

public static double GetHeigth(StiText t, string text)
{
	StiComponent c = null;
	StiContainer s = new StiContainer();
	t.Text = text;
	t.Render(ref c, s);
	return c.Height;
}
Но этот способ не работает.

Так же пробую через MeasureString

Код: Выделить всё

public static string GetHeigth(StiText t, string text)
        {
            const double milimetresPerInch = 25.4;
            int w = Convert.ToInt32((t.Width * 10) / milimetresPerInch * StiReport.GlobalMeasureGraphics.DpiX);
            SizeF  f= StiReport.GlobalMeasureGraphics.MeasureString(
                text, t.Font, w);
            return (f.Height / StiReport.GlobalMeasureGraphics.DpiY * milimetresPerInch * 0.1).ToString();
            
        }
Но выдает приблизительное значение, но не точное.

Если у Вас в StimulReport специальные функции для определения высоты?
Denov
Сообщения: 22
Зарегистрирован: 27 сен 2011, 08:00

Re: Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Сообщение Denov » 23 май 2019, 07:24

Забыл добавить, что мне нужно определять высоту по словам в тексте, например текстовый блок 1 содержит 50 слов, текстовый блок 2 содержит 70 слов и оба блока имеют одинаковую высоту. В этом случае мне не поможет двойной проход отчета, т.к. высоту блоков надо выяснять складывая слова по очереди, т.е. 10 слов + 10 слов, определяем высоту, если она не подходит, то добавляем еще 10 слов ну и .т.д.
Denov
Сообщения: 22
Зарегистрирован: 27 сен 2011, 08:00

Re: Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Сообщение Denov » 24 май 2019, 04:01

Додумался до такого варианта:

Код: Выделить всё

        public static double GetHeigth(StiText t, string text)
        {
            using (StiReport r = new StiReport())
            {
                t.Text = text;
                r.Pages[0].Components.Add(t);
                r.Render(false);
                return r.RenderedPages[0].Components[0].GetActualSize().Height;
            }
        }
Но может у Вас есть что-то получше?
Denov
Сообщения: 22
Зарегистрирован: 27 сен 2011, 08:00

Re: Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Сообщение Denov » 27 май 2019, 14:18

Я так понял русскоязычный форум мертв... А на англоязычном я зарегиться не могу, пишет постоянно что я неправильно отвечаю на вопрос "Enter the last symbol from this string: "0+0":". Что надо вводить? 0 не получается, двоеточие - тоже. Что вводить не понятно. Пишет сообщение "You have provided an invalid answer to the question".
Ivan
Сообщения: 609
Зарегистрирован: 10 авг 2006, 01:40

Re: Узнать высоту StiText с многострочным текстом в коде в событии GetValue

Сообщение Ivan » 27 май 2019, 23:00

Здравствуйте.
Додумался до такого варианта:
Но может у Вас есть что-то получше?
Вы идёте в правильном направлении. Метод GetActualSize() рассчитывает реальные размеры компонента (если включены свойства CanGrow и CanShrink).
В событии GetValue размеры компонента можно получить например так:

Код: Выделить всё

StiText txt = sender as StiText;
txt.Text = e.Value;	//в e.Value приходит содержимое текстбокса, можно его заменить на ваше
txt.CanShrink = true;
txt.CanGrow = true;
SizeD size = txt.GetActualSize();
txt.CanShrink = false;	//если было выключено до этого
txt.CanGrow = false;		//если было выключено до этого
//в переменной size сейчас размеры копмонента 
возможно придётся заранее включить следующую опцию, чтобы размеры текстбокса не кэшировались:

Код: Выделить всё

StiOptions.Engine.AllowCacheForGetActualSize = false;
Спасибо.
Ответить