Страницы: 1
RSS
Определить неизвестные свойства ListBox на форме
 
Добрый день коллеги, вернулся из отпуска с вопросами. На самом деле их несколько, ну не писать же на каждый вопрос свою тему? Тем более, что все вопросы касаются Listbox. Надеюсь модераторы пропустят.
Возникли следующие вопросы по стандартному Listbox.
1. Есть ли возможность определить макросом ширину столбцов Listbox?
2. Как отключить горизонтальный и вертикальный Scroll (линейку прокрутки) на ListBox.
3. Как определить высоту заполнения данными внутри Listbox. (т.е. видимая часть листа может быть заполнена на 1/3 по высоте. Так вот и надо определить вот это заполненное расстояние по высоте, независимо от всей высоты Listbox.
Не нашёл таких свойств. Или может не там искал?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
речь идет про ActiveX элемент, правильно понимаю?
1) .ColumnWidths содержит строку с шириной столбцов вида: "40 pt;30 pt"
3) определить высоту одной строки самостоятельно (либо зависимость ее высоты от размера шрифта), умножить ее на .ListCount и разделить полученное на .Height  
 
Забыл уточнить. Речь идёт про Listbox на Userform.
Цитата
DenSyo написал:
определить высоту одной строки самостоятельно (либо зависимость ее высоты от размера шрифта), умножить ее на .ListCount и разделить полученное на .Height
Это топорный метод, который не точный, если будет строк больше 1000, то по любому не подберёшь.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox написал:
Это топорный метод, который не точный, если будет строк больше 1000, то по любому не подберёшь
на самом деле можно добиться поразительной точности. тем более если вы готовы отобразить на своем экране 1000 строк. всего то и надо точно подогнать высоту объекта вровень с последней строкой. 10000 дадут еще более точный результат
 
Ну то-есть понятно, нет такого свойства кроме подбора.
На счёт первого вопроса я в курсе строки, интересовало есть ли возможность определить одним свойством ширину конкретного столбца. Просто не охото вычленять из строки эти цифры.
А скрол есть возможность убрать?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
стандартных методов нет, по крайней мере не знаю.  
 
Цитата
Просто не охото вычленять из строки эти цифры.
Код
ColiWidth = Val(Trim(Split(Listbox1.ColumnWidths, ";")(i-1)))
где:
i - интересующий номер столбца
Изменено: Ігор Гончаренко - 20.06.2018 13:41:48
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор, Спасибо. Таким образом и вычленял через SPLIT. Про другие вопросы можете направить в русло?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
вот так вообще хорошо будет
Код
ColiWidth = Val(Trim(Split(Replace(Listbox1.ColumnWidths, " pt",""), ";")(i-1)))
 
Alemox, как-то была тема по этому вопросу, ну и я уже забыл в чем там дело, но, именно, тогда я накатал такую функцию:
Проверено на размерах шрифтов = 6 - 14 (для моих проектов более, чем достаточно)...
Код
Function SetListBoxRowsCount(lst As Control, Optional ByVal rCount&, Optional rAuto As Boolean)
Dim d, hAdd!, r&, lHeight!, iHeight As Boolean
Static y!
On Error Resume Next
With lst
  If rCount > 0 Then
    If y Then
      If rAuto Then If rCount > .ListCount Then rCount = .ListCount
      .IntegralHeight = False: .Height = y * (rCount + 1): .IntegralHeight = True: DoEvents
      SetListBoxRowsCount = y: Exit Function
    End If
  Else
    lHeight = .Height: iHeight = .IntegralHeight
  End If
  r = 1
  Set d = CreateObject("Scripting.Dictionary")
  .IntegralHeight = False: .Height = lst.Font.Size * 0.75: .IntegralHeight = True: DoEvents
  hAdd = .Height + 1.5: y = .Height
  Do Until r >= 10
    .IntegralHeight = False: .Height = .Height + hAdd: .IntegralHeight = True: DoEvents
    y = Round((.Height - y) / 0.75): d(y) = d(y) + 1: If d(y) * 2 - 3 > d.Count Then Exit Do
    y = .Height: r = r + 1
  Loop
  y = y * 0.75: .IntegralHeight = False:
  If lHeight > 0 Then
    .Height = lHeight + y: .IntegralHeight = True: DoEvents: .IntegralHeight = iHeight
  Else
    .Height = y * (rCount + 1): .IntegralHeight = True: DoEvents
  End If
End With
SetListBoxRowsCount = y
End Function

Я ее не совершенствовал, ибо работает...
Возвращает высоту строки ListBox
lst - сам контрол
rCount - количество строк
rAuto - назначение высоты ListBoox по количеству строк или по rCount ( общему количеству строк)
ps
Это работает уже давно и сбоев не давало, но можно было бы переписать ее в более эффективной форме.
Просто суровая действительность не возникала, а желанию было некогда. :)
psps
Вот, нашел, но там еще не эта функция, но что б понять идею...
Изменено: AAF - 20.06.2018 11:59:21
 
AAF спасибо за код, вечером домой приду протестирую. А по линейке прокрутки имеются мысли?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, по горизонталке да, по вертикали смысла нет, поэтому идей нет (не искал вариантов).
ps
Да, уточню, этих неизвестных свойств нет :)
Изменено: AAF - 20.06.2018 12:13:01
 
DenSyo, Ігор Гончаренко, AAF, спасибо за помощь. Буду дальше допиливать.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
Страницы: 1
Наверх