|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Задать ширину ListBox по ширине самой длинной строки
Добрый день.
Имеется ListBox. Необходимо задать его ширину так, чтоб полностью влезала и была видна самая длинная его строка. Пробовал такой код (выполняется при добавлении строки, s - добавляемая строка): Код:
ln:=ListBox1.Canvas.TextWidth(s); if ln>ListBox1.ClientWidth {или просто Width} then ListBox1.Width:=ln; |
#2
|
||||
|
||||
Цитата:
Код:
ListBox1.ClientWidth:=ListBox1.Width+Length(ListBox1.Items.Strings[Индекс строки]); |
#3
|
||||
|
||||
добавь отступ +4:
Код:
var i: Integer; s: String; w: Integer; begin for i:=1 to 100 do begin s:=IntToStr(Random(MaxInt)); s:=s+IntToStr(Random(MaxInt)); s:='['+s+']'; ListBox1.Items.Add(s); w:=ListBox1.Canvas.TextWidth(s)+4; if w>ListBox1.ClientWidth then ListBox1.ClientWidth:=w; end; end; Пишу программы за еду. __________________ |
#4
|
||||
|
||||
Цитата:
Предлагаю такой вариант: Код:
begin ln := ListBox1.Canvas.TextWidth(s); if ln > ListBox1.ClientWidth then ListBox1.Width := ln + ListBox1.Width - ListBox1.ClientWidth; end; |
#5
|
||||
|
||||
3D бордюр окна не зависит от размера шрифта. но если очень напрягает то правильней естественно 2*GetSystemMetrics(SM_CYEDGE)
Пишу программы за еду. __________________ |
#6
|
||||
|
||||
Вот и не надо об этом молчать. Можете же, когда захотите.
|
#7
|
|||
|
|||
Большое спасибо откликнувшимся!
Я ширину бордюра пробовал учитывать, но у меня не пляшет не на 4 пикселя, а на все 4 символа. Кроме бордюра надо еще учитывать отступ текста от края слева и ширину скрола если он есть, так что способ Freeman универсальнее, за что ему отдельное спасибо (правда отступ слева по-моему даже так не учтен). Но проблему у меня даже "ListBox1.Width := ln + ListBox1.Width - ListBox1.ClientWidth;" не убирает и я разобрался почему - у меня в настройках семерки стоит отображение шрифтов 125% (или как оно там будет называться по русски) если поставить 100% то все будет идеально (кроме отступа слева ). Как учесть 125%? |
#8
|
||||
|
||||
Oreon, кнопка "Спасибо" там ------------->
Я за здоровый экстрим! Спасибо за "спасибо") |
#9
|
||||
|
||||
можно самому отрисовывать ячейки, чтобы избежать проблем с непонятным отступом.
проверил: на всех размерах шрифта ширина бордюра == 4 и код высчитывает правильно всегда. как у тебя работает? http://yadi.sk/d/n6Syi_oC7D3j8 Пишу программы за еду. __________________ |
#10
|
||||
|
||||
Цитата:
Кроме того, раньше в Delphi наблюдалось неверное масштабирование шрифтов, рассогласованное с размерами компонентов. Не помню точно, но вроде бы баг проявлялся именно тогда, когда разработка велась на машине с крупными шрифтами. Обойти его никак было нельзя, кроме как правкой Controls.pas, найденной эмпирически. Как с этим в модных версиях Delphi, не знаю. |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Oreon (26.07.2013)
|
#11
|
|||
|
|||
NumLock, в твоем варианте листбокс изначально имеет избыточную ширину:http://yadi.sk/d/QCXcF8lb7Dgjf, тогда как у меня задача наоборот - иметь ширину минимальную и ровнять ее по максимально длинной строке: http://yadi.sk/d/Frk30Vsz7DkUQ. Тут в верхнюю строку не влазит еще 7 символов, а вот как надо:http://yadi.sk/d/5IIeZK9R7Dm-G (добавил еще 36 пикселей)
Freeman Установка размеров корректируется при добавлении строк в листбокс (зависит от пользователя - че он делает ) Последний раз редактировалось Oreon, 25.07.2013 в 22:27. |
#12
|
||||
|
||||
Цитата:
|
#13
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Oreon (26.07.2013)
|
#14
|
|||
|
|||
Цитата:
|