![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день.
Имеется 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
|
|||
|
|||
|
Цитата:
|