Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая высота Label, Имитировать AutoSize при word wrap'e 
:(
    Опции темы
Skiminok
Дата 9.5.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.4.2006
Где: Киев

Репутация: нет
Всего: нет



Здравствуйте. Есть такой вот вопрос. Лично мне он кажется ламерским донельзя, но выхода найти не могу...
Имеется Label. От него требуется следующее:
  • фиксированная ширина
  • перенос по словам
  • изменение высоты в зависимости от текста
Пункт 1 банален.
Пункт 2 достигается только установкой AutoSize в false.
А вот что теперь делать с пунктом 3, если нельзя ресайзить автоматически...
Пробовал следующее:
Код

using (System.Drawing.Graphics g = lblMainPage.CreateGraphics())
{
  lblMainPage.Height = (int)g.MeasureString(lblMainPage.Text, lblMainPage.Font, lblMainPage.Width).Height;
}

Ресайзит, но на перенос строк не реагирует. То есть, если в Label'e 3 строки, причем вторая из них превышает ширину label'a, то высота установится именно в 3 строки, вследствие чего строчку №3 увидеть будет невозможно.
Замена Graphics.MeasureString на TextRenderer.MeasureText не помогает.
Что делать, не представляю. Уже с ног сбился. Буду очень благодарен за помощь.
PM MAIL   Вверх
mr.DUDA
Дата 9.5.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Решается выставлением AutoSize=false, фиксированным размером по горизонтали и большим размером по вертикали (заведомо бОльшим чем размер Label). Сам текст будет автоматом переноситься на новую строку, а за счёт того что фон прозрачный - будет впечатление что это вертикальный размер растёт автоматически.


--------------------
user posted image
PM MAIL WWW   Вверх
Skiminok
Дата 9.5.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.4.2006
Где: Киев

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  9.5.2008,  19:57 Найти цитируемый пост)
Решается выставлением AutoSize=false, фиксированным размером по горизонтали и большим размером по вертикали (заведомо бОльшим чем размер Label). Сам текст будет автоматом переноситься на новую строку, а за счёт того что фон прозрачный - будет впечатление что это вертикальный размер растёт автоматически.
Это очевидный способsmile Только я никогда не знаю размер текста, который будет отображаться на Label'e - он определяется в run-time. Да и контролы внизу не хотелось бы перекрывать...
Наверняка же существует не читерское решение smile
PM MAIL   Вверх
mr.DUDA
Дата 9.5.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Skiminok, так по-любому контролы будут перекрыты в худшем случае (если высота текста слишком велика), не так ли? А фон у лейбла прозрачный, в чём проблема?


--------------------
user posted image
PM MAIL WWW   Вверх
Skiminok
Дата 14.5.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.4.2006
Где: Киев

Репутация: нет
Всего: нет



Проблема в том, что я в проге выстраиваю в столбик серию компонентов на форме в run-time.
И для того чтобы поместить новый компонент в правильное место, мне нужно знать точные координаты, где заканчивается "осмысленная", а не "техническая" часть верхнего.
(попытался объяснить на пальцах, неформальноsmile)
PM MAIL   Вверх
sawtooth
Дата 3.8.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Столкнулся с аналогичной проблемой. Решение нашлось. Возможно, ещё пригодится:
Код

Label label1 = new Label();
label1.Text = "текст";
label1.Width = статическая_ширина;
label1.Height = label1.GetPreferredSize(new Size(label1.Width,0)).Height;

PM MAIL   Вверх
boojum
Дата 29.2.2012, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Цитата(Skiminok @ 9.5.2008,  18:17)
Здравствуйте. Есть такой вот вопрос. Лично мне он кажется ламерским донельзя, но выхода найти не могу...
Имеется Label. От него требуется следующее:

  • фиксированная ширина
  • перенос по словам
  • изменение высоты в зависимости от текста
Пункт 1 банален.
Пункт 2 достигается только установкой AutoSize в false.
А вот что теперь делать с пунктом 3, если нельзя ресайзить автоматически...

Проблемы начались с того, что вы посчитали пункт 1  банальным:)
Т.е. с ходу решили ставить AutoSize:=false; WordWrap:=true;
А ведь можно было бы немного подумать и тогда....

(На net  не пишу, но в дельфе то же самое, так что сообразите, кому нужно).

Код

//Фиксируем ширину лейбла
Label1.Constraints.MaxWidth:=YourWidth;
Label1.Constraints.MinWidth:=YourWidth;

//А теперь автосайзим сколько угодно
Label1.AutoSize:=TRUE;
Label1.WordWrap:=true;


Ширина будет оставаться фиксированной (а куда ей деваться?), высота будет меняться при переносе по словам.

Более того, если сам лейбл автосайзить не можете (например, у него Align=alClient), а в рантайме хотите менять размеры его родителя (Parent), скажем, панели на которой он лежит, то нетрудно посчитать высоту текста с помощью невидимого лейбла(точнее, вообще безхозного лейбла, точнее лейбла-сироты (Parent=nil)):

Код

function TFrame1.CalcLblHeight(_lbl: TLabel): Integer;
begin
  Result :=0;
  if not Assigned(_lbl) then Exit;
  fLbl.Font:=_lbl.Font;
  fLbl.Constraints.MaxWidth:=_lbl.Width;
  fLbl.Constraints.MinWidth:=_lbl.Width;
  fLbl.Caption:=_Lbl.Caption;
  Result:=fLbl.Height;
end;



Параметр _lbl - лейбл высоту текста которого хотите измерить, при существующей у него ширине и шрифте.
fLbl - экземпляр TLabel, который создается и уничтожается соответственно в конструкторе и деструкторе Вашей формы/фрейма/класса или при инизализации/финализации модуля:

Код

constructor TFrame1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  //Parent остается nil - таким образом, высота даже теоретически не может быть ограничена размерами родителя (как будет в случае использования для измерения паразитного невидимого лейбла на форме )
  if not Assigned(fLbl) then fLbl := TLabel.Create(nil);
  fLbl.AutoSize:=true;
  fLbl.WordWrap:=true;
end;

destructor TFrame1.Destroy;
begin
  if Assigned(fLbl) then FreeAndNil(fLbl);
  inherited Destroy;
end;



Ну и естественно, fLbl нужно объявить как TLabel. Скажем, в private секции TFrame1.

ПРЕДУПРЕЖДЕНИЕ: все отлично работает до тех пор, пока ширина слов текста меньше или равна ширине лейбла. Если она больше - поведение лейбла  вообще странно-непонятное, разное, но палюбому неадекватное.  Поэтому о переносе или разрыве слишком длинных слов нужно заботиться отдельно

 
 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.