Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.07.2013, 20:47
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию Задать ширину ListBox по ширине самой длинной строки

Добрый день.
Имеется ListBox. Необходимо задать его ширину так, чтоб полностью влезала и была видна самая длинная его строка. Пробовал такой код (выполняется при добавлении строки, s - добавляемая строка):
Код:
ln:=ListBox1.Canvas.TextWidth(s);
if ln>ListBox1.ClientWidth {или просто Width} then 
       ListBox1.Width:=ln;
не работает, текст все равно не влезает. Помогите решить задачку
Ответить с цитированием
  #2  
Старый 24.07.2013, 21:02
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Цитата:
Сообщение от Oreon
Добрый день.
Имеется ListBox. Необходимо задать его ширину так, чтоб полностью влезала и была видна самая длинная его строка. Пробовал такой код (выполняется при добавлении строки, s - добавляемая строка):
Код:
ln:=ListBox1.Canvas.TextWidth(s);
if ln>ListBox1.ClientWidth {или просто Width} then 
       ListBox1.Width:=ln;
не работает, текст все равно не влезает. Помогите решить задачку
Если строка очень длинная то текст все равно влезать не будет. попробуй так
Код:
ListBox1.ClientWidth:=ListBox1.Width+Length(ListBox1.Items.Strings[Индекс строки]);
Ответить с цитированием
  #3  
Старый 25.07.2013, 10:14
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

добавь отступ +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  
Старый 25.07.2013, 11:14
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от NumLock
добавь отступ +4:
Почему 4, почему не 8 или не 40? А если у меня крупные шрифты? А если у меня схема для слабовидящих? Программист в первую очередь должен заботиться о совместимости.

Предлагаю такой вариант:
Код:
begin
  ln := ListBox1.Canvas.TextWidth(s);
  if ln > ListBox1.ClientWidth then
    ListBox1.Width := ln + ListBox1.Width - ListBox1.ClientWidth;
end;
Надеюсь, не надо объяснять, что разница между Width и ClientWidth как раз и должна заключать в себя отступы. Другой способ -- получать отступы функциями API вроде GetSystemMetrics, но тут он мне кажется излишне сложным.
Ответить с цитированием
  #5  
Старый 25.07.2013, 13:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

3D бордюр окна не зависит от размера шрифта. но если очень напрягает то правильней естественно 2*GetSystemMetrics(SM_CYEDGE)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 25.07.2013, 14:36
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Вот и не надо об этом молчать. Можете же, когда захотите.
Ответить с цитированием
  #7  
Старый 25.07.2013, 16:09
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Большое спасибо откликнувшимся!
Я ширину бордюра пробовал учитывать, но у меня не пляшет не на 4 пикселя, а на все 4 символа. Кроме бордюра надо еще учитывать отступ текста от края слева и ширину скрола если он есть, так что способ Freeman универсальнее, за что ему отдельное спасибо (правда отступ слева по-моему даже так не учтен).
Но проблему у меня даже "ListBox1.Width := ln + ListBox1.Width - ListBox1.ClientWidth;" не убирает и я разобрался почему - у меня в настройках семерки стоит отображение шрифтов 125% (или как оно там будет называться по русски) если поставить 100% то все будет идеально (кроме отступа слева ). Как учесть 125%?
Ответить с цитированием
  #8  
Старый 25.07.2013, 16:15
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Oreon, кнопка "Спасибо" там ------------->
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #9  
Старый 25.07.2013, 17:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

можно самому отрисовывать ячейки, чтобы избежать проблем с непонятным отступом.

проверил: на всех размерах шрифта ширина бордюра == 4 и код высчитывает правильно всегда. как у тебя работает?
http://yadi.sk/d/n6Syi_oC7D3j8
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 25.07.2013, 19:29
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Oreon
Но проблему у меня даже "ListBox1.Width := ln + ListBox1.Width - ListBox1.ClientWidth;" не убирает и я разобрался почему - у меня в настройках семерки стоит отображение шрифтов 125%
Мне кажется, что тут все может зависеть от того, в какой момент выполняется установка размеров. Если не путаю, в OnCreate оконные элементы со своими Handle могут быть еще не созданы, и всё считается в пропорциях, записанных в DFM, которые могут отличаться от фактических.

Кроме того, раньше в Delphi наблюдалось неверное масштабирование шрифтов, рассогласованное с размерами компонентов. Не помню точно, но вроде бы баг проявлялся именно тогда, когда разработка велась на машине с крупными шрифтами. Обойти его никак было нельзя, кроме как правкой Controls.pas, найденной эмпирически. Как с этим в модных версиях Delphi, не знаю.
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Oreon (26.07.2013)
  #11  
Старый 25.07.2013, 22:22
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

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  
Старый 26.07.2013, 07:55
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Oreon
Установка размеров корректируется при добавлении строк в листбокс (зависит от пользователя - че он делает )
Хорошо, а как вычисляется самая длинная строка? Длинная по числу символов или длинная по TextWidth? Не нужно забывать, что экранный шрифт -- пропорциональный.
Ответить с цитированием
  #13  
Старый 26.07.2013, 10:30
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Oreon
NumLock, в твоем варианте листбокс изначально имеет избыточную ширину
ни в коем случае!!! на форме Edit находится неспроста. он указывает на первоначальную ширину ListBox'а. просто наиболее широкий элемент находится вне зоны отображения.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Oreon (26.07.2013)
  #14  
Старый 26.07.2013, 12:04
Oreon Oreon вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
ни в коем случае!!! на форме Edit находится неспроста. он указывает на первоначальную ширину ListBox'а. просто наиболее широкий элемент находится вне зоны отображения.
Я немного неправильно понял логику роботы твоей программы). Тогда всем спасибо, проблема решена. Она состояла в том, что если скомпилировать проект под настройку 100% то он нормально работает потом и на другой настройке, а если под 125% то нормально только на настройке 100% (у меня 7-ка. делфи 2010). Ну и код, конечно правильный нужно, он выше приводился...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter